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

c++11新特性篇-委托构造函数和继承构造函数

C++11引入了委托构造函数(Delegating Constructor)和C++11及后续标准引入了继承构造函数(Inheriting Constructor)两个特性。

1.委托构造函数

委托构造函数是C++11引入的一个特性,它允许一个构造函数调用同一类的另一个构造函数,从而避免在类内部出现相似的初始化代码,提高代码的可维护性。在构造函数的初始化列表中使用 : 符号,可以调用同一类中的其他构造函数

下面是一个简单的例子,展示了如何使用委托构造函数:

#include <iostream>
using namespace std;class Myclass {
public:// 有参构造Myclass(int x, int y):m_X(x), m_Y(y) {}// 无参构造调用有参构造Myclass(): m_X(0), m_Y(10) {}public:int m_X;int m_Y;
};void test01() {// 利用无参构造创建对象// 两个属性值会直接初始化为0和10Myclass mc;cout << mc.m_X << endl; // 0cout << mc.m_Y << endl; // 10}int main() {test01();return 0;
}

在上述例子中,有参构造函数负责实际的初始化工作,而无参构造函数则使用了委托构造函数的方式,通过调用有参构造函数来完成初始化。这样,无参构造函数就避免了代码的重复,并且仍然能够正确地初始化对象。

需要注意的是,委托构造函数的调用必须出现在构造函数的初始化列表中在构造函数主体中调用其他构造函数是不允许的。

使用委托构造函数可以使得类的构造函数更加灵活,能够复用已有的构造函数,减少代码冗余。

2.继承构造函数

C++11中提供的继承构造函数可以让派生类直接使用基类的构造函数,而无需自己再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大地简化派生类构造函数的编写。先来看没有继承构造函数之前的处理方式:

#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:Child(int i) :Base(i) {}Child(int i, double j) :Base(i, j) {}Child(int i, double j, string k) :Base(i, j, k) {}
};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;
}

通过测试代码可以看出,在子类中初始化从基类继承的类成员,需要在子类中重新定义和基类一致的构造函数,这是非常繁琐的,C++11中通过添加继承构造函数这个新特性完美的解决了这个问题,使得代码更加精简。

继承构造函数的使用方法是这样的:通过使用using 类名::构造函数名(其实类名和构造函数名是一样的)来声明使用基类的构造函数,这样子类中就可以不定义相同的构造函数了,直接使用基类的构造函数来构造派生类对象。

#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 c1(520, 13.14);cout << "int: " << c1.m_i << ", double: " << c1.m_j << endl;Child c2(520, 13.14, "i love you");cout << "int: " << c2.m_i << ", double: " << c2.m_j << ", string: " << c2.m_k << endl;return 0;
}

在修改之后的子类中,没有添加任何构造函数,而是添加了using Base::Base;这样就可以在子类中直接继承父类的所有的构造函数,通过他们去构造子类对象了

另外如果在子类中隐藏了父类中的同名函数,也可以通过using的方式在子类中使用基类中的这些父类函数:

#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) {}void func(int i){cout << "base class: i = " << i << endl;}void func(int i, string str){cout << "base class: i = " << i << ", str = " << str << endl;}int m_i;double m_j;string m_k;
};class Child : public Base
{
public:using Base::Base;using Base::func;void func(){cout << "child class: i'am luffy!!!" << endl;}
};int main()
{Child c(250);c.func();c.func(19);c.func(19, "luffy");return 0;
}

上述示例代码输出的结果为:

child class: i'am luffy!!!
base class: i = 19
base class: i = 19, str = luffy

子类中的func()函数隐藏了基类中的两个func()因此默认情况下通过子类对象只能调用无参的func(),在上面的子类代码中添加了using Base::func;之后,就可以通过子类对象直接调用父类中被隐藏的带参func()函数了。

需要注意的是,using 关键字引入的基类函数在派生类中并不变成虚函数。如果你需要达到虚函数的效果,可以在基类中将相应的函数声明为虚函数。

相关文章:

c++11新特性篇-委托构造函数和继承构造函数

