c++ 中. 和 ->,波浪號 ~ 符號怎么用


1、  用在類中的析構函數之前,表示該函數是析構函數。如類A的析構函數

  class A

  {

    //...  ~A(){}//析構函數

   };

2、  用於數字或者整形變量之前,表示對該數取反操作,其規則是~0=1, ~1=0, 如二進制0101 0101取反后就是1010 1010

C++之類的析構函數

簡單說說類的析構函數,它是類的一個成員函數,名字由波浪號加類名構成。看它的名字我們大概就能聯想到他功能,是執行與構造函數相反的操作:釋放對象使用的資源,並銷毀非static成員。

同樣的,我們來看看析構函數的幾個特點:  

1.函數名是在類名前加上~,無參數且無返回值。

2.一個類只能有且有一個析構函數,如果沒有顯式的定義,系統會生成一個缺省的析構函數(合成析構函數)。

3.析構函數不能重載。每有一次構造函數的調用就會有一次析構函數的調用。

c++中 . 和 -> 的區別是什么?

主要用於訪問類的成員,->主要用於類類型的指針訪問類的成員,而. 運算符,主要用於類類型的對象訪問類的成員。

舉例

class A
{public :int a}
A ma;
A *p=&ma;

那么指針p應使用->來訪問成員a,比如p->a,而ma應使用.來訪問,比如ma.a區別就在這里,凡是指針就使用->,對象就使用.運算符。

c++中||和&&是什么意思?
||是邏輯或 只要有一個為真 即為真值;&&是邏輯與只要有一個不為真就不是真值;

如果你學過pascal ||or && and

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

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

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:"為默認處理。 

(4)類名冒號后面的是用來定義類的繼承。  class 派生類名 : 繼承方式 基類名  {  派生類的成員  };  繼承方式:public、private和protected,默認處理是public。 

2.雙冒號(::)用法 

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

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

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

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

 

VC中如下 

::是C++里的“作用域分解運算符”。比如聲明了一個類A,類A里聲明了一個成員函數voidf(),但沒有在類的聲明里給出f的定義,那么在類外定義f時,就要寫成voidA::f(),表示這個f()函數是類A的成員函數。   

:: 一般還有一種用法,就是直接用在全局函數前,表示是全局函數。當類的成員函數跟類外的一個全局函數同名時,考試,大提示在類內定義的時候,打此函數名默認調用的是本身的成員函數;如果要調用同名的全局函數時,就必須打上::以示區別。比如在VC里,你可以在調用API函數時,在API函數名前加::。(編輯:)         

 

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

1、位域定義 這個在前面關於位結構體的文章里說得夠多的了,不再重復了。 

2、類構造函數(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)對於繼承的類來說,在初始化列表中也可以進行基類的初始化,初始化的順序是先基類初始化,然后再根據該類自己的變量的聲明順序進行初始化。

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;// 出錯,<<比>具有更高的優先級,執行順序為 ((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 更多的關於優先級的問題就不說了。 

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

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

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

 

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 { 

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。


免責聲明!

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



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