C++ 拷贝构造函数与赋值构造函数调用时机初步01

#include <iostream>
#include <string>
using namespace std;
class Person {
public:
	char *m_name;
	int m_age;
	int m_id;
	Person() {
		cout << "默认构造函数" << endl;
		const char * name = "default";
		m_name = new char[strlen(name) + 1];
		strcpy(m_name, name);  //复制的时候 会包含有 '\0' 结束符 
		m_age = 0;
		m_id = 0;
	}
	Person(const Person & p) {
		cout << "拷贝构造函数" << endl;
		m_name = new char[strlen(p.m_name) + 1];
		strcpy(m_name, p.m_name);
		m_age = p.m_age;
		m_id = p.m_id;
	}
	Person(const char *name, int age, int id) {
		cout << "有参构造" << endl;
		m_name = new char[strlen(name) + 1];
		strcpy(m_name, name);
		m_age = age;
		m_id = id;
	}
	Person& operator= (const Person &p) {
		cout << "赋值构造" << endl;
		m_name = new char[strlen(p.m_name) + 1];
		strcpy(m_name, p.m_name);
		m_age = p.m_age;
		m_id = p.m_id;
		return *this;
	}
	~Person() {
		cout << m_name << "析构函数" << endl;
		if (m_name != NULL) {
			delete[] m_name;
			m_name = NULL;
		}
	}
	void show() {
		cout << "name is " << m_name << " age is " << m_age << endl;
	}
};
void test2(Person p) {
	p.show();
}
Person test3(Person p) {
	return p;  // 调用拷贝构造
}
Person & test4(Person &p) {
	return p;   // 返回引用 没有调用拷贝构造
}

void test1() {
	//Person p1;
	Person p2("Tom", 18, 1);
	//Person p3(p2); // 调用拷贝构造
	//test2(p2);  // 参数传递调用拷贝构造  
	// test3(p2);   // 参数传递调用拷贝构造  里面的return 也是调用拷贝构造  共调用两次拷贝构造
	//test4(p2);     // 不调用构造函数
	
	Person p4 = test4(p2); //调用一次拷贝构造   ???  为什么这里会调用 一次 拷贝构造呢, 这个test4
							 //函数返回的是一个引用, 引用赋值给 p4,为什么会调用拷贝构造函数呢?
	// 是不是相当于一下代码   不是
	//Person p7(test4(p2));   // 这里调用两次拷贝构造
	
	//Person p5 = p2;   // 调用拷贝构造


/*	Person p6;
	p6 = p2;    */   //这时候才会调用赋值构造函数
}

int main()
{
	test1();
	return 0;
}

有个疑惑的地方 就是

	//Person p4 = test4(p2); //调用一次拷贝构造   ???  为什么这里会调用 一次 拷贝构造呢, 这个test4
							 //函数返回的是一个引用, 引用赋值给 p4,为什么会调用拷贝构造函数呢?
	//p4.show();

这里先简单记录,后面想明白再回来更新

补充一点

// 赋值构造函数,要先判断原来堆区是否有数据,如果有先释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值