#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();
这里先简单记录,后面想明白再回来更新
补充一点
// 赋值构造函数,要先判断原来堆区是否有数据,如果有先释放