日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

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

發(fā)布時(shí)間:2023/11/30 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 拷贝构造函数与赋值构造函数调用时机初步01 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#include <iostream> #include <string> using namespace std; class Person { public:char *m_name;int m_age;int m_id;Person() {cout << "默認(rèn)構(gòu)造函數(shù)" << endl;const char * name = "default";m_name = new char[strlen(name) + 1];strcpy(m_name, name); //復(fù)制的時(shí)候 會(huì)包含有 '\0' 結(jié)束符 m_age = 0;m_id = 0;}Person(const Person & p) {cout << "拷貝構(gòu)造函數(shù)" << 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 << "有參構(gòu)造" << endl;m_name = new char[strlen(name) + 1];strcpy(m_name, name);m_age = age;m_id = id;}Person& operator= (const Person &p) {cout << "賦值構(gòu)造" << 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 << "析構(gòu)函數(shù)" << 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; // 調(diào)用拷貝構(gòu)造 } Person & test4(Person &p) {return p; // 返回引用 沒(méi)有調(diào)用拷貝構(gòu)造 }void test1() {//Person p1;Person p2("Tom", 18, 1);//Person p3(p2); // 調(diào)用拷貝構(gòu)造//test2(p2); // 參數(shù)傳遞調(diào)用拷貝構(gòu)造 // test3(p2); // 參數(shù)傳遞調(diào)用拷貝構(gòu)造 里面的return 也是調(diào)用拷貝構(gòu)造 共調(diào)用兩次拷貝構(gòu)造//test4(p2); // 不調(diào)用構(gòu)造函數(shù)Person p4 = test4(p2); //調(diào)用一次拷貝構(gòu)造 ??? 為什么這里會(huì)調(diào)用 一次 拷貝構(gòu)造呢, 這個(gè)test4//函數(shù)返回的是一個(gè)引用, 引用賦值給 p4,為什么會(huì)調(diào)用拷貝構(gòu)造函數(shù)呢?// 是不是相當(dāng)于一下代碼 不是//Person p7(test4(p2)); // 這里調(diào)用兩次拷貝構(gòu)造//Person p5 = p2; // 調(diào)用拷貝構(gòu)造/* Person p6;p6 = p2; */ //這時(shí)候才會(huì)調(diào)用賦值構(gòu)造函數(shù) }int main() {test1();return 0; }

有個(gè)疑惑的地方 就是

//Person p4 = test4(p2); //調(diào)用一次拷貝構(gòu)造 ??? 為什么這里會(huì)調(diào)用 一次 拷貝構(gòu)造呢, 這個(gè)test4//函數(shù)返回的是一個(gè)引用, 引用賦值給 p4,為什么會(huì)調(diào)用拷貝構(gòu)造函數(shù)呢?//p4.show();

這里先簡(jiǎn)單記錄,后面想明白再回來(lái)更新

補(bǔ)充一點(diǎn)

// 賦值構(gòu)造函數(shù),要先判斷原來(lái)堆區(qū)是否有數(shù)據(jù),如果有先釋放

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。