C++ 默認(rèn)構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)和移動(dòng)構(gòu)造函數(shù)的區(qū)別
構(gòu)造函數(shù)三大類型,默認(rèn)構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)和移動(dòng)構(gòu)造函數(shù)?!?/p>
1.默認(rèn)構(gòu)造函數(shù) (Default Constructor)
默認(rèn)構(gòu)造函數(shù)是沒有任何參數(shù)的構(gòu)造函數(shù),或者所有參數(shù)都有默認(rèn)值的構(gòu)造函數(shù)。當(dāng)我們創(chuàng)建一個(gè)對(duì)象時(shí),若沒有提供初始化參數(shù),程序會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)進(jìn)行初始化。
特點(diǎn):
默認(rèn)構(gòu)造函數(shù)不需要參數(shù),或者所有參數(shù)都有默認(rèn)值?!?/p>
如果沒有顯式定義,編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)構(gòu)造函數(shù)(如果沒有其他構(gòu)造函數(shù)的話)?!?/p>
它用于初始化對(duì)象的成員變量,并確保對(duì)象處于有效狀態(tài)?!?/p>
示例:
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass() { // 默認(rèn)構(gòu)造函數(shù)
cout << "Default constructor called!" << endl;
}
};
int main() {
MyClass obj; // 創(chuàng)建對(duì)象時(shí)調(diào)用默認(rèn)構(gòu)造函數(shù)
return 0;
}
輸出:
Default constructor called!
在這個(gè)示例中,我們定義了一個(gè)名為 MyClass 的類,并實(shí)現(xiàn)了一個(gè)默認(rèn)構(gòu)造函數(shù)。當(dāng)我們創(chuàng)建 obj 對(duì)象時(shí),程序自動(dòng)調(diào)用了默認(rèn)構(gòu)造函數(shù)。
2. 拷貝構(gòu)造函數(shù) (Copy Constructor)
拷貝構(gòu)造函數(shù)用于通過現(xiàn)有對(duì)象來創(chuàng)建一個(gè)新的對(duì)象。它通常用于對(duì)象的復(fù)制操作,例如將一個(gè)對(duì)象傳遞給函數(shù)、或者返回一個(gè)對(duì)象時(shí)?!?/p>
特點(diǎn):
拷貝構(gòu)造函數(shù)接受一個(gè)類的常量引用作為參數(shù)?!?/p>
它的作用是通過另一個(gè)對(duì)象的內(nèi)容來初始化新對(duì)象?!?/p>
當(dāng)對(duì)象被復(fù)制時(shí),編譯器自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)?!?/p>
示例:
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass() { // 默認(rèn)構(gòu)造函數(shù)
cout << "Default constructor called!" << endl;
}
MyClass(const MyClass& other) { // 拷貝構(gòu)造函數(shù)
cout << "Copy constructor called!" << endl;
}
};
int main() {
MyClass obj1; // 調(diào)用默認(rèn)構(gòu)造函數(shù)
MyClass obj2 = obj1; // 調(diào)用拷貝構(gòu)造函數(shù)
return 0;
}
輸出:
Default constructor called!
Copy constructor called!
在這個(gè)示例中,我們創(chuàng)建了一個(gè)對(duì)象 obj1,并將其傳遞給 obj2,這時(shí)會(huì)調(diào)用拷貝構(gòu)造函數(shù)來創(chuàng)建一個(gè)新的對(duì)象 obj2,并復(fù)制 obj1 的內(nèi)容?!?/p>
3. 移動(dòng)構(gòu)造函數(shù) (Move Constructor)
移動(dòng)構(gòu)造函數(shù)用于通過轉(zhuǎn)移資源來構(gòu)造對(duì)象,避免不必要的資源復(fù)制。在某些情況下,當(dāng)我們傳遞臨時(shí)對(duì)象或者即將銷毀的對(duì)象時(shí),移動(dòng)構(gòu)造函數(shù)會(huì)“竊取”對(duì)象的資源,而不是進(jìn)行復(fù)制操作。這種方式大大提高了程序的性能,尤其是在處理大對(duì)象或動(dòng)態(tài)內(nèi)存分配時(shí)?! ?/p>
特點(diǎn):
移動(dòng)構(gòu)造函數(shù)接受一個(gè)右值引用作為參數(shù)?!?/p>
它會(huì)將資源從一個(gè)對(duì)象轉(zhuǎn)移到另一個(gè)對(duì)象,而不是復(fù)制資源?!?/p>
移動(dòng)構(gòu)造函數(shù)通常用于處理臨時(shí)對(duì)象或返回對(duì)象。
示例:
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass() { // 默認(rèn)構(gòu)造函數(shù)
cout << "Default constructor called!" << endl;
}
MyClass(MyClass&& other) { // 移動(dòng)構(gòu)造函數(shù)
cout << "Move constructor called!" << endl;
}
};
MyClass createObject() {
MyClass temp;
return temp; // 移動(dòng)構(gòu)造函數(shù)被調(diào)用
}
int main() {
MyClass obj = createObject(); // 使用移動(dòng)構(gòu)造函數(shù)
return 0;
}
輸出:
Default constructor called!
Move constructor called!
在這個(gè)示例中,createObject 函數(shù)返回一個(gè) MyClass 對(duì)象。當(dāng) temp 返回時(shí),程序會(huì)調(diào)用移動(dòng)構(gòu)造函數(shù),因?yàn)?temp 是一個(gè)臨時(shí)對(duì)象。通過移動(dòng)構(gòu)造函數(shù),obj 將直接接管 temp 的資源,而無需復(fù)制資源?!?/p>
4. 總結(jié)
默認(rèn)構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)和移動(dòng)構(gòu)造函數(shù)各自有不同的用途:
默認(rèn)構(gòu)造函數(shù):當(dāng)我們創(chuàng)建一個(gè)對(duì)象時(shí),它會(huì)被調(diào)用,進(jìn)行默認(rèn)初始化?!?/p>
拷貝構(gòu)造函數(shù):在需要復(fù)制對(duì)象時(shí)被調(diào)用,如對(duì)象傳遞、返回值傳遞等?!?/p>
移動(dòng)構(gòu)造函數(shù):當(dāng)傳遞或返回臨時(shí)對(duì)象時(shí)使用,它通過“竊取”資源避免了復(fù)制,提升了性能?!?/p>