C11引入了委托构造函数&#xff08;Delegating Constructor&#xff09;和C11及后续标准引入了继承构造函数&#xff08;Inheriting Constructor&#xff09;两个特性。 1.委托构造函数 委托构造函数是C11引入的一个特性&#xff0c;它允许一个构造函数调用同一类的另一个构造…...

Flink SQL处理回撤流(Retract Stream)案例

Flink SQL支持处理回撤流&#xff08;Retract Stream&#xff09;&#xff0c;下面是一个使用Flink SQL消费回撤流的案例&#xff1a; 假设有一个数据流&#xff0c;包含用户的姓名和年龄&#xff0c;希望计算每个姓名的年龄总和。 以下是示例代码&#xff1a; // 创建流执行…...

6.5.事件图层(MapEventsOverlay)

愿你出走半生,归来仍是少年&#xff01; 简单来说就是一个不参与绘制但是可进行交互的图层&#xff0c;它具备了单击和长按的交互功能。 booleanonSingleTapConfirmed(MotionEvent e, MapView mapView)booleanonLongPress(MotionEvent e, MapView mapView) 通过继承它重写上方…...

供暖系统如何实现数据远程采集?贝锐蒲公英高效实现智慧运维

山西某企业专注于暖通领域&#xff0c;坚持为城市集中供热行业和楼宇中央空调行业提供全面、专业的“智慧冷暖”解决方案。基于我国供热行业的管理现状&#xff0c;企业成功研发并推出了可将能源供应、管理与信息化、自动化相融合的ICS-DH供热节能管理系统。 但是&#xff0c;由…...

Flutter笔记:关于Flutter中的大文件上传(上)

Flutter笔记 关于Flutter中的大文件上传&#xff08;上&#xff09; 大文件上传背景与 Flutter 端实现文件分片传输 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#…...

腾讯云CVM服务器5年可选2核4G和4核8G配置

腾讯云服务器网整理五年云服务器优惠活动 txyfwq.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;…...

数据结构:反射

基本概念 反射中的四个类 Class类 Java文件在被编译之后&#xff0c;生成了.class文件&#xff0c;JVM此时解读.class文件&#xff0c;将其解析为java.lang.Class 对象&#xff0c;在程序运行时每个java文件就最终变成了Class类对象的一个实例。通过反射机制应用这个 实例就…...

45 深度学习(九):transformer

文章目录 transformer原理代码的基础准备位置编码Encoder blockmulti-head attentionFeed Forward自定义encoder block Deconder blockEncoderDecodertransformer自定义loss 和 学习率mask生成函数训练翻译 transformer 这边讲一下这几年如日中天的新的seq2seq模式的transform…...

java中用javax.servlet.ServletInputStream.readLine有什么安全问题吗?怎么解决实例?

使用 javax.servlet.ServletInputStream.readLine 方法在处理 Servlet 请求时可能存在以下安全问题&#xff0c;以及相应的解决方案&#xff1a; 缓冲区溢出&#xff1a;readLine 方法会将数据读取到一个缓冲区中&#xff0c;并根据换行符分隔成行。如果输入流中包含过长的行或…...

面试官问 Spring AOP 中两种代理模式的区别?很多面试者被问懵了

面试官问 Spring AOP 中两种代理模式的区别?很多初学者栽了跟头&#xff0c;快来一起学习吧&#xff01; 代理模式是一种结构性设计模式。为对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象&#xff0c;并允许在将请求提交给对象前后进行一…...

MQ四大消费问题一锅端:消息不丢失 + 消息积压 + 重复消费 + 消费顺序性

RabbitMQ-如何保证消息不丢失 生产者把消息发送到 RabbitMQ Server 的过程中丢失 从生产者发送消息的角度来说&#xff0c;RabbitMQ 提供了一个 Confirm&#xff08;消息确认&#xff09;机制&#xff0c;生产者发送消息到 Server 端以后&#xff0c;如果消息处理成功&#xff…...

Python爬虫——入门爬取网页数据

