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

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

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



在这里插入图片描述

🎄一、概述

委托构造函数是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

在这里插入图片描述

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

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

这里有个问题,如果不使用委托构造函数,而是编写一个普通构造函数,然后在函数体去调用其他构造函数,CDate(){CDate(2000,1,1);},这样不行吗?这样的话会报错,没有初始化Max_Year字段。如果使用委托构造函数并在其成员参数列表中调用CDate():CDate(2000,1,1){}就是正确的。

下面是使用委托构造函数的完整例子和运行结果。

// 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)// 委托构造函数	
	{
		cout << "Calling Delegating Constructor(int, int)" << endl;
	}
	CDate(int year):CDate(year,1,1)		// 委托构造函数
	{
		cout << "Calling Delegating Constructor(int)" << endl;
	}
	CDate():CDate(2000,1,1)				// 委托构造函数
	{
		cout << "Calling Delegating Constructor()" << endl;
	}
	//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;
	
	CDate date1(2024,06);
	date1.show();
	cout << endl;
	
	CDate date2(2024);
	date2.show();
	cout << endl;
	
	CDate date3;
	date3.show();
	cout << endl;
	
	return 0;
}

运行结果:
在这里插入图片描述


在这里插入图片描述

🎄五、总结

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

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

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wkd_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值