C++中的6種構(gòu)造函數(shù)舉例詳解
在 C++ 中,構(gòu)造函數(shù)是一種特殊的成員函數(shù),用于初始化類(lèi)對(duì)象。在對(duì)象創(chuàng)建時(shí)自動(dòng)調(diào)用,構(gòu)造函數(shù)的主要作用是分配資源、初始化數(shù)據(jù)成員等。根據(jù)不同的功能和使用場(chǎng)景,C++ 提供了多種類(lèi)型的構(gòu)造函數(shù):
1. 默認(rèn)構(gòu)造函數(shù) (Default Constructor)
默認(rèn)構(gòu)造函數(shù)不接受任何參數(shù),或者所有參數(shù)都有默認(rèn)值。當(dāng)你創(chuàng)建對(duì)象時(shí)如果不指定參數(shù),就會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)。
特點(diǎn):
- 如果類(lèi)沒(méi)有定義任何構(gòu)造函數(shù),編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)構(gòu)造函數(shù)。
- 如果類(lèi)有其他構(gòu)造函數(shù)但沒(méi)有顯式定義默認(rèn)構(gòu)造函數(shù),編譯器不會(huì)生成默認(rèn)構(gòu)造函數(shù)。
示例:
class MyClass {
public:
MyClass() { // 默認(rèn)構(gòu)造函數(shù)
x = 0;
}
private:
int x;
};
MyClass obj; // 自動(dòng)調(diào)用默認(rèn)構(gòu)造函數(shù)2. 參數(shù)化構(gòu)造函數(shù) (Parameterized Constructor)
參數(shù)化構(gòu)造函數(shù)允許在創(chuàng)建對(duì)象時(shí)傳遞參數(shù),用于初始化對(duì)象的成員變量。
特點(diǎn):
- 通過(guò)傳遞參數(shù),可以靈活地為對(duì)象賦值。
示例:
class MyClass {
public:
MyClass(int val) { // 參數(shù)化構(gòu)造函數(shù)
x = val;
}
private:
int x;
};
MyClass obj(10); // 使用參數(shù)化構(gòu)造函數(shù)3. 拷貝構(gòu)造函數(shù) (Copy Constructor)
拷貝構(gòu)造函數(shù)用于創(chuàng)建對(duì)象時(shí),用一個(gè)已存在的對(duì)象來(lái)初始化新對(duì)象。其形式為接受一個(gè)對(duì)象的常量引用。
特點(diǎn):
- 如果沒(méi)有顯式定義,編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)。
- 主要用于復(fù)制對(duì)象的值,特別是對(duì)于動(dòng)態(tài)分配內(nèi)存的類(lèi),手動(dòng)定義拷貝構(gòu)造函數(shù)可以防止淺拷貝問(wèn)題。
示例:
class MyClass {
public:
MyClass(int val) : x(val) {} // 參數(shù)化構(gòu)造函數(shù)
MyClass(const MyClass &obj) { // 拷貝構(gòu)造函數(shù)
x = obj.x;
}
private:
int x;
};
MyClass obj1(10);
MyClass obj2 = obj1; // 使用拷貝構(gòu)造函數(shù)4. 移動(dòng)構(gòu)造函數(shù) (Move Constructor)
移動(dòng)構(gòu)造函數(shù)是在 C++11 引入的,用于通過(guò)"移動(dòng)語(yǔ)義"來(lái)避免拷貝操作,從而提高程序的性能,特別是涉及動(dòng)態(tài)分配資源的對(duì)象。
特點(diǎn):
- 接受一個(gè)右值引用 (
T&&)。 - 用于將資源從一個(gè)臨時(shí)對(duì)象“移動(dòng)”到新的對(duì)象中,通常通過(guò)偷取資源而不是復(fù)制它們。
示例:
class MyClass {
public:
MyClass(int val) : x(new int(val)) {} // 動(dòng)態(tài)分配內(nèi)存
MyClass(MyClass&& obj) noexcept { // 移動(dòng)構(gòu)造函數(shù)
x = obj.x;
obj.x = nullptr; // 釋放臨時(shí)對(duì)象的所有權(quán)
}
~MyClass() { delete x; }
private:
int* x;
};
MyClass obj1(10);
MyClass obj2 = std::move(obj1); // 使用移動(dòng)構(gòu)造函數(shù)5. 委托構(gòu)造函數(shù) (Delegating Constructor)
委托構(gòu)造函數(shù)是在一個(gè)構(gòu)造函數(shù)中調(diào)用同一個(gè)類(lèi)的另一個(gè)構(gòu)造函數(shù),從而避免代碼重復(fù)。這是 C++11 引入的特性。
特點(diǎn):
- 可以簡(jiǎn)化多個(gè)構(gòu)造函數(shù)之間的代碼邏輯,避免重復(fù)代碼。
示例:
class MyClass {
public:
MyClass() : MyClass(0) { // 委托給參數(shù)化構(gòu)造函數(shù)
// 可以額外執(zhí)行一些操作
}
MyClass(int val) : x(val) {} // 參數(shù)化構(gòu)造函數(shù)
private:
int x;
};
MyClass obj; // 調(diào)用默認(rèn)構(gòu)造函數(shù),委托給參數(shù)化構(gòu)造函數(shù)6. 顯式構(gòu)造函數(shù) (Explicit Constructor)
explicit 構(gòu)造函數(shù)用于防止隱式類(lèi)型轉(zhuǎn)換。這對(duì)防止錯(cuò)誤的自動(dòng)類(lèi)型轉(zhuǎn)換特別有用。
特點(diǎn):
- 防止構(gòu)造函數(shù)被自動(dòng)調(diào)用進(jìn)行隱式轉(zhuǎn)換。
示例:
class MyClass {
public:
explicit MyClass(int val) : x(val) {} // 顯式構(gòu)造函數(shù)
private:
int x;
};
MyClass obj1(10); // OK
MyClass obj2 = 10; // 錯(cuò)誤,顯式構(gòu)造函數(shù)禁止隱式轉(zhuǎn)換7. 析構(gòu)函數(shù) (Destructor)
雖然析構(gòu)函數(shù)不算構(gòu)造函數(shù),但與其作用類(lèi)似。析構(gòu)函數(shù)用于在對(duì)象生命周期結(jié)束時(shí)釋放資源。析構(gòu)函數(shù)沒(méi)有參數(shù),且前面有 ~ 符號(hào)。
示例:
class MyClass {
public:
MyClass() { x = new int(10); }
~MyClass() { delete x; } // 析構(gòu)函數(shù)
private:
int* x;
};總結(jié):
C++ 中構(gòu)造函數(shù)的類(lèi)型和用途可以總結(jié)如下:
- 默認(rèn)構(gòu)造函數(shù): 初始化對(duì)象,通常不需要參數(shù)。
- 參數(shù)化構(gòu)造函數(shù): 通過(guò)傳參初始化對(duì)象的成員。
- 拷貝構(gòu)造函數(shù): 通過(guò)已有對(duì)象初始化新對(duì)象。
- 移動(dòng)構(gòu)造函數(shù): 移動(dòng)對(duì)象的資源,避免不必要的拷貝。
- 委托構(gòu)造函數(shù): 在一個(gè)構(gòu)造函數(shù)中調(diào)用另一個(gè)構(gòu)造函數(shù)。
- 顯式構(gòu)造函數(shù): 防止隱式類(lèi)型轉(zhuǎn)換。
這些構(gòu)造函數(shù)為對(duì)象的初始化提供了靈活的選擇,尤其在管理資源時(shí),合理使用拷貝和移動(dòng)構(gòu)造函數(shù)可以顯著提升程序的效率。
到此這篇關(guān)于C++中6種構(gòu)造函數(shù)的文章就介紹到這了,更多相關(guān)C++構(gòu)造函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++基于CreateToolhelp32Snapshot獲取系統(tǒng)進(jìn)程實(shí)例
這篇文章主要介紹了C++基于CreateToolhelp32Snapshot獲取系統(tǒng)進(jìn)程實(shí)例,是Windows應(yīng)用程序設(shè)計(jì)中非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)時(shí)間復(fù)雜度及空間復(fù)雜度簡(jiǎn)要分析
我們?cè)谶M(jìn)行編程時(shí),往往會(huì)開(kāi)發(fā)諸多的算法,那么我們?cè)趺丛谀敲炊嗨惴ㄖ姓业阶詈玫哪莻€(gè)呢?本文主要介紹時(shí)間和空間復(fù)雜度概念及時(shí)間復(fù)雜度的求解,預(yù)祝讀者學(xué)習(xí)愉快2021-10-10
cocos2dx-3.10 C++實(shí)現(xiàn)滾動(dòng)數(shù)字
這篇文章主要為大家詳細(xì)介紹了cocos2dx-3.10 C++實(shí)現(xiàn)滾動(dòng)數(shù)字效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
一文帶你搞懂C語(yǔ)言動(dòng)態(tài)內(nèi)存管理
動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。本文將通過(guò)幾個(gè)示例帶大家深入了解一下C語(yǔ)言的動(dòng)態(tài)內(nèi)存管理,需要的可以參考一下2022-11-11
深入linux下遍歷目錄樹(shù)的方法總結(jié)分析
本篇文章是對(duì)linux下遍歷目錄樹(shù)的方法進(jìn)行了詳細(xì)的總結(jié)與分析,需要的朋友參考下2013-05-05
Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)清理
項(xiàng)目如果需要存儲(chǔ)很多日志記錄比如運(yùn)行日志,時(shí)間長(zhǎng)了記錄數(shù)量非常多,數(shù)據(jù)庫(kù)體積不斷增大,對(duì)應(yīng)數(shù)據(jù)庫(kù)表的增刪改查的效率不斷降低,因此需要將早期的數(shù)據(jù)清理。本文將詳細(xì)介紹一下通用數(shù)據(jù)庫(kù)清理的實(shí)現(xiàn),需要的可以參考一下2022-02-02
C語(yǔ)言關(guān)于include順序不同導(dǎo)致編譯結(jié)果不同的問(wèn)題
這篇文章主要介紹了在日常調(diào)試C語(yǔ)言中include的順序不同從而影響最后編譯結(jié)果不同的問(wèn)題,究其原因是寫(xiě)代碼的習(xí)慣所導(dǎo)致,下面跟小編一起來(lái)看看吧2022-04-04
全局變量與局部變量在內(nèi)存中的區(qū)別詳細(xì)解析
以下是對(duì)全局變量與局部變量在內(nèi)存中的區(qū)別進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10

