尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

C++ 标准特性:委托构造与继承构造
📅 发布时间:2026/6/26 14:20:59

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只有一个func,78隐式转为double
b.func(87)B::func(int)B有两份func,87精确匹配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

相关新闻

  • 2026年B端抖音运营公司选型指南:聚焦实体与垂直行业的深度评测
  • 嵌入式来电显示开发实战:Motorola Type 1/2电话解析库集成与调试
  • 射频放大器评估板实战解析:从ISL74324M设计到产品集成指南

最新新闻

  • 阴阳师自动化脚本:智能解放双手,告别重复游戏操作
  • 10分钟快速上手HS2-HF_Patch:Honey Select 2汉化去码补丁完全指南
  • 刘二大人pytorch教程课后作业(03—2)——随机梯度下降
  • 山西块状干冰
  • 数据驱动喊了三年,老板还在拍脑袋
  • 别再用假数据喂AI了!教你用统一接口采集个人微信聊天,补充真实知识库

日新闻

  • Qwen2.5-Turbo百万上下文实战指南:百炼平台长文本处理全解析
  • 怎么监控对标账号更新,2026年作者监控工作流,5款深度对比
  • EdgeRemover:专业级Windows Edge浏览器管理工具,彻底解决顽固软件卸载难题

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号