1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C++ 拷贝构造函数与赋值构造函数调用时机初步01

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

时间:2021-01-26 04:22:20

相关推荐

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();

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

补充一点

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。