跟我学C++中级篇——委托构造和继承构造

一、介绍

学习C++的开发者都知道,在C++的类定义中,传统的会有常见的六个默认和构造相关的函数(不明白的可以去查一下资料)。但在实际情况中,经常会遇到一些具体的开发场景,只用这几个函数可能还是会导致重复代码的出现。开发者在学习编程之初,估计都会有人不断告诉你,只要有重复代码,就有优化的可能性。
但是,如果代码的重复到了最基础的阶段,开发者一般就无能为力了,即使使用了一些特殊的技巧,也会导致代码的可读性和可维护性的降低。本篇主要是分析构造函数在重载和继承时遇到的重复代码的问题。

二、委托构造函数(Delegating constructors)

委托构造函数非常好理解,就是一个构造函数委托(调用)另外一个构造函数来实现。这样做的好处是显而易见的,不需要在两个及以上的构造函数上写重复的代码。比如一个类中有两个以上的构造函数,他们都要对至少两个以上的相同变量进行赋值,那么委托构造函数的优势就体现出来。下面看一下代码,就清楚了:

#include <iostream>class Example {
public:Example() : Example(0) {}//Example() : data_(d), len_(10), height_(10) {}//旧标准Example(int d) : data_(d), len_(10), height_(10) {}Example(const Example &ex) : Example(ex.data_) {}//旧标准,同上注释~Example() {}public:void Display() { std::cout << "data_,len_,heigth_ value:" << data_ << "," << len_ << "," << height_ << std::endl; }private:int data_;int len_;int height_;
};
int main() {Example ex;ex.Display();Example ex1(ex);ex.Display();return 0;
}

上面的代码很清晰,不再多言。这里说明一下为什么拷贝构造函数使用传引用?一是值传递复制不断重复产生递归调用导致栈溢出;另外一个是提高效率,引用不需要再拷贝一个副本 。

三、继承构造函数(Inheriting Constructors)

和上面一样,如果在继承中出现类似的现象,即子类调用父类的数据对象大多重复并且自身基本不需要再次处理的,那么在传统的C++代码中还是需要手动一个个的写出来,而在C++11的继承构造函数出现后就可以简化使用。

class Base {
public:Base() : data_(3) {}Base(int d) : data_(d), len_(10), height_(10) {}Base(int d, int l, int h) : data_(d), len_(l), height_(h) {}void Display(int d) { std::cout << "cur vlaue is:" << d << std::endl; }void Display(int d1, int d2) { std::cout << "cur vlaue is:" << d1 + d2 << std::endl; }protected:int data_;int len_;int height_;
};
class Derived : public Base {
public:using Base::Base;using Base::Display;//  Derived() {}//  Derived(int d) : Base(d) {}//  Derived(int d, int l, int h) : Base(d, l, h) {}void Display() { std::cout << "data_,len_,heigth_ value:" << data_ << "," << len_ << "," << height_ << std::endl; }
};int main() {Derived d(2, 3, 6);d.Display();d.Display(2);d.Display(2, 3);return 0;
}

同样,被重名继承隐藏的函数,通过使用using也可以展现出来。
此处需要注意的是,C++是支持多重继承的,如果在多重继承里,则无法使用这种方式,只能老实的按老的方式,手动一个个的写代码。

四、总结

前面反复分析过,语言的发展一定是向简单和自然化推进,这是一个方向,不可逆转的。而C++标准的前进也是如此,上面的两个例子其实就是这样的。换句话说,如果现在看到编程时仍然有重复的或者不方便的地方甚至啰嗦的地方,在未来的新标准中,一定会修正。无数的例子已经出现了,这个只要跟着标准前进的开发者都深有体会。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git仓库太大只下载单个文件或文件夹

有没有这样的苦恼&#xff1a;仓库太大&#xff0c;只想下载其中某些文件(夹)&#xff1f; 一招解决&#xff1a;bash down_folder_from_git.sh 运行前&#xff0c;先修改开头三个变量 原理: 稀疏检出 让工作树仅包含自定义的文件 #!/usr/bin/bash addrhttps://github.com/fac…

《打造卓越团队》自序

今天是我入职的第16天&#xff0c;阔别近8年&#xff0c;再次回到曾经工作过5年多的公司&#xff0c;百感交集。 熟悉的领导&#xff0c;一大半共事过的同事&#xff0c;快速拉进了我和团队的距离&#xff0c;毫无任何违和感&#xff0c;除了业务发展了很多&#xff0c;丝毫没…

大唐杯国赛解读及赛前准备分析

从参赛类别的区分到大唐杯名称由原来的“第九届‘大唐杯’全国大学生移动通信5G技术大赛”变更为“第九届‘大唐杯’全国大学生新一代信息通信技术大赛”一系列的变化。 接下来重点讲解本科A组的情况分析: 需要注意的是,和去年的比赛不同,今年并不是两人互相讨论,而是和省…

若依菜单名称过长显示不全怎么办?

菜单名称太长的话超出宽度部分会显示...,我们可以自己调整一下菜单的宽度或者设置一个title,这样鼠标移动上去显示完整的菜单名称。 目录 1、在layout\components\Sidebar\SidebarItem.vue文件设置:title 2、在layout\components\Sidebar\Item.

windows下QT如何集成OpenCV

