C++中拷贝构造函数的使用

举报
努力变强的小C 发表于 2022/09/28 19:51:01 2022/09/28
【摘要】 C++中拷贝构造函数的使用

目录


 一、拷贝构造函数的概念

二、拷贝构造函数的初识

三、拷贝构造函数定义方法 

四、 拷贝构造函数调用的条件

五、拷贝构造函数必须以引用的形式传递(参数为引用值)。

 一、拷贝构造函数的概念

拷贝构造函数是一种特殊的构造函数,拷贝构造函数的作用是在创建一个新对象是,使用一个已经存在的对象去初识化这个新对象,

下面我来举一个例子:

Point p2(p1)

这个的作用是在创建p1这个新对象的时候使用本来就存在的对象p2去初始化p1,在这个初始化的过程中我们就需要调用到拷贝构造函数

二、拷贝构造函数的初识

  1. 由于拷贝构造函数也是一种构造函数,所以它的函数名也是要和类名相等的,并且也是没有返回值的
  2. 拷贝构造函数只有一个同类对象引用的参数
  3. 每个类必须要有一个拷贝构造函数,我们可以自定义拷贝构造函数,也可以不自定义使用系统随机自动生成的一个默认的拷贝构造函数

三、拷贝构造函数定义方法 

自定义拷贝构造函数的一般形式:

类名::类名(const 类名 &对象名){
    拷贝构造函数的函数体
    ……………………
}

下面我们就来举一个简单的例子

#include <iostream>
using namespace std; 
class Score {
	private:
		int age, score;
	public:
		Score(int a, int s);	//创建一个自定义的构造函数
		~Score();				//首先声明一个析构函数
		Score(const Score& p);	//自定义的拷贝构造函数
		void print_age();			//输出对象的年龄
};
Score::Score(int a, int s) {
	cout << "我是构造函数,现在已执行……" << endl;
	age = a;
	score = s;
}
Score::~Score() {
	cout << "对象注销,现在自动执行析构函数了……" << endl;
}
Score::Score(const Score& p) {
	age = p.age;
	score = p.score;
	cout << "拷贝构造函数已经使用……" << endl;
}
void Score::print_age() {
	cout << age << endl;
}
int main() {
	Score score2(18, 100);
	Score score3(score2);	//调用拷贝构造函数方法一,拷贝score2
	Score score4 = score2;	//调用拷贝构造函数方法二,拷贝score2
	score2.print_age();
	score3.print_age();
	score4.print_age();
}

输出结果:



四、 拷贝构造函数调用的条件

1、当用一个类的对象去初始化同类的另一个对象的时候。正如上面例子的这两条语句:

	Score score3(score2);	//调用拷贝构造函数方法一,拷贝score2
	Score score4 = score2;	//调用拷贝构造函数方法二,拷贝score2

2、当一个函数的形参是一个类的对象的时候,且调用函数对形参与实参的结合时

3、当函数返回值是一个对象的时候


 

五、拷贝构造函数必须以引用的形式传递(参数为引用值)。

当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。