欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++11委托構(gòu)造函數(shù)和繼承構(gòu)造函數(shù)的實(shí)現(xiàn)

 更新時(shí)間:2025年06月24日 11:17:05   作者:碼事漫談  
C++引入了委托構(gòu)造函數(shù)和繼承構(gòu)造函數(shù)這兩個(gè)重要的特性,本文主要介紹了C++11委托構(gòu)造函數(shù)和繼承構(gòu)造函數(shù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

引言

在C++11標(biāo)準(zhǔn)中,引入了委托構(gòu)造函數(shù)和繼承構(gòu)造函數(shù)這兩個(gè)重要的特性。這些特性不僅提升了代碼的性能,還增強(qiáng)了代碼的可讀性和可維護(hù)性。對(duì)于初學(xué)者來(lái)說(shuō),理解和掌握這些特性是邁向高級(jí)C++編程的關(guān)鍵一步。本文將詳細(xì)介紹委托構(gòu)造函數(shù)和繼承構(gòu)造函數(shù)的基本概念、使用方法以及實(shí)際應(yīng)用場(chǎng)景,幫助你從入門(mén)到精通。

一、委托構(gòu)造函數(shù)

1.1 委托構(gòu)造函數(shù)的定義與作用

委托構(gòu)造函數(shù)是C++11引入的一個(gè)特性,它允許一個(gè)構(gòu)造函數(shù)調(diào)用同一個(gè)類(lèi)中的另一個(gè)構(gòu)造函數(shù)來(lái)完成對(duì)象的初始化。這種特性可以減少代碼冗余,提高代碼的可維護(hù)性,同時(shí)也使得代碼結(jié)構(gòu)更加清晰。例如,在一個(gè)類(lèi)中可能有多個(gè)構(gòu)造函數(shù),它們之間存在一些重復(fù)的初始化代碼,使用委托構(gòu)造函數(shù)可以避免這些重復(fù)代碼的出現(xiàn)。

1.2 委托構(gòu)造函數(shù)的語(yǔ)法

委托構(gòu)造函數(shù)的語(yǔ)法格式如下:

class MyClass {
public:
    // 目標(biāo)構(gòu)造函數(shù)
    MyClass(int param1, int param2) { 
        // 構(gòu)造函數(shù)的具體實(shí)現(xiàn) 
    }
    // 委托構(gòu)造函數(shù)
    MyClass(int param) : MyClass(param, 0) { 
        // 委托給另一個(gè)構(gòu)造函數(shù)完成初始化 
    }
}; 

在上述代碼中,第一個(gè)構(gòu)造函數(shù)接受兩個(gè)參數(shù),而第二個(gè)構(gòu)造函數(shù)只接受一個(gè)參數(shù)。第二個(gè)構(gòu)造函數(shù)使用了初始化列表的方式,通過(guò)委托給第一個(gè)構(gòu)造函數(shù)來(lái)完成對(duì)象的初始化。

1.3 委托構(gòu)造函數(shù)的使用示例

下面通過(guò)一個(gè)具體的例子來(lái)詳細(xì)解析委托構(gòu)造函數(shù)的使用:

#include <iostream>
using namespace std;
class Test {
public:
    Test() {}; 
    Test(int max) { 
        this->m_max = max > 0 ? max : 100; 
    }
    Test(int max, int min) : Test(max) { 
        this->m_min = min > 0 && min < max ? min : 1; 
    }
    Test(int max, int min, int mid) : Test(max, min) { 
        this->m_middle = mid < max && mid > min ? mid : 50; 
    }
    int m_min; 
    int m_max; 
    int m_middle; 
}; 
int main() { 
    Test t(90, 30, 60); 
    cout << "min: " << t.m_min << ", middle: " << t.m_middle << ", max: " << t.m_max << endl; 
    return 0; 
}

在這個(gè)例子中,Test(int max, int min) 構(gòu)造函數(shù)委托給 Test(int max) 構(gòu)造函數(shù),Test(int max, int min, int mid) 構(gòu)造函數(shù)委托給 Test(int max, int min) 構(gòu)造函數(shù),這樣可以避免在多個(gè)構(gòu)造函數(shù)中重復(fù)初始化 m_maxm_min

1.4 委托構(gòu)造函數(shù)的注意事項(xiàng)

  • 避免形成閉環(huán):委托構(gòu)造函數(shù)的鏈?zhǔn)秸{(diào)用不能形成一個(gè)閉環(huán)(死循環(huán)),否則會(huì)在運(yùn)行期拋異常。例如:
class MyClass {
public:
    MyClass(int param1) : MyClass(param1, 0) { 
        // 委托給另一個(gè)構(gòu)造函數(shù)完成初始化 
    }
    MyClass(int param1, int param2) : MyClass(param1) { 
        // 錯(cuò)誤:形成了閉環(huán) 
    }
}; 
  • 多層鏈?zhǔn)秸{(diào)用建議寫(xiě)在初始化列表中:如果要進(jìn)行多層構(gòu)造函數(shù)的鏈?zhǔn)秸{(diào)用,建議將構(gòu)造函數(shù)的調(diào)用寫(xiě)在初始列表中而不是函數(shù)體內(nèi)部,否則編譯器會(huì)提示形參的重復(fù)定義。例如:
class Test {
public:
    Test(int max) { 
        this->m_max = max > 0 ? max : 100; 
    }
    Test(int max, int min) { 
        Test(max); // 錯(cuò)誤,編譯器會(huì)報(bào)錯(cuò),提示形參max被重復(fù)定義 
        this->m_min = min > 0 && min < max ? min : 1; 
    }
}; 
  • 避免重復(fù)初始化變量:在初始化列表中調(diào)用了委托構(gòu)造函數(shù)初始化某個(gè)類(lèi)成員變量之后,就不能在初始化列表中再次初始化這個(gè)變量了。例如:
class Test {
public:
    Test(int max, int min) : Test(max), m_max(max) { 
        // 錯(cuò)誤,使用了委托構(gòu)造函數(shù)就不能再次m_max初始化了 
        this->m_min = min > 0 && min < max ? min : 1; 
    }
}; 

C++委托構(gòu)造函數(shù)代碼

二、繼承構(gòu)造函數(shù)

2.1 繼承構(gòu)造函數(shù)的定義與作用

在C++11之前,如果基類(lèi)有多個(gè)構(gòu)造函數(shù),派生類(lèi)需要為自己需要用到的每一個(gè)基類(lèi)構(gòu)造函數(shù)編寫(xiě)對(duì)應(yīng)的構(gòu)造函數(shù),即使這些派生類(lèi)構(gòu)造函數(shù)只是簡(jiǎn)單地將參數(shù)傳遞給基類(lèi)構(gòu)造函數(shù)。這不僅增加了代碼量,也提高了維護(hù)成本。繼承構(gòu)造函數(shù)允許派生類(lèi)繼承基類(lèi)的所有構(gòu)造函數(shù),從而無(wú)需在派生類(lèi)中顯式定義這些構(gòu)造函數(shù)。這樣做可以顯著減少代碼重復(fù),使得派生類(lèi)的編寫(xiě)更加簡(jiǎn)潔明了。

2.2 繼承構(gòu)造函數(shù)的語(yǔ)法

繼承構(gòu)造函數(shù)的語(yǔ)法格式如下:

class Base {
public:
    Base() { 
        // 默認(rèn)構(gòu)造函數(shù)的實(shí)現(xiàn) 
    }
    Base(int value) { 
        // 帶參數(shù)的構(gòu)造函數(shù)實(shí)現(xiàn) 
    }
}; 
class Derived : public Base {
public:
    using Base::Base; // 繼承基類(lèi)的所有構(gòu)造函數(shù) 
}; 

在這個(gè)示例中,通過(guò)在派生類(lèi)中使用 using Base::Base; 語(yǔ)句,Derived 類(lèi)自動(dòng)繼承了 Base 類(lèi)的所有構(gòu)造函數(shù)。不需要在 Derived 類(lèi)中顯式定義這些構(gòu)造函數(shù),就可以像使用 Base 類(lèi)的構(gòu)造函數(shù)那樣使用它們來(lái)初始化 Derived 類(lèi)的對(duì)象。

2.3 繼承構(gòu)造函數(shù)的使用示例

下面通過(guò)一個(gè)具體的例子來(lái)詳細(xì)解析繼承構(gòu)造函數(shù)的使用:

#include <iostream>
#include <string>
using namespace std;
class Base {
public:
    Base(int i) : m_i(i) { }
    Base(int i, double j) : m_i(i), m_j(j) { }
    Base(int i, double j, string k) : m_i(i), m_j(j), m_k(k) { }
    int m_i; 
    double m_j; 
    string m_k; 
}; 
class Child : public Base {
public:
    using Base::Base; 
}; 
int main() { 
    Child c(520, 13.14, "i love you"); 
    cout << "int: " << c.m_i << ", double: " << c.m_j << ", string: " << c.m_k << endl; 
    return 0; 
}

通過(guò)測(cè)試代碼可以看出,在子類(lèi)中初始化從基類(lèi)繼承的類(lèi)成員,使用繼承構(gòu)造函數(shù)可以避免在子類(lèi)中重新定義和基類(lèi)一致的構(gòu)造函數(shù),使得代碼更加精簡(jiǎn)。

2.4 繼承構(gòu)造函數(shù)的注意事項(xiàng)

  • 同名構(gòu)造函數(shù)沖突:如果從多個(gè)基類(lèi)中繼承了相同的構(gòu)造函數(shù)(即形參列表完全相同),則程序?qū)a(chǎn)生錯(cuò)誤。例如:
