【C++ | 委托构造函数】委托构造函数 详解 及 例子源码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 C++11 的 委托构造函数 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰:

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、委托构造函数(delegating constructor)
    • ✨2.1 为什么需要委托构造函数?
    • ✨2.2 什么是委托构造函数?
  • 🎄三、声明、定义委托构造函数
  • 🎄四、委托构造函数的使用
  • 🎄五、总结



在这里插入图片描述

🎄一、概述

委托构造函数是C++11标准才支持的功能,也属于构造函数的一种。
委托构造函数在其成员初始化列表调用了本类其他构造函数来完成其部分或全部初始化工作。

本文主要介绍下面几点:
1、为什么需要委托构造函数?什么是委托构造函数?
2、怎样声明、定义委托构造函数?
3、怎样使用委托构造函数?


在这里插入图片描述

🎄二、委托构造函数(delegating constructor)

✨2.1 为什么需要委托构造函数?

使用 委托构造函数 的目的是:避免写重复的代码。

委托构造函数是C++11新增的特性。在没有委托构造函数之前,有时不得不在构造函数中写重复的代码:

// 构造函数定义
CDate::CDate(int year, int mon, int day):Max_Year(2039)
{
	m_year = year>Max_Year ? Max_Year : year;
	m_mon = mon;
	m_day = day;
	cout << "Calling Constructor" << ", this=" << this <<endl;
}

// 构造函数定义
CDate::CDate(int year, int mon):Max_Year(2039)
{
	m_year = year>Max_Year ? Max_Year : year;
	m_mon = mon;
	m_day = 1;
	cout << "Calling Constructor" << ", this=" << this <<endl;
}

// 构造函数定义
CDate::CDate(int year):Max_Year(2039)
{
	m_year = year>Max_Year ? Max_Year : year;
	m_mon = 1;
	m_day = 1;
	cout << "Calling Constructor" << ", this=" << this <<endl;
}

// 构造函数定义
CDate::CDate():Max_Year(2039)
{
	m_year = 2000;
	m_mon = 1;
	m_day = 1;
	cout << "Calling Constructor" << ", this=" << this <<endl;
}

而使用委托构造函数可以解决这种在多个构造函数中写重复代码的问题。


✨2.2 什么是委托构造函数?

委托构造函数也是构造函数的一种,它在其成员初始化列表中使用了其他构造函数来完成部分或全部初始化工作。

委托构造函数的特点:
1、没有返回值,函数名为类名;
2、成员初始化列表只允许调用一个本类的其他构造函数(可以是委托构造函数),不允许初始化其他成员;
3、函数体可能没有任何实现,只有一个{},也可以实现一部分初始化工作。

如果定义了委托构造函数,则gcc编译时必须指定-std=c++11以支持C++11标准


在这里插入图片描述

🎄三、声明、定义委托构造函数

这个小节以CDate类为例,介绍怎样声明、定义委托构造函数,我们还是以前面那4个构造函数为例.

  • 1、先写好函数名CDate
  • 2、在成员初始化列表里调用本类的一个构造函数,这个调用的构造函数可以也是委托构造函数。下面例子中都是调用CDate(int year, int mon, int day);
  • 3、实现函数体,本类中全部都不实现,只写了{}
CDate(int year, int mon, int day);	// 构造函数声明

CDate(int year, int mon):CDate(year,mon,1)	// 委托构造函数
{}

CDate(int year):CDate(year,1,1)				// 委托构造函数
{}

CDate():CDate(2000,1,1)						// 委托构造函数
{}
//CDate(){CDate(2000,1,1);}			// 报错,没初始化Max_Year

在这里插入图片描述

🎄四、委托构造函数的使用

这个小节主要介绍使用委托构造函数的注意点,以及给出完整的使用例子。

// g++ 21_Delegating_Constructor.cpp -std=c++11
#include <iostream>
using namespace std;

