当前位置: 首页 > news >正文

C++新特性-简化构造相关

非静态数据成员默认初始化(11、20)

C++11标准提出了新的初始化方法,即在声明非静态数据成员的同时直接对其使用=或者{}初始化。如:

classX{private:inta=1;doubleb{0.1};std::string c{"dididi"};//必须使用{},不能使用()// auto x=1; 编译错误,不允许};

注意:构造函数初始化列表的优先级高于该默认初始化。

位域的默认初始化

C++20中我们可以对数据成员的位域进行默认初始化,如:

structA{inta:8=10;// 只占一个int的低8位,初始化位10intb:4{1};// 紧跟着a的前4位,初始化位1}

委托构造函数(11)

介绍

C++11之前,C++没有提供一种复用同类型构造函数的方法,即无法让一个构造函数将初始化的一部分工作委托给同类型的另外一个构造函数。这种功能的缺失就造成了程序员不得不编写重复烦琐代码的困境。

C++11标准支持了委托构造函数:某个类型的一个构造函数可以委托同类型的另一个构造函数对对象进行初始化。如:

classA{public:A(inta,intb):_a(a),_b(b){std::cout<<"run A(int,int)"<<std::endl;}// 委托给A(int,int)进行构造A(constA&other):A(other._a,other._b){std::cout<<"run A(const A&)"<<std::endl;}private:int_a;int_b;};

使用注意

  1. 不要循环委托。
  2. 一个构造函数进行了委托构造,初始化列表中即不能对数据成员和基类进行初始化。如:
classA{public:A(inta,intb):_a(a),_b(b){}A(constA&other):A(other._a,other._b),_a(1){}// 编译错误,委托后又对_a进行初始化private:int_a;int_b;};
  1. 执行顺序为:代理构造函数(即被委托构造函数)初始化列表->代理构造函数体->委托构造函数体。
  2. 代理构造函数完成后,委托构造函数抛出异常,则自动调用该类型的析构函数。

继承构造函数(11)

介绍

C++11之前,对于无数据成员的子类,在继承父类后,面对父类中大量的构造函数,必须同样编写大量构造函数,但仅仅只是转发构造参数,如:

classBase{public:Base():x_(0),y_(0.){};Base(intx,doubley):x_(x),y_(y){}Base(intx):x_(x),y_(0.){}Base(doubley):x_(0),y_(y){}voidSomeFunc(){}private:intx_;doubley_;};classDerived:publicBase{public:Derived(){};Derived(intx,doubley):Base(x,y){}Derived(intx):Base(x){}Derived(doubley):Base(y){}voidSomeFunc(){}};

C++11将using关键字的能力进行了扩展,使其能够引入基类的构造函数:

classBase{public:Base():x_(0),y_(0.){};Base(intx,doubley):x_(x),y_(y){}Base(intx):x_(x),y_(0.){}Base(doubley):x_(0),y_(y){}voidSomeFunc(){}private:intx_;doubley_;};classDerived:publicBase{public:usingBase::Base;/* 相当于让编译器去合成了Derived(int x, double y) : Base(x, y) {} 等上述一系列的构造函数 */voidSomeFunc(){}};

使用注意

  1. 继承构造函数不会继承默认构造和拷贝构造。
  2. 继承构造函数不影响子类默认构造的合成。
  3. 在派生类中声明签名相同(即参数列表相同)的构造函数会拒绝继承相应的构造函数。
  4. 派生类继承多个签名相同的构造函数会导致编译失败。
http://www.jsqmd.com/news/462615/

相关文章:

  • ROS2 Galactic版turtlesim小乌龟仿真全攻略:从安装到键盘控制实战
  • 数据库一体机简史:从Britton-Lee的陨落到Exadata和zData的智能复兴
  • Altium Designer2025安装避坑指南:从系统配置到许可证激活的全流程解析
  • C++新特性-列表初始化
  • 打开网站显示403 Forbidden(禁止访问)错误怎么办|已解决
  • HIC数据预处理实战:Hicup、ALLHiC和juicer三大工具保姆级教程(含避坑指南)
  • 智能家居玩家必备:用HACS解锁HomeAssistant隐藏玩法(支持HomeKit/米家双平台)
  • 兰州装修公司怎么选?这份“口碑爆棚”的装修公司名单请查收 - 装修热点在线
  • 立创EDA专业版实战:标准RGB接口40pin转50pin转接板设计与验证
  • 2026 年 AI 大模型资讯深度研究报告 / 2026 年 3 月 11 日
  • 2026年分期乐京东e卡回收行情:最新折扣与操作步骤详解 - 京回收小程序
  • STM32F4X GPIO实战:从点灯到按键消抖的完整开发指南
  • Android Media3 ExoPlayer 缓存功能实现与优化指南
  • DeepSeek-OCR-2保姆级教程:深求·墨鉴GPU监控脚本+显存泄漏排查+日志分析
  • AI营销时代下优质的 GEO服务商推荐,品牌显性化的必备指南 - 品牌策略主理人
  • Python实战:3步搞定MNIST数据集转PNG图片(附完整代码)
  • Winform实战指南:如何高效集成自定义控件库(dll)
  • 2026国内最新青少年祛痘品牌top5推荐! - 十大品牌榜
  • 华为设备VLAN通信故障排查:TPID配置关键点解析
  • 龙迅LT9611EX芯片深度解析:双端口MIPI转HDMI1.4转换器的设计与应用
  • 博通PEX89000 PCIe 5.0交换芯片:如何为AI集群构建高效GPU互联架构
  • FFmpeg实战:drawtext滤镜进阶应用与中文水印疑难解析
  • 2026年AI写作软件底层逻辑横评:长篇网文如何破局“上下文遗忘”与“AI消痕”?
  • PCB六层板排行2026 猎板领跑高可靠5G时代
  • PostgreSQL 主键优化:从自增ID到雪花算法的实战迁移
  • 解决supervisorctl连接拒绝:从版本冲突到源码安装的完整指南
  • 八层板打样评测,哪家高速信号做得稳?
  • DAMO-YOLO模型部署到移动端:Android集成实战指南
  • 告别磁盘告急!Apache DolphinScheduler 日志滚动与自动清理实战指南
  • STM32F407 ADC实战进阶:从规则通道到注入通道的编程指南与源码解析