C 标准特性委托构造与继承构造一、委托构造函数Delegating Constructor—— C111.1 概述委托构造函数允许当前类的某个构造函数调用同类的其他构造函数来完成初始化。这样可以避免在多个构造函数中编写重复的初始化代码。1.2 委托构造函数与普通构造函数的区别区别点普通构造函数委托构造函数成员初始值列表初始化成员变量只有一个参数即同类中另一个构造函数函数体有有执行顺序初始化列表 → 函数体被委托函数初始化列表 →被委托函数函数体→ 委托构造函数函数体关键规则当被委托构造函数的函数体中有代码时先执行完被委托构造函数的函数体然后才会执行委托构造函数的函数体。1.3 执行流程图解委托构造函数 Test(int d) │ ├→ 调用被委托构造函数 Test(default, d) │ ├→ 初始化列表_data(d), _str(default) │ └→ 函数体cout 普通构造函数 │ └→ 委托构造函数自身的函数体cout 委托构造函数1.4 示例代码#includeiostreamusingnamespacestd;// 创建一个类classTestC{public:// 普通构造函数TestC(string s,intd):_data(d),_str(s){cout程序执行普通构造函数的函数体endl;coutendl;}// 委托构造函数 ①只传 intstring 用默认值TestC(intd):TestC(default,d){cout程序执行委托构造函数的函数体endl;coutendl;}// 委托构造函数 ②只传 stringint 用默认值TestC(string s):TestC(s,0){cout程序执行委托构造函数的函数体endl;coutendl;}voidprintData(){cout------程序执行普通成员函数的函数体------endl;cout数据成员_data的值为_dataendl;cout数据成员_str的值为_strendl;coutendl;}private:int_data;string _str;};intmain(){TestCobjc1(hello,10);// 普通构造函数objc1.printData();TestCobjc2(helo,20);// 普通构造函数objc2.printData();TestCobjc3(hello);// 委托构造函数 → 内部调用 TestC(hello, 0)objc3.printData();return0;}1.5 调用分析对象构造方式实际调用链objc1(hello, 10)普通构造直接匹配TestC(string, int)objc2(helo, 20)普通构造直接匹配TestC(string, int)objc3(hello)委托构造TestC(string)→TestC(hello, 0)二、继承构造函数Inheriting Constructor—— C112.1 概述在 C 中构造函数不能是虚函数因此构造函数不能被继承。但从 C11 开始可以通过using关键字达到继承构造函数的效果——让派生类借用基类的构造函数。2.2 原理using Base::Base;—— 派生类自动获得基类的所有构造函数using Base::func;—— 派生类也可以引入基类的非虚成员函数2.3 示例代码#includeiostreamusingnamespacestd;structA{voidfunc(doubled){cout基类Adendlendl;}};structB:A{// C11 标准中利用 using 关键字使派生类可以继承父类的成员函数usingA::func;voidfunc(inti){cout派生类iendl;}};intmain(){A a;a.func(78);// 调用 A::func(double)B b;b.func(87);// 调用 B::func(int)就近匹配return0;}2.4 调用分析调用匹配函数原因a.func(78)A::func(double)A只有一个func78隐式转为doubleb.func(87)B::func(int)B有两份func87精确匹配int版本b.func(87.0)A::func(double)精确匹配double版本由using引入using A::func;将基类的func(double)引入派生类的作用域与派生类自己的func(int)构成重载关系。2.5 using 继承构造函数补充structBase{Base(intx){coutBase(int)\n;}Base(intx,inty){coutBase(int,int)\n;}};structDerived:Base{usingBase::Base;// 继承所有基类构造函数C11};intmain(){Derivedd1(1);// 调用 Base(int)Derivedd2(1,2);// 调用 Base(int,int)return0;}三、对比总结特性委托构造继承构造using关键词在初始化列表调用同类构造函数using Base::Base;作用域同一类内部派生类与基类之间解决什么问题避免多构造函数重复初始化让派生类可直接使用基类构造函数执行顺序先被委托函数体 → 再委托函数体基类构造 → 派生类构造C 版本C11C11
C++ 标准特性:委托构造与继承构造
发布时间:2026/6/26 14:18:03
C 标准特性委托构造与继承构造一、委托构造函数Delegating Constructor—— C111.1 概述委托构造函数允许当前类的某个构造函数调用同类的其他构造函数来完成初始化。这样可以避免在多个构造函数中编写重复的初始化代码。1.2 委托构造函数与普通构造函数的区别区别点普通构造函数委托构造函数成员初始值列表初始化成员变量只有一个参数即同类中另一个构造函数函数体有有执行顺序初始化列表 → 函数体被委托函数初始化列表 →被委托函数函数体→ 委托构造函数函数体关键规则当被委托构造函数的函数体中有代码时先执行完被委托构造函数的函数体然后才会执行委托构造函数的函数体。1.3 执行流程图解委托构造函数 Test(int d) │ ├→ 调用被委托构造函数 Test(default, d) │ ├→ 初始化列表_data(d), _str(default) │ └→ 函数体cout 普通构造函数 │ └→ 委托构造函数自身的函数体cout 委托构造函数1.4 示例代码#includeiostreamusingnamespacestd;// 创建一个类classTestC{public:// 普通构造函数TestC(string s,intd):_data(d),_str(s){cout程序执行普通构造函数的函数体endl;coutendl;}// 委托构造函数 ①只传 intstring 用默认值TestC(intd):TestC(default,d){cout程序执行委托构造函数的函数体endl;coutendl;}// 委托构造函数 ②只传 stringint 用默认值TestC(string s):TestC(s,0){cout程序执行委托构造函数的函数体endl;coutendl;}voidprintData(){cout------程序执行普通成员函数的函数体------endl;cout数据成员_data的值为_dataendl;cout数据成员_str的值为_strendl;coutendl;}private:int_data;string _str;};intmain(){TestCobjc1(hello,10);// 普通构造函数objc1.printData();TestCobjc2(helo,20);// 普通构造函数objc2.printData();TestCobjc3(hello);// 委托构造函数 → 内部调用 TestC(hello, 0)objc3.printData();return0;}1.5 调用分析对象构造方式实际调用链objc1(hello, 10)普通构造直接匹配TestC(string, int)objc2(helo, 20)普通构造直接匹配TestC(string, int)objc3(hello)委托构造TestC(string)→TestC(hello, 0)二、继承构造函数Inheriting Constructor—— C112.1 概述在 C 中构造函数不能是虚函数因此构造函数不能被继承。但从 C11 开始可以通过using关键字达到继承构造函数的效果——让派生类借用基类的构造函数。2.2 原理using Base::Base;—— 派生类自动获得基类的所有构造函数using Base::func;—— 派生类也可以引入基类的非虚成员函数2.3 示例代码#includeiostreamusingnamespacestd;structA{voidfunc(doubled){cout基类Adendlendl;}};structB:A{// C11 标准中利用 using 关键字使派生类可以继承父类的成员函数usingA::func;voidfunc(inti){cout派生类iendl;}};intmain(){A a;a.func(78);// 调用 A::func(double)B b;b.func(87);// 调用 B::func(int)就近匹配return0;}2.4 调用分析调用匹配函数原因a.func(78)A::func(double)A只有一个func78隐式转为doubleb.func(87)B::func(int)B有两份func87精确匹配int版本b.func(87.0)A::func(double)精确匹配double版本由using引入using A::func;将基类的func(double)引入派生类的作用域与派生类自己的func(int)构成重载关系。2.5 using 继承构造函数补充structBase{Base(intx){coutBase(int)\n;}Base(intx,inty){coutBase(int,int)\n;}};structDerived:Base{usingBase::Base;// 继承所有基类构造函数C11};intmain(){Derivedd1(1);// 调用 Base(int)Derivedd2(1,2);// 调用 Base(int,int)return0;}三、对比总结特性委托构造继承构造using关键词在初始化列表调用同类构造函数using Base::Base;作用域同一类内部派生类与基类之间解决什么问题避免多构造函数重复初始化让派生类可直接使用基类构造函数执行顺序先被委托函数体 → 再委托函数体基类构造 → 派生类构造C 版本C11C11