news 2026/6/26 14:17:42

C++ 标准特性:委托构造与继承构造

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 标准特性:委托构造与继承构造

C++ 标准特性:委托构造与继承构造


一、委托构造函数(Delegating Constructor)—— C++11

1.1 概述

委托构造函数允许当前类的某个构造函数调用同类的其他构造函数来完成初始化。这样可以避免在多个构造函数中编写重复的初始化代码。

1.2 委托构造函数与普通构造函数的区别

区别点普通构造函数委托构造函数
成员初始值列表初始化成员变量只有一个参数,即同类中另一个构造函数
函数体
执行顺序初始化列表 → 函数体被委托函数初始化列表 →被委托函数函数体→ 委托构造函数函数体

关键规则:当被委托构造函数的函数体中有代码时,先执行完被委托构造函数的函数体,然后才会执行委托构造函数的函数体。

1.3 执行流程图解

委托构造函数 Test(int d) │ ├→ 调用被委托构造函数 Test("default", d) │ ├→ 初始化列表:_data(d), _str("default") │ └→ 函数体:cout << "普通构造函数" │ └→ 委托构造函数自身的函数体:cout << "委托构造函数"

1.4 示例代码

#include<iostream>usingnamespacestd;// 创建一个类classTestC{public:// 普通构造函数TestC(string s,intd):_data(d),_str(s){cout<<"程序执行:普通构造函数的函数体"<<endl;cout<<endl;}// 委托构造函数 ①:只传 int,string 用默认值TestC(intd):TestC("default",d){cout<<"程序执行:委托构造函数的函数体"<<endl;cout<<endl;}// 委托构造函数 ②:只传 string,int 用默认值TestC(string s):TestC(s,0){cout<<"程序执行:委托构造函数的函数体"<<endl;cout<<endl;}voidprintData(){cout<<"------程序执行:普通成员函数的函数体------"<<endl;cout<<"数据成员_data的值为:"<<_data<<endl;cout<<"数据成员_str的值为:"<<_str<<endl;cout<<endl;}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)—— C++11

2.1 概述

在 C++ 中,构造函数不能是虚函数,因此构造函数不能被继承。但从 C++11 开始,可以通过using关键字达到继承构造函数的效果——让派生类"借用"基类的构造函数。

2.2 原理

  • using Base::Base;—— 派生类自动获得基类的所有构造函数
  • using Base::func;—— 派生类也可以引入基类的非虚成员函数

2.3 示例代码

#include<iostream>usingnamespacestd;structA{voidfunc(doubled){cout<<"基类A:"<<d<<endl<<endl;}};structB:A{// C++11 标准中,利用 using 关键字,使派生类可以继承父类的成员函数usingA::func;voidfunc(inti){cout<<"派生类:"<<i<<endl;}};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隐式转为double
b.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){cout<<"Base(int)\n";}Base(intx,inty){cout<<"Base(int,int)\n";}};structDerived:Base{usingBase::Base;// 继承所有基类构造函数(C++11)};intmain(){Derivedd1(1);// 调用 Base(int)Derivedd2(1,2);// 调用 Base(int,int)return0;}

三、对比总结

特性委托构造继承构造(using)
关键词在初始化列表调用同类构造函数using Base::Base;
作用域同一类内部派生类与基类之间
解决什么问题避免多构造函数重复初始化让派生类可直接使用基类构造函数
执行顺序先被委托函数体 → 再委托函数体基类构造 → 派生类构造
C++ 版本C++11C++11

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 14:15:34

高速信号端接实战:LVPECL、LVDS、HCSL、LVCMOS配置与调试指南

1. 项目概述&#xff1a;为什么信号端接是高速设计的“必修课”在调试一块高速FPGA板卡或者一个多路时钟分发系统时&#xff0c;你可能遇到过这样的场景&#xff1a;示波器上本该干净利落的时钟边沿&#xff0c;却拖着一个长长的“尾巴”&#xff08;振铃&#xff09;&#xff…

作者头像 李华
网站建设 2026/6/26 14:13:15

终极指南:如何用dnSpyEx进行专业级代码审查与智能分析

终极指南&#xff1a;如何用dnSpyEx进行专业级代码审查与智能分析 【免费下载链接】dnSpy Unofficial revival of the well known .NET debugger and assembly editor, dnSpy 项目地址: https://gitcode.com/gh_mirrors/dns/dnSpy dnSpyEx作为.NET逆向工程领域的专业工具…

作者头像 李华
网站建设 2026/6/26 14:10:50

Linux下Spotify广告拦截实战:基于流量分析与LD_PRELOAD注入

1. 项目概述&#xff1a;为什么我们需要一个纯净的Spotify体验&#xff1f;作为一个在Linux桌面环境里泡了十多年的老用户&#xff0c;我几乎把所有主流发行版都当主力机用过一遍。从早期的Ubuntu、Fedora到现在的Arch、Manjaro&#xff0c;一个绕不开的痛点就是流媒体服务的“…

作者头像 李华
网站建设 2026/6/26 14:10:07

五款办公智能体实测:差异不在“能不能做”,而在“怎么做”

桌面端办公智能体3月爆发今年3月&#xff0c;桌面端办公智能体迎来一波爆发。易观分析数据显示&#xff0c;当月头部产品月访问量合计超过2000万次&#xff0c;腾讯WorkBuddy以885万排在第一。也是在这个月&#xff0c;腾讯云在上海城市峰会上发布了AI Agent产品全景图&#xf…

作者头像 李华
网站建设 2026/6/26 14:07:01

自媒体账号安全隔离工具完全指南:选型标准、避坑法则与落地实操

做自媒体矩阵、多账号运营&#xff0c;账号安全永远是第一底线。不少人踩过 “一死死一片” 的连坐封号坑&#xff0c;也试过换 IP、多开浏览器、买备用机等各种土办法&#xff0c;但要么隔离效果不达预期&#xff0c;要么管理成本高到抵消收益。很多人对账号安全隔离工具的认知…

作者头像 李华