class CDate
{
public:
	CDate(int year, int mon, int day);	// 构造函数声明
	CDate(int year, int mon):CDate(year,mon,1){}// 委托构造函数
	CDate(int year):CDate(){}			// 委托构造函数
	CDate():CDate(2000,1,1){}					// 委托构造函数
	//CDate(){CDate(2000,1,1);}			// 报错,没初始化Max_Year
	
	void show()
	{
		cout << "Date: " << m_year << "." << m_mon << "." << m_day << ", this=" << this << endl;
	}
private:
	int m_year;
	int m_mon;
	int m_day;
	const int Max_Year;
};

// 构造函数定义
CDate::CDate(int year, int mon, int day):Max_Year(2039)
{
	m_year = year>Max_Year ? Max_Year : year;
	m_mon = mon;
	m_day = day;
	cout << "Calling Constructor(int,int,int)" << ", this=" << this <<endl;
}

int main()
{
	CDate date(2024,06,27);
	date.show();
	cout << endl;
	
	return 0;
}

在这里插入图片描述

🎄五、总结

👉本文介绍C++11的委托构造函数是什么,怎么声明、定义?怎样使用?

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

周边美食小程序系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;美食店铺管理&#xff0c;菜品分类管理&#xff0c;标签管理&#xff0c;菜品信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;美食店铺&#…

Python 面试【★★★】

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

springboot实习管理系统的设计与实现 LW +PPT+源码+讲解

第三章系统分析与设计 3.1 可行性分析 一个完整的系统&#xff0c;可行性分析是必须要有的&#xff0c;因为他关系到系统生存问题&#xff0c;对开发的意义进行分析&#xff0c;能否通过本系统来补充线下实习管理模式中的缺陷&#xff0c;去解决其中的不足等&#xff0c;通过对…

Java基础(五)——ArrayList

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

蓝卓出席“2024C?O大会”,探讨智能工厂建设新路径

6月29日&#xff0c;“2024C?O大会”在金华成功举办。此次大会由浙江省企业信息化促进会主办&#xff0c;与以往CIO峰会不同&#xff0c;“C?O”代表了企业数字化中的核心决策者群体&#xff0c;包括传统的CIO、CEO、CDO等。 本次大会围绕C?O、AIGC与制造业、数据价值、未来…

[NSSCTF]-Reverse:[SWPUCTF 2021 新生赛]easyapp(安卓逆向,异或)

无壳 把后缀名改为zip&#xff0c;找到apk 查看jadx 这里调用了MainActivity的lambda$onCreate$0$MainActivity&#xff0c;然后又调用了Encoder进行异或。 exp&#xff1a; result棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌 key987654321 flag for i in range(len(result)):flagchr(…

算法:链表题目练习

目录 链表的技巧和操作总结 常用技巧&#xff1a; 链表中的常用操作 题目一&#xff1a;反转一个单链表 题目二&#xff1a;链表的中间结点 题目三&#xff1a;返回倒数第k个结点 题目四&#xff1a;合并两个有序链表 题目五&#xff1a;移除链表元素 题目六&#xff…

Flutter TIM 项目实现

目录 1. 服务端API 1.1 生成签名 1.1.1 步骤 第一步:获取签名算法 第二步:查看函数输入输出 第三步:nodejs 实现功能 1.1.2 验证签名 小结 1.2 Rest API 调用 1.2.1 签名介绍 1.2.2 腾讯接口 生成管理员 administrator 签名 包装一个 post 请求函数 查询账号 …

ATL新能源科技薪资待遇及Verify测评语言理解数字推理题型简介

一、走进ATL新能源科技 ATL新能源公司&#xff0c;即东莞新能源科技有限公司&#xff0c;是全球领先的可充式锂离子电池研发、生产和营销企业。成立于2004年&#xff0c;总部位于香港&#xff0c;产品广泛应用于消费电子产品和电动汽车领域。ATL以其技术创新和与苹果等大客户的…

websocket基础使用学习

