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


1、冒號(:)的用法

(1)表示機構內位域的定義(即該變量占幾個bit空間)

typedef struct _XXX{

unsigned char a:4;

unsigned char c;

} ; XXX

(2)構造函數后面的冒號起分割作用,是類給成員變量賦值的方法,初始化列表,更適用於成員變量的常量const型。

所謂構造函數,就是與類同名的函數,它與普通函數的區別在於,它沒有返回類型在構造函數后面緊跟着冒號加初始化列表,各初始化變量之間以逗號(,)隔開。例如:
class myClass
{
public :
myClass();// 構造函數,無返回類型,可以有參數列表,這里省去
~myClass();// 析構函數
int a;
const int b;
}

myClass::myClass():a(1),b(1)// 初始化列表
{
}
上面的例子展示了冒號的這個用法,下面對這個用法進行幾點說明:
1)初始化列表的作用相當於在構造函數內進行相應成員變量的賦值,但兩者是有差別的。
在初始化列表中是對變量進行初始化,而在構造函數內是進行賦值操作。兩都的差別在對於像const類型數據的操作上表現得尤為明顯。我們知道,const 類型的變量必須在定義時進行初始化,而不能對const型的變量進行賦值,因此const類型的成員變量只能(而且必須)在初始化列表中進行初始化,即下 面的代碼將會出錯:
myClass::myClass()
{
a = 1;// 沒錯,效果相當於在初始化列表中進行初始化
b = 1;// 出錯,const變量不能進行賦值操作;
}
2)初始化的順序與成員變量聲名的順序相同。
先看一下下面的程序:
myClass::myClass():b(1),a(b)
{
}
這樣的執行結果a,b各是多少呢?b=1,a=1?不是,b=1而a是個隨機數。這一點是相當重要,一般在初始化列表中進行初始化時,初始化的順序應與聲明的順序保持一致,防止出現不必要的錯誤。

(3) public:和private:后面的冒號,表示后面定義的所有成員都是公有或私有的,直到下一個"public:”或"private:”出現為止。"private:"為默認處理。

(4)類名冒號后面的是用來定義類的繼承。

class 派生類名 : 繼承方式 基類名

{

派生類的成員

};

這里的冒號起到的就是聲名基類的作用,在基類類名前面可以加public/private/protected等標簽,用於標識繼承的類型,也可以省略, 省略的話,用class定義的類默認為private,用struct定義的類默認為public。
與初始化列表一樣的,這里也可以聲名多個基類,各基類之間用逗號(,)隔開。

(5)條件語句(? :)
與?構成條件語句,作用相當於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;// 出錯,<<比>具有更高的優先級,執行順序為 ((cout<<i)>j)?i:j,相當於是比較cout<<i與j的大小,然后根據比較結果決定表達式值為i或j,這 顯然要出錯的,cout<<i的值是cout,不能跟整型數j進行比較。
cout << (i>j)?i:j;//輸出1或0,相當於(cout<<(i>j))作為判決條件,來決定表達式的值為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

(6)、語句標簽
通常跟goto配合使用,如:
step1: a = f1();
....
goto step1;
這種作法也不是很推薦,原因在於它破壞了語句的順序執行,這樣的代價大家應該清楚吧。不過存在即為合理嘛,既然它還存在,肯定還是有它的用處有它的好處的,比如說,多層嵌套的退出(會比break continue直觀一點吧),也可以避免重復代碼之類之類的

(7)、switch語句中case后。

 

2.雙冒號(::)用法

(1)表示“域操作符”
例:聲明了一個類A,類A里聲明了一個成員函數void f(),但沒有在類的聲明里給出f的定義,那么在類外定義f時,
就要寫成void A::f(),表示這個f()函數是類A的成員函數。

(2)直接用在全局函數前,表示是全局函數
例:在VC里,你可以在調用API 函數前,在API函數名前加::

(3)表示引用成員函數及變量,作用域成員運算符

例:System::Math::Sqrt() 相當於System.Math.Sqrt()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM