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

轉載於:http://fengqing888.blog.163.com/blog/static/3301141620100623933512/html

1.冒號(:)用法

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

typedef struct _XXX{

unsigned char a:4;

unsigned char c;

} ; XXX

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

struct _XXX{

_XXX() : y(0xc0) {}

};

(3) public:和private:後面的冒號,表示後面定義的全部成員都是公有或私有的,直到下一個"public:」或"private:」出現爲止。"private:"爲默認處理。code

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

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

{

派生類的成員

};

繼承方式:public、private和protected,默認處理是public。

2.雙冒號(::)用法

(1)表示「域操做符」
例:聲明瞭一個類A,類A裏聲明瞭一個成員函數void f(),但沒有在類的聲明裏給出f的定義,那麼在類外定義f時,
就要寫成void A::f(),表示這個f()函數是類A的成員函數。blog

(2)直接用在全局函數前,表示是全局函數
例:在VC裏,你能夠在調用API 函數裏,在API函數名前加::繼承

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

例:System::Math::Sqrt() 至關於System.Math.Sqrt()
——————————————————————————————————————get

VC中以下it

::是C++裏的「做用域分解運算符」。好比聲明瞭一個類A,類A裏聲明瞭一個成員函數voidf(),但沒有在類的聲明裏給出f的定義,那麼在類外定義f時,就要寫成voidA::f(),表示這個f()函數是類A的成員函數。
  :: 通常還有一種用法,就是直接用在全局函數前,表示是全局函數。當類的成員函數跟類外的一個全局函數同名時,考試,大提示在類內定義的時候,打此函數名默認調用的是自己的成員函數;若是要調用同名的全局函數時,就必須打上::以示區別。好比在VC裏,你能夠在調用API函數時,在API函數名前加::。(編輯:)


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

一、位域定義

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

二、類構造函數(Constructor)的初始化列表

先說下什麼叫構造函數吧(是否是囉嗦了?C++的人應該都知道了吧,仍是以防萬一一下)。所謂構造函數,就是與類同名的函數,它與普通函數的區別在於,它沒有返回類型。
在構造函數後面緊跟着冒號加初始化列表,各初始化變量之間以逗號(,)隔開。下面舉個例子。

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)對於繼承的類來講,在初始化列表中也能夠進行基類的初始化,初始化的順序是先基類初始化,而後再根據該類本身的變量的聲明順序進行初始化。

三、聲明基類。

假設咱們從新定義一個類,繼承自myClass類。定義方式以下:

class derivedClass : public myClass
{
// 略去
}

這裏的冒號起到的就是聲名基類的做用,在基類類名前面能夠加public/private/protected等標籤,用於標識繼承的類型,也能夠省略,省略的話,用class定義的類默認爲private,用struct定義的類默認爲public,至於具體各個標籤有什麼區別這裏就不說了。
與初始化列表同樣的,這裏也能夠聲名多個基類,各基類之間用逗號(,)隔開。

四、條件語句(? :)

與?構成條件語句,做用至關於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

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

五、語句標籤
一般跟goto配合使用,如:
step1: a = f1();
....
goto step1;
這種做法也不是很推薦,緣由在於它破壞了語句的順序執行,這樣的代價你們應該清楚吧。不過存在即爲合理嘛,既然它還存在,確定仍是有它的用處有它的好處的,好比說,多層嵌套的退出(會比break continue直觀一點吧),也能夠避免重複代碼之類之類的

六、switch語句中case後。
這個不說了,要是不會的話,我也沒話可說了。

七、彙編指令模板
這個我也不懂,不班門弄斧了,能夠參考一下:http://developer.e800.com.cn/articles/2006/43/1144846933898_1.html
改天學習一下。

一、 做用域符號::的前面通常是類名稱,後面通常是該類的成員名稱,C++爲例避免不一樣的類有名稱相同的成員而採用做用域的方式進行區分
如:A,B表示兩個類,在A,B中都有成員member。那麼
A::member就表示類A中的成員member
B::member就表示類B中的成員member

二、 全局做用域符號:當全局變量在局部函數中與其中某個變量重名,那麼就能夠用::來區分如:

char zhou; //全局變量 

void sleep() 

{ 

char zhou; //局部變量 

char(局部變量) = char(局部變量) *char(局部變量) ; 

::char(全局變量) =::char(全局變量) *char(局部變量); 

}

三、
::是C++裏的「做用域分解運算符」。好比聲明瞭一個類A,類A裏聲明瞭一個成員函數voidf(),但沒有在類的聲明裏給出f的定義,那麼在類外定義f時,就要寫成voidA::f(),表示這個f()函數是類A的成員函數。例如

[cpp] view plaincopy
01  class CA {    
02  public:    
03    int ca_var;    
04    int add(int a, int b);    
05    int add(int a);    
06  };   
07      
08  //那麼在實現這個函數時,必須這樣書寫:    
09  int CA::add(int a, int b)    
10  {    
11    return a + b;    
12  }    
13      
14  //另外,雙冒號也經常用於在類變量內部做爲當前類實例的元素進行表示,好比:    
15  int CA::add(int a)    
16  {    
17    return a + ::ca_var;    
18  }   
19      
20  //表示當前類實例中的變量ca_var。  
更多 0
相關文章
相關標籤/搜索