#includeusing namespace std;
class myclass
myclass(const myclass &x)
myclass &operator=(const myclass &x)
~myclass()
};int main()
執行時的輸出結果是(122444)
c myclass obj3 = obj1;
obj3還不存在,所以呼叫拷貝建構函式輸出
2
,
如果obj3存在,obj3=obj,則呼叫複製運算子過載函式,輸出
3
「=」會隱式呼叫拷貝建構函式。使用explicit才能避免隱式呼叫。
c++中, 乙個引數的建構函式(或者除了第乙個引數外其餘引數都有預設值的多參建構函式), 承擔了兩個角色。 1 是個構造器 ,2 是個預設且隱含的型別轉換操作符。
所以, 有時候在我們寫下如 aaa = ***, 這樣的**, 且恰好***的型別正好是aaa單引數構造器的引數型別, 這時候編譯器就自動呼叫這個構造器, 建立乙個aaa的物件。
這樣看起來好象很酷, 很方便。 但在某些情況下(見下面權威的例子), 卻違背了我們(程式設計師)的本意。 這時候就要在這個構造器前面加上explicit修飾, 指定這個構造器只能被明確的呼叫/使用, 不能作為型別轉換操作符被隱含的使用。
explicit建構函式的作用
解析:explicit建構函式是用來防止隱式轉換的。請看下面的**:
class test1
//普通建構函式
private:
int num;
};class test2
//explicit(顯式)建構函式
private:
int num;
};int main()
test1的建構函式帶乙個int型的引數,**23行會隱式轉換成呼叫test1的這個建構函式。而test2的建構函式被宣告為explicit(顯式),這表示不能通過隱式轉換來呼叫這個建構函式,因此**24行會出現編譯錯誤。
普通建構函式能夠被隱式呼叫。而explicit建構函式只能被顯式呼叫。
帶預設值引數的建構函式和無引數的建構函式不能共存,會有編譯錯誤。
只要你自己寫出了帶參的建構函式,那麼,那個原本可以由編譯器自動建立的無參建構函式(預設建構函式)就永遠的消失了。
顯示呼叫和隱式呼叫
使用類名呼叫時顯式呼叫。c 中,顯式介面只能使用介面呼叫,隱式介面使用類和介面呼叫皆可。c 首先動態庫分為顯示呼叫和隱式呼叫,這個的區別呢,顯示呼叫 需要loadlibray和freelibrary,隱式呼叫不需要loadlibrary和freelibrary,只是需要匯入相關的lib檔案,因此,如...
java 隱式呼叫和顯示呼叫
當我們在呼叫類的構造器來建立物件的時候,首先要呼叫的是父類的非靜態的初始化塊,接著會呼叫構造器,但是父類的構造器可能有多個,也就是過載,當呼叫完父類的非靜態初始化塊之後,將會呼叫的是當前類的非靜態初始化塊然後是自身的建構函式,呼叫父類的建構函式就有兩種呼叫的方式,乙個是顯示呼叫,另乙個是隱式呼叫,下...
dll顯示呼叫和隱式呼叫
pragma once 避免重複編譯 ifdef creatdll exports 這個巨集只要你選了專案配置型別為.dll,在預處理器裡會自動包含.define dll api declspec dllexport else define dll api declspec dllimport 當編...