日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2023/11/30 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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();

這里先簡單記錄,后面想明白再回來更新

補充一點

// 賦值構造函數,要先判斷原來堆區是否有數據,如果有先釋放

總結

以上是生活随笔為你收集整理的C++ 拷贝构造函数与赋值构造函数调用时机初步01的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。