c 中冒號( )和雙冒號( )的用法

2021-08-29 18:21:18 字數 2985 閱讀 1216

這篇文章將總結c/c++中的冒號的用法。

1、位域定義

這個在前面關於位結構體的文章裡說得夠多的了,不再重複了。

2、類建構函式(constructor)的初始化列表

先說下什麼叫建構函式吧(是不是囉嗦了?c++的人應該都知道了吧,還是以防萬一一下)。所謂建構函式,就是與類同名的函式,它與普通函式的區別在於,它沒有返回型別。

在建構函式後面緊跟著冒號加初始化列表,各初始化變數之間以逗號(,)隔開。下面舉個例子。

class myclass

myclass::myclass():a(1),b(1)// 初始化列表

上面的例子展示了冒號的這個用法,下面對這個用法進行幾點說明:

1)初始化列表的作用相當於在建構函式內進行相應成員變數的賦值,但兩者是有差別的。

在初始化列表中是對變數進行初始化,而在建構函式內是進行賦值操作。兩都的差別在對於像const型別資料的操作上表現得尤為明顯。我們知道,const型別的變數必須在定義時進行初始化,而不能對const型的變數進行賦值,因此const型別的成員變數只能(而且必須)在初始化列表中進行初始化,即下面的**將會出錯:

myclass::myclass()

2)初始化的順序與成員變數聲名的順序相同。

先看一下下面的程式:

myclass::myclass():b(1),a(b)

這樣的執行結果a,b各是多少呢?b=1,a=1?不是,b=1而a是個隨機數。這一點是相當重要的哦,一般在初始化列表中進行初始化時,初始化的順序應與宣告的順序保持一致,防止出現不必要的錯誤。

3)對於繼承的類來說,在初始化列表中也可以進行基類的初始化,初始化的順序是先基類初始化,然後再根據該類自己的變數的宣告順序進行初始化。

3、宣告基類。

假設我們重新定義乙個類,繼承自myclass類。定義方式如下:

class derivedclass : public myclass

這裡的冒號起到的就是聲名基類的作用,在基類類名前面可以加public/private/protected等標籤,用於標識繼承的型別,也可以省略,省略的話,用class定義的類預設為private,用struct定義的類預設為public,至於具體各個標籤有什麼區別這裡就不說了。

與初始化列表一樣的,這裡也可以聲名多個基類,各基類之間用逗號(,)隔開。

4、條件語句(? :)

與?構成條件語句,作用相當於if else,如下;

int a,b,c;

a=3;

b=2;

c=a>b?a:b;// 如果a>b成立,則反a賦給c,否則把b賦給c

條件語句的結構為:

條件表示式?表示式1:表示式2

當條件表示式為true時,表示式的值為表示式1的值,否則為表示式2的值。

幾點說明:

1)?:可以巢狀,但不推薦使用(難懂),下面的表示式你能看懂啥意思不?

int max = i>j ? i>k ? i : k : j>k ? j : k;

腦袋大了吧,呵呵。

2)?:具有很低的優先順序,這個要注意哦,下面的程式執行結果是啥呢?

int i = 3;

int j = 2;

cout << i>j?i:j;// 出錯,《比》具有更高的優先順序,執行順序為 ((coutj))作為判決條件,來決定表示式的值為i或j,而cout<<(i>j),i>j則輸出1否則0,然後再將(cout<<(i>j))作為?:的條件,如果cout正確執行則為1(true),否則為0(false),以此決定表示式值為i或j

cout <<(i>j?i:j);//i>j則輸出i,否則輸出j,表示式值為true如果cout正確執行,否則為false

更多的關於優先順序的問題就不說了。

5、語句標籤

通常跟goto配合使用,如:

step1: a = f1();

....

goto step1;

這種作法也不是很推薦,原因在於它破壞了語句的順序執行,這樣的代價大家應該清楚吧。不過存在即為合理嘛,既然它還存在,肯定還是有它的用處有它的好處的,比如說,多層巢狀的退出(會比break continue直觀一點吧),也可以避免重複**之類之類的

6、switch語句中case後。

這個不說了,要是不會的話,我也沒話可說了。

7、彙編指令模板

這個我也不懂,不班門弄斧了,可以參考一下:

改天學習一下。

1、 作用域符號::的前面一般是類名稱,後面一般是該類的成員名稱,c++為例避免不同的類有名稱相同的成員而採用作用域的方式進行區分

如:a,b表示兩個類,在a,b中都有成員member。那麼

a::member就表示類a中的成員member

b::member就表示類b中的成員member 

2、 全域性作用域符號:當全域性變數在區域性函式中與其中某個變數重名,那麼就可以用::來區分如: 

char zhou; //全域性變數 

void sleep() 

{ char zhou; //區域性變數 

char(區域性變數) = char(區域性變數) *char(區域性變數) ; 

::char(全域性變數) =::char(全域性變數) *char(區域性變數); 

} 3、 

::是c++裡的「作用域分解運算子」。比如宣告了乙個類a,類a裡宣告了乙個成員函式voidf(),但沒有在類的宣告裡給出f的定義,那麼在類外定義f時,就要寫成voida::f(),表示這個f()函式是類a的成員函式。例如

01    class ca ; 

07      

08    //那麼在實現這個函式時,必須這樣書寫:  

09    int ca::add(int a, int b)  

10      

13      

14    //另外,雙冒號也常常用於在類變數內部作為當前類例項的元素進行表示,比如:  

15    int ca::add(int a)  

16     

19      

20    //表示當前類例項中的變數ca_var。

c 中冒號( )和雙冒號( )的用法

1.冒號 用法 1 表示機構內位域的定義 即該變數佔幾個bit空間 typedef struct 2 建構函式後面的冒號起分割作用,是類給成員變數賦值的方法,初始化列表,更適用於成員變數的常量const型。struct 3 public 和private 後面的冒號,表示後面定義的所有成員都是公有或...

c 中冒號( )和雙冒號( )的用法

1.冒號 用法 1 表示機構內位域的定義 即該變數佔幾個bit空間 typedef struct 2 建構函式後面的冒號起分割作用,是類給成員變數賦值的方法,初始化列表,更適用於成員變數的常量const型。st 1.冒號 用法 1 表示機構內位域的定義 即該變數佔幾個bit空間 typedef st...

c 中冒號( )和雙冒號( )的用法

1 表示機構內位域的定義 即該變數佔幾個bit空間 typedef struct 2 建構函式後面的冒號起分割作用,是類給成員變數賦值的方法,初始化列表,更適用於成員變數的常量const型。struct 3 public 和private 後面的冒號,表示後面定義的所有成員都是公有或私有的,直到下乙...