目录 前言 一、Python爬虫入门 二、使用代理IP 三、反爬虫技术 1. 间隔时间 2. 随机UA 3. 使用Cookies 四、总结 前言 本文介绍Python爬虫入门教程&#xff0c;主要讲解如何使用Python爬取网页数据&#xff0c;包括基本的网页数据抓取、使用代理IP和反爬虫技术。 一、…...

爬虫,TLS指纹 剖析和绕过

当你欲爬取某网页的信息数据时&#xff0c;发现通过浏览器可正常访问&#xff0c;而通过代码请求失败&#xff0c;换了随机ua头IP等等都没什么用时&#xff0c;有可能识别了你的TLS指纹做了验证。 解决办法&#xff1a; 1、修改 源代码 2、使用第三方库 curl-cffi from curl…...

Linux shell编程学习笔记25:tty

1 tty的由来 在 1830 年代和 1840 年代&#xff0c;开发了称为电传打字机&#xff08;teletypewriters&#xff09;的机器&#xff0c;这些机器可以将发件人在键盘上输入的消息“沿着线路”发送在接收端并打印在纸上。 电传打字机的名称由teletypewriters&#xff0c; 缩短为…...

AIGC大模型-初探

大语⾔模型技术链 1. ⾃然语⾔处理 2. 神经⽹络 3. ⾃注意⼒机制 4. Transformer 架构 5. 具体模型 - GPT6. 预训练&#xff0c;微调 7. ⼤模型应⽤ - LangChain 大语⾔模型有什么用&#xff1f; 利⽤⼤语⾔模型帮助我们理解⼈类的命令&#xff0c;从⽽处理⽂本分析…...

Postman for Mac(HTTP请求发送调试工具)v10.18.10官方版

Postman for mac是一个提供在MAC设备上功能强大的开发&#xff0c;监控和测试API的绝佳工具。非常适合开发人员去使用。此版本通过Interceptor添加了对请求捕获的支持&#xff0c;修正了使用上下文菜单操作未复制响应正文的问题和预请求脚本的垂直滚动条与自动完成下拉列表重叠…...

SpringBoot 项目优雅实现读写分离 | 京东云技术团队

一、读写分离介绍 当使用Spring Boot开发数据库应用时&#xff0c;读写分离是一种常见的优化策略。读写分离将读操作和写操作分别分配给不同的数据库实例&#xff0c;以提高系统的吞吐量和性能。 读写分离实现主要是通过动态数据源功能实现的&#xff0c;动态数据源是一种通过…...

企业如何利用好用户画像对客户进行精准营销?提高营销转化?

随着市场竞争的加剧&#xff0c;企业对于客户的需求和行为越来越关注&#xff0c;如何利用好用户画像对客户进行精准营销&#xff0c;提高营销转化&#xff0c;成为企业关注的焦点。 一、了解用户需求和行为 首先&#xff0c;企业需要了解客户的需求和行为&#xff0c;包括客户…...

acwing算法基础之搜索与图论--匈牙利算法求二分图的最大匹配数

目录 1 基础知识2 模板3 工程化 1 基础知识 二分图中的最大匹配数&#xff1a;从二分图中选择一些边&#xff08;这些边连接集合A和集合B&#xff0c;集合A中结点数目为n1&#xff0c;集合B中结点数目为n2&#xff09;&#xff0c;设为集合S&#xff0c;其中任意两条边不共用一…...

优化重复冗余代码的8种方式

文章目录 前言1、抽取公用方法2、抽工具类3、反射4、泛型5、继承与多态6、使用设计模式7、自定义注解(或者说AOP面向切面)8、函数式接口和Lambda表达式 前言 日常开发中&#xff0c;我们经常会遇到一些重复代码。大家都知道重复代码不好&#xff0c;它主要有这些缺点&#xff…...

【C++ 面试突击 · 07】大厂高频面试题:从菱形继承到const与constexpr的博弈深度解析

目录 1. 什么是菱形继承&#xff1f;怎么解决菱形继承&#xff1f; 2. 如何定义一个只能在堆上&#xff08;栈上&#xff09;生成对象的类&#xff1f; 3. C 强制类型转换运算符有哪些&#xff1f; 4. C 中的类型推导&#xff08;auto&#xff09;是如何工作的&#xff1f;…...