说明 我在windows下使用QT Creator12创建的CMake项目&#xff0c;需要OpenCV的一些功能。由于安装的时候我选择的QT组件都是MInGW的&#xff0c;所以无法使用VS studio版本的dll库。 为什么vs的版本不能用 我安装QT选择的是MinGW版本&#xff0c;本地编译QT工程只能选择MinG…

XUbuntu22.04之Typora快捷键Ctrl+5不生效问题(二百二十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Android里面使用Java实现对字符串进行base64(sha256(“aa“))算法加密

一、步骤 1、新建工具类&#xff0c;添加转换方法 package .......import java.math.BigInteger; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; impor…

回溯dfs和分支限界bfs

一&#xff1a;拓扑排序 207. 课程表 这道题说白了就是在有向图中找环 拓扑排序实际上应用的是贪心算法。 贪心算法简而言之&#xff1a;每一步最优&#xff0c;全局就最优。 每一次都从图中删除没有前驱的顶点&#xff0c;这里并不需要真正的删除操作&#xff0c;通过设置入度…

数据可视化Grafana Windows 安装使用教程(中文版)

1.跳转连接 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/site?url 2.下载应用程序 官网地址&#xff1a;Grafana get started | Cloud, Self-managed, Enterprisehttps://grafana.com/get/ 3.修改配置文件 grafana\conf\defaults 4.启动\bin\目录下serve应用程序 浏…

원클릭으로 주류 전자상거래 플랫폼 상품 상세 데이터 수집 및 접속 시연 예제 (한국어판)

클릭 한 번으로 전자상거래 플랫폼 데이터를 캡처하는 것은 일반적으로 웹 페이지에서 정보를 자동으로 추출 할 수있는 네트워크 파충류 기술과 관련됩니다.그러나 모든 형태의 데이터 수집은 해당 웹 사이트의 사용 약관 및 개인 정보 보호 정책 및 현지 법률 및 규정을 준수…

天文算法--分点和至点

本文给出二分点和二至点的大约时间的算法。参考《天文算法》。适用年份为-1000年~3000年&#xff0c;精度在代码中给出。后续再补全高精度算法。 package cn.ancony.chinese_calendar;import lombok.AllArgsConstructor; import lombok.Data;import static java.lang.Math.*;/…

inno setup 卸载程序 删除整个安装目录

业务场景&#xff1a;有次客户反馈说&#xff0c;卸载应用程序没有卸载干净&#xff0c;安装目录下残留很多文件&#xff0c;特别是一些配置文件和数据库文件&#xff0c;涉及到一些数据安全机密。卸载程序应该把安装目录都要清除。操作如下&#xff1a; 卸载应用程序&#xf…

利用Redis实现简单的短信登录

在现代应用中&#xff0c;短信登录是一种常见的用户认证方式。它提供了一种便捷的登录方式&#xff0c;同时也增加了账户的安全性。在本文中&#xff0c;我们将介绍如何使用 Redis 实现短信登录的功能&#xff0c;并提供相应的 Java 实现层代码。 1、短信验证码的生成与存储当用…

Java自带的线程池及调用、ThreadPoolExecutor类(线程池的7大参数)、任务队列及底层原理

day32 线程池 引入 一个线程完成一项任务所需时间为&#xff1a; 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 注意&#xff1a;优化在Time1&#xff0c;Time3(创建销毁线程费时间) 为什么需要线程池 线程池技术正是关注如何缩短或调整Time1和Tim…

Facebook轮播广告是什么?投放过程中有哪些需要注意的吗?

轮播广告是Facebook广告形式中的一种&#xff0c;可以把3—5个广告合并到一个可滚动的广告单元中。轮播广告会出现在新鲜事即News Feed中&#xff0c;是独立站卖家常用的一种广告形式 为什么选择轮播广告&#xff1f; 转化率更高&#xff1a;相较于单图广告&#xff0c;轮播广…

基于单片机输出PWM 波控制的音乐喷泉系统设计

摘 要:随着经济、文化的发展,音乐喷泉作为一种观赏性较高的艺术水景,逐渐出现在全国城市中。但在音乐与喷泉喷射配合过程中,并没有实现二者同步,存在时滞。为此,设计了以STC89C52单片机为核心的小型音乐喷泉控制系统。音乐信号经放大通过A/D转换器处理,送入…

Springboot+vue的高校科研信息管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校科研信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#x…

计算机网络(第八版)-第1章课后习题参考答案

计算机网络(第八版)-第1章课后习题参考答案 本文是对自己之前文章的格式化&#xff1a;https://blog.csdn.net/qq_46396470/article/details/132788972?spm1001.2014.3001.5502 T1-01 计算机网络向用户可以提供哪些服务&#xff1f; 连通性和共享 &#xff0c;例如音频&…

修改docker容器日志大小

docker-compose.yaml logging:options:max-size: "10m"docker run docker run -d \--name example-container \--log-opt max-size10m \--log-opt max-file3 \nginx:latestdocker daemon全局配置 /etc/docker/daemon.json 参考文档&#xff1a;https://docs.docker…

【Node.JS】koa

文章目录 概述koa和express对比koa下载安装使用1.创建koa项目文件目录2. 创建koa服务3. 添加路由 koa-router4. 数据库服务 mongodb5. 添加请求参数json处理 koa-bodyparser6. 用户接口举例7.引入koa一些常用插件8.用户登录验证 koa-jwt9.webpack生产打包 来源 概述 Koa 是一个…