C 物件模型學習筆記五 拷貝建構函式語義

2021-10-06 07:50:21 字數 1113 閱讀 2218

測試驗證編譯器在什麼情況下會幫助我們合成出拷貝建構函式,及編譯器合成出來的拷貝建構函式又要幹什麼事情?

拷貝建構函式語義

在下面情況下,如果我們不寫自己的拷貝建構函式,編譯器就會幫助我們合成出拷貝建構函式來。

(1)、如果乙個類t沒有拷貝建構函式,但是含有乙個類型別ctb的成員變數m_ctb。該型別ctb含有拷貝建構函式,那麼當**中有涉及到類t的拷貝構造時,編譯器就會為類t合成乙個拷貝建構函式。

(2)、如果乙個類ctbson沒有拷貝建構函式,但是它有乙個父類ctb,父類有拷貝建構函式,當**中有涉及到類ctbson的拷貝構造時,編譯器會為ctbson合成乙個拷貝建構函式 ,呼叫父類的拷貝建構函式。

(3)、如果乙個類ctbson沒有拷貝建構函式,但是該類宣告了或者繼承了虛函式,當**中有涉及到類ctbson的拷貝構造時,編譯器會為ctbson合成乙個拷貝建構函式 ,往這個拷貝建構函式裡插入語句:這個語句的含義是設定類物件myctbson2的虛函式表指標值。

(4)、如果 乙個類沒有拷貝建構函式, 但是該類含有虛基類,當**中有涉及到類的拷貝構造時,編譯器會為該類合成乙個拷貝建構函式。

(5)、(6)、,…

#include

using

namespace std;

class

ctbctb()

virtual

void

mvirfunc()

};class

ctbson

:public ctb};

class

ason

;classf;

classt;

class

grand

//爺爺類

c 物件模型筆記之拷貝建構函式

拷貝建構函式 拷貝建構函式 以乙個物件的內容去初始化另個物件。關鍵在於初始化 有三種情況下會呼叫拷貝建構函式 class x 1 x x x xx x 不是賦值操作而是拷貝建構函式 2 void foo x x 物件引數 3 foobar 返回物件 如果類沒有提供顯示的拷貝建構函式,編譯器採用的是位...

C 物件模型 拷貝建構函式語義

目錄引例 如果乙個類a沒有拷貝建構函式,但是含有乙個類型別ctb的成員變數m ctb。該型別ctb含有拷貝建構函式,那麼當 中有涉及到類a的拷貝構造時,編譯器就會為類a合成乙個拷貝建構函式。如果乙個類ctbson沒有拷貝建構函式,但是它有乙個父類ctb,父類有拷貝建構函式,當 中有涉及到類ctbso...

C 物件模型 第五章 構造 解構 拷貝 語意學

c 的建構函式可能內帶大量的隱藏碼,因為編譯器會擴充每乙個建構函式,擴充程度視 class 的繼承體系而定。一般而言編譯器所做的擴充操作大約如下 所有虛基類成員建構函式必須被呼叫,從左到右,從最深到最淺 如果類中含有 vptr,那麼它們必須被設定初值,指向適當的 vtbl。如果有乙個成員物件沒有出現...