避坑指南:GD32F407移植FATFS到SD卡,这几个STM32老司机常踩的坑你别再跳了

GD32F407 FATFS移植避坑实战&#xff1a;STM32老手最容易忽略的5个硬件差异 从STM32切换到GD32F407的开发者&#xff0c;往往带着"Pin to Pin兼容"的预期开始SD卡文件系统移植&#xff0c;却在调试阶段遭遇各种诡异问题。上周一位资深工程师向我展示了他的调试记录&a…...

别再只盯着Loss曲线了!TensorBoard的SCALARS面板还有这些隐藏玩法(附GAN训练实战)

解锁TensorBoard SCALARS面板的隐藏战力&#xff1a;从GAN训练曲线中洞察模型灵魂 当你盯着GAN训练中那对纠缠不清的生成器和判别器Loss曲线时&#xff0c;是否感觉像在解读一部悬疑小说&#xff1f;TensorBoard的SCALARS面板远比大多数开发者想象的强大——它不仅是数据的展示…...

【Unity 贪吃蛇大作战模板】高并发IO游戏怎么做?拆解Snake Warz核心架构

Snake Warz IO 是一个基于 Photon Fusion v2 构建的多人在线贪吃蛇游戏完整模板。它不仅提供了可直接上线的游戏内容&#xff0c;还涵盖了完整的多人联机框架、AI系统、UI流程以及跨平台适配能力。该插件支持最多 10 名真实玩家与 30 个 AI 同场竞技&#xff0c;并提供多种游戏…...

AI编程专栏(三) - Cursor 高级技巧与实战优化

1. Cursor高级功能深度解析 第一次接触Cursor时&#xff0c;你可能觉得它就是个带AI的代码编辑器。但当我真正用它完成一个企业级项目后&#xff0c;才发现那些藏在深处的功能才是真正的生产力神器。比如最近在重构一个老旧的React项目时&#xff0c;通过合理使用MCP协议&#…...

如何用ViGEmBus实现Windows内核级游戏手柄模拟:架构解析与实践指南

如何用ViGEmBus实现Windows内核级游戏手柄模拟&#xff1a;架构解析与实践指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款Windows内核模…...

通义千问1.5-1.8B-Chat-GPTQ-Int4实战:构建智能软件测试用例生成器

通义千问1.5-1.8B-Chat-GPTQ-Int4实战&#xff1a;构建智能软件测试用例生成器 如果你是一名软件测试工程师&#xff0c;下面这个场景你一定不陌生&#xff1a;产品经理扔过来一份几十页的需求文档&#xff0c;或者开发同学更新了一个复杂的接口&#xff0c;而你需要在短时间内…...

从零到一:超外差收音机DIY全流程解析与调试心法

1. 超外差收音机原理精要 第一次接触超外差收音机时&#xff0c;我被这个拗口的专业名词吓到了。但拆解开来理解其实很简单——"超"指的是本振频率超过信号频率&#xff0c;"外差"则是混频产生差频的过程。这种设计巧妙地把不同电台信号都转换成固定的465k…...

为Jetson AGX添加自定义硬件:手把手编写设备树节点驱动LED与PPS

Jetson AGX硬件扩展实战&#xff1a;从设备树节点到LED与PPS驱动开发 在嵌入式开发领域&#xff0c;Jetson AGX Xavier凭借其强大的计算能力和丰富的接口资源&#xff0c;成为工业控制、机器人视觉等高性能场景的首选平台。但要让这块开发板真正发挥潜力&#xff0c;掌握自定义…...

NeoPixel Painter:嵌入式HSV动画的固定点实现

1. NeoPixel Painter 库概述NeoPixel Painter 是一个面向嵌入式 LED 动画开发的轻量级 Arduino 库&#xff0c;专为简化 WS2812B&#xff08;NeoPixel&#xff09;LED 灯带的动态效果编程而设计。它并非对 Adafruit_NeoPixel 库的简单封装&#xff0c;而是构建在其之上的状态驱…...