C 中Copy Constructor的構造操作

2021-08-07 17:06:01 字數 1470 閱讀 2994

class x;

x x;

第一種: x xx = x;

第二種:值傳遞給函式  void test(x x);

第三種:作為函式返回型別  x test();

當class object以相同class的另乙個object作為初值時,其內部是以default memberwise intialization(預設成員逐次初始化)的形式完成的:其實質就是把每乙個內建的或者派生的data member的值,從某個object拷貝到另乙個object上。遇到member class object,以遞迴的方式繼續施行memberwise initalization

被copy constructor實現的

和預設構造一樣,c++標準中說,如何class沒有宣告乙個copy construtor,就會有隱式的宣告或隱式定義。而c++標準把拷貝構造又分為trival 和nontrival。只有nontrival的例項才會被合成到程式中。決定乙個拷貝構造是否為trivial的標準中在於class是否展現bitwise copy semantics(位依次拷貝)。展現位依次拷貝的就不需要合成預設拷貝構造了

5.class不展現出「bitwise copy semantics」的情況(也就是在沒有顯式定義拷貝構造的情況下,編譯器為我們合成預設拷貝構造的情況)

1.當class內含乙個member object而後者的class宣告有乙個copy constructor(此拷貝構造合成的也算)時

2.當class繼承自乙個base class而後者存在乙個copy constructor

3. 當class宣告了乙個或多個虛函式時

4.當class派生自乙個繼承串鏈,其中有乙個或者多個virtual base classes時。

當編譯器匯入乙個vptr到class中,該class就不再展現bitwise semantics了。

class zooanimal

zooanimal();

virtual ~zooanimal();

virtual void animate();

virtual void draw();

private:

//zooanimal的animate()和draw()

//所需要的資料

class bear : public zooanimal

public:

bear();

void animate();

void draw();

virtual void dance();

private:

//所需要的資料

bear yogi;   yogi會被bear類預設建構函式初始化,其vptr會被設定為指向bear class的virtual table

bear winnie = yogi;

zooanimal franny = yogi;   //會發生切割行為franny的vptr會指向zooanimal class的虛表

C中extern和C 中的export

為了訪問其他編譯單元 如另一 檔案 中的變數或物件,對普通型別 包括基本資料類 結構和類 可以利用關鍵字extern,來使用這些變數或物件時 但是對模板型別,則必須在定義這些模板類物件和模板函式時,使用標準c 新增加的關鍵字export 匯出 出口 輸出 例如 extern int n extern...

C中相容C 操作

在c 中加入c 風格的 在編譯的時候,報錯的是必然的.因為不相容.例如,在c中加入c 的namespace namespace cv get window image rectangle coordinates,width and height cvapi cv rect cvgetwindowim...

C中呼叫C 函式

將 c 函式宣告為 extern c 在你的 c 裡做這個宣告 然後呼叫它 在你的 c 或者 c 裡呼叫 例如 c code extern c void f int void f int i 然後,你可以這樣使用 f c code void f int void cc int i f i 當然,這招...