websocket基础使用学习 一、websocket是什么&#xff1f;二、使用步骤1.websocket服务的安装与启动安装服务连接与发消息 总结 一、websocket是什么&#xff1f; 以前&#xff0c;很多网站为了实现推送技术&#xff0c;所用的技术都是Ajax 轮询。轮询是在特定的的时间间隔&…

RocketMQ源码学习笔记:Broker接受消息和发送消息

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、技术亮点2.1、消息写入时的自旋锁和可重入锁2.2、堆外内存机制2.2.1、Overview2.2.2、源码2.2.2.1、开启堆外内存的条件2.2.2.2、堆外内存的初始化2.2.2.3、写消息到堆外内存2…

医院消防设施设备管理系统

医院为人员密集场所&#xff0c;且多为各类病患及其陪护人员&#xff0c;一旦发生火灾&#xff0c;人员疏散逃生困难&#xff0c;容易造成较严重的生命与财产损失。为规范医院的消防设施设备管理&#xff0c;通过凡尔码系统对医院消防设施设备进行信息化管理&#xff0c;提高医…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-21多输入多输出通道

21多输入多输出通道 import torch from d2l import torch as d2ldef corr2d(X, K):"""计算二维互相关运算"""h, w K.shapeY torch.zeros((X.shape[0] - h 1, X.shape[1] - w 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,…

大创项目推荐 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

文章目录 1 简介2 传统机器视觉的手势检测2.1 轮廓检测法2.2 算法结果2.3 整体代码实现2.3.1 算法流程 3 深度学习方法做手势识别3.1 经典的卷积神经网络3.2 YOLO系列3.3 SSD3.4 实现步骤3.4.1 数据集3.4.2 图像预处理3.4.3 构建卷积神经网络结构3.4.4 实验训练过程及结果 3.5 …

HarmonyOS开发:应用完整性校验

简介 为了确保应用的完整性和来源可靠&#xff0c;OpenHarmony需要对应用进行签名和验签。 应用开发阶段&#xff1a; 开发者完成开发并生成安装包后&#xff0c;需要开发者对安装包进行签名&#xff0c;以证明安装包发布到设备的过程中没有被篡改。OpenHarmony的应用完整性校…

【Docker0】网络更改

目录 1. 停止docker服务 2. 关闭docker默认桥接网络接口 3. 从系统删除docker0接口 4. 创建一个名为bridge0的新接口 5. 添加ip地址和子网掩码 6. 启用bridge0接口 7. &#xff08;如果没起来就执行该句&#xff09; 8. 查看ip 1. 停止docker服务 sudo service docker…

SpringBoot: Eureka入门

1. IP列表 公司发展到一定的规模之后&#xff0c;应用拆分是无可避免的。假设我们有2个服务(服务A、服务B)&#xff0c;如果服务A要调用服务B&#xff0c;我们能怎么做呢&#xff1f;最简单的方法是让服务A配置服务B的所有节点的IP&#xff0c;在服务A内部做负载均衡调用服务B…

Linux之进程控制(上)

目录 进程创建 进程终止 进程退出码 进程终止的方式 进程等待 进程等待的方式 status概述 总结 上期我们学习了Linux中进程地址空间的概念&#xff0c;至此进程的所有基本概念已经全部学习完成&#xff0c;今天我们将开始学习进程相关的操作。 进程创建 进程创建其实…

7 个不容忽视的开源安全工具

专业人士选择的第一个工具通常是开源选项,因为它们得到了广泛社区的保证和支持。此代码是支持安全可靠的互联网的基础的一部分。 最近,XZ Utils 等丑闻让用户犹豫不决。开放性是否是攻击的危险载体?还有其他问题在等着他们吗? 辩护者指出,虽然开放性可以让某些攻击变得更…

刷代码随想录有感(120):贪心算法——买卖股票的最佳时机

题干&#xff1a; 代码&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int low INT_MAX;int res INT_MIN;for(int i 0; i < prices.size(); i){low min(low, prices[i]);res max(res, prices[i] - low);}return res;} }; 贪心…