struct Base1 {
    Base1() = default; 
    Base1(const std::string&); 
    Base1(std::shared_ptr<int>); 
}; 
struct Base2 {
    Base2() = default; 
    Base2(const std::string&); 
    Base2(int); 
}; 
// 錯(cuò)誤: D1 試圖從兩個(gè)基類(lèi)中都繼承D1::D1(const string&) 
struct D1 : public Base1, public Base2 {
    using Base1::Base1; //從 Base1 繼承構(gòu)造函數(shù) 
    using Base2::Base2; //從 Base2 繼承構(gòu)造函數(shù) 
}; 

在這種情況下,派生類(lèi)必須為該構(gòu)造函數(shù)定義它自己的版本:

struct D2 : public Base1, public Base2 {
    using Base1::Base1; //從 Base1 繼承構(gòu)造函數(shù) 
    using Base2::Base2; //從 Base2 繼承構(gòu)造函數(shù) 
    // D2 必須自定義一個(gè)接受 string 的構(gòu)造函數(shù) 
    D2(const string& s) : Base1(s), Base2(s) { }
    D2() = default; // 一旦 D2 定義了它自己的構(gòu)造函數(shù),則必須出現(xiàn) 
}; 
  • 默認(rèn)實(shí)參不繼承:當(dāng)一個(gè)基類(lèi)構(gòu)造函數(shù)含有默認(rèn)實(shí)參時(shí),這些實(shí)參并不會(huì)被繼承。相反,派生類(lèi)將獲得多個(gè)繼承的構(gòu)造函數(shù),其中每個(gè)構(gòu)造函數(shù)分別省略掉一個(gè)含有默認(rèn)實(shí)參的形參。例如,如果基類(lèi)有一個(gè)接受兩個(gè)形參的構(gòu)造函數(shù),其中第二個(gè)形參含有默認(rèn)實(shí)參,則派生類(lèi)將獲得兩個(gè)構(gòu)造函數(shù):一個(gè)構(gòu)造函數(shù)接受兩個(gè)形參(沒(méi)有默認(rèn)實(shí)參);另一個(gè)構(gòu)造函數(shù)只接受一個(gè)形參,它對(duì)應(yīng)于基類(lèi)中最左側(cè)的沒(méi)有默認(rèn)值的那個(gè)形參。

C++繼承構(gòu)造函數(shù)代碼

三、總結(jié)

委托構(gòu)造函數(shù)和繼承構(gòu)造函數(shù)是C++11中非常強(qiáng)大的特性,它們?yōu)镃++程序員提供了更多的編程選擇和優(yōu)化機(jī)會(huì)。通過(guò)使用委托構(gòu)造函數(shù),我們可以減少代碼冗余,提高代碼的可維護(hù)性;而繼承構(gòu)造函數(shù)則可以簡(jiǎn)化派生類(lèi)構(gòu)造函數(shù)的編寫(xiě),提高代碼的復(fù)用性。在實(shí)際編程中,合理運(yùn)用這些特性可以讓我們的代碼更加高效、安全和易于理解。希望本文能夠幫助你更好地理解和掌握C++11中的委托構(gòu)造函數(shù)和繼承構(gòu)造函數(shù),從而提升你的C++編程水平。

到此這篇關(guān)于C++11委托構(gòu)造函數(shù)和繼承構(gòu)造函數(shù):從入門(mén)到精通的文章就介紹到這了,更多相關(guān)C++11委托構(gòu)造函數(shù)和繼承構(gòu)造函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論