1. 何時呼叫複製建構函式
複製建構函式用於將乙個物件複製到新建立的物件中。也就是說,它用於初始化過程中,而不是常規的賦值過程中。類的複製建構函式原型通常如下:
class_name(const class_name&);
它接受乙個指向類物件的常量引用作為引數。例如,string類的複製建構函式的原型如下:
string(const string&);
新建乙個物件並將其初始化為同類現有物件時,複製建構函式都將被呼叫。這在很多情況下都可能發生,最常見的情況是將新物件顯示地初始化為現有的物件。例如,假設motto是乙個string物件,則下面4種宣告都將呼叫複製建構函式:
string ditto(motto);
string metoo = motto;
string also = string(motto);
string *pstring = new string(motto);
其中中間的2種宣告可能會使用複製建構函式直接建立metto和also,也可能會使用複製建構函式生成乙個臨時物件,然後將臨時物件的內容賦給metoo和also,這取決於具體的實現。最後一種宣告使用motto初始化乙個匿名物件,並將新物件的位址賦給pstring指標。
2. 何時呼叫賦值建構函式
賦值建構函式是通過過載賦值操作符實現的,這種操作符的原型如下:
class_name& class_name::operator=(const class_name&);
它接受並返回乙個指向類物件的引用。例如,string 類的賦值操作符的原型如下:
string& string::operator=(const string&);
將已有的物件賦給另乙個物件時,將使用過載的賦值操作符:
string headline1("test");
string knot;
knot = headline1;
初始化物件時,並不一定會使用賦值操作符:
string metoo = knot;
這裡,metoo是乙個新建立的物件,被初始化為knot的值,因此使用複製建構函式。不過,正如前面指出的,實現時也可能分兩步來處理這條語句:使用複製建構函式建立乙個臨時物件,然後通過賦值將臨時物件的值複製到新物件中。這就是說,初始化總是會呼叫複製建構函式,而使用=操作符時也可能呼叫賦值操作符
例項**如下:
#include
using
namespace std;
class test
;test::test()
test::~test()
test::test(const test& t)
test& test::operator =(const test& t)
void main()
輸出如下:
呼叫建構函式
呼叫複製建構函式
呼叫建構函式
呼叫賦值建構函式
呼叫析構函式
呼叫析構函式
呼叫析構函式
何時呼叫拷貝建構函式
拷貝建構函式是一種特殊的建構函式 拷貝建構函式是由編譯器呼叫,用來完成一系列基於同一類的其他物件的構件及初始化。拷貝建構函式的一般形式 類名 類名 變數名 函式體 拷貝建構函式的名稱必須和類名一致,形參必須是唯一的 不可改變的本型別的乙個引用型別的變數。拷貝構造函式呼叫的三種情況 物件以值傳遞的方式...
C 中何時呼叫複製建構函式
在c 中,只有單個形參,而且該型別是對本類型別的引用 常用const修飾 這樣的建構函式稱為複製建構函式。複製建構函式既可以自己定義又可以像預設建構函式一樣被編譯器隱式呼叫。但大多數時候,特別是類中有指標成員的時候要實現深複製,避免淺複製時,就需要自己定義複製建構函式。那麼我們定義的複製建構函式什麼...
何時呼叫建構函式和析構函式
建構函式的作用是保證每個物件的資料成員都有何時的初始值。析構函式的作用是 記憶體和資源,通常用於釋放在建構函式或物件生命期內獲取的資源。構造從類層次的最根處開始,在每一層中,首先呼叫基類的建構函式,然後呼叫成員物件的建構函式。析構則嚴格按照與構造相反的次序執行,該次序是唯一的,否則編譯器將無法自動執...