c++學習筆記
1、explicit關鍵字的用法:
c++ explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有"顯式"那麼必然就有"隱式",那麼什麼是顯示而什麼又是隱式的呢?
如果c++類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作:將該建構函式對應資料型別的資料轉換為該類物件,如下面所示:
class myclass在上面的**中編譯器自動將整型轉換為myclass類物件,實際上等同於下面的操作://.
myclass
obj=
10; //ok,convert int to myclass
myclass temp(10);上面的所有的c++ explicit關鍵字相關的操作即是所謂的"隱式轉換"。myclass
obj=
temp
;
如果要避免這種自動轉換的功能,我們該怎麼做呢?嘿嘿這就是關鍵字explicit的作用了,將類的建構函式宣告為"顯式",也就是在宣告建構函式的時候前面新增上explicit即可,這樣就可以防止這種自動的轉換操作,如果我們修改上面的myclass類的建構函式為顯式的,那麼下面的**就不能夠編譯通過了,如下所示:
class myclass總結:通過使用explicit關鍵字來標記建構函式,可以禁止這個類的隱式轉換,而且explicit關鍵字只能放在類定義中,而且只適用於僅有乙個引數的建構函式。//.
myclass
obj=
10; //err,can't non-explict convert
2、mutable關鍵字的用法:
mutalbe的中文意思是「可變的,易變的」,跟constant(既c++中的const)是反義詞。
在c++中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中。
我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一般會宣告成const的。但是,有些時候,我們需要在const的函式裡面修改一些跟類狀態無關的資料成員,那麼這個資料成員就應該被mutalbe來修飾。
下面是乙個小例子:
class clxtest
;void clxtest::output() const
void outputtest(const clxtest& lx)
類clxtest的成員函式output是用來輸出的,不會修改類的狀態,所以被宣告為const的。
函式outputtest也是用來輸出的,裡面呼叫了物件lx的output輸出方法,為了防止在函式中呼叫其他成員函式修改任何成員變數,所以引數也被const修飾。
如果現在,我們要增添乙個功能:計算每個物件的輸出次數。如果用來計數的變數是普通的變數的話,那麼在const成員函式output裡面是不能修改該變數的值的;而該變數跟物件的狀態無關,所以應該為了修改該變數而去掉output的const屬性。這個時候,就該我們的mutable出場了——只要用mutalbe來修飾這個變數,所有問題就迎刃而解了。
下面是修改過的**:
class clxtest
;clxtest::clxtest()
clxtest::~clxtest()
{}void clxtest::output() const
int clxtest::getoutputtimes() const
void outputtest(const clxtest& lx)
計數器m_itimes被mutable修飾,那麼它就可以突破const的限制,在被const修飾的函式裡面也能被修改。
3、超類方法有預設引數:
子類和超類都可以有不同的預設引數,但是使用的引數依賴於變數的宣告型別,而不是底層的物件,例子如下:
class a
};class b : public a
};int main()
輸出結果為:
原因分析:c++把預設引數與指示物件的變數型別繫結在一起,而不是與物件本身繫結,也是由於這個原因,在c++中,不能繼承預設引數,如果一定要有預設的話,父類和子類的預設引數必須是一樣的,這樣才不會出現問題
C 學習筆記( )
一 語法 迴圈 foreach 型別識別符號 in 表示式 code 用法 例子int temp foreach int num in temp 每次從temp取乙個元素賦給num直至取完 console.writeline n num 每行顯示乙個元素 執行結果 c 中唯讀 只寫控制 class ...
C 學習筆記
1.函式特徵 有函式頭和函式體 接受乙個引數 返回乙個值 需要乙個原型。2.c 命名規則 在名稱中只能使用字母字元 數字和下劃線 名稱的第乙個字元不能是數字 區分大寫字母和小寫字母 不能將c 關鍵字用作名稱 以兩個下劃線或下劃線和大寫字母打頭的名稱被保留給實現 編譯器及其使用的資源 使用,以乙個下劃...
c 學習筆記
屬性 屬性開頭字母大寫 屬性可以判斷輸入的非法值 屬性本身不儲存值 依靠字段 索引器 using system using system.collections.generic using system.linq using system.text namespace b try catch exc...