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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

对象特性---->深拷贝与浅拷贝

發(fā)布時(shí)間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对象特性---->深拷贝与浅拷贝 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

淺拷貝:簡單的賦值拷貝操作。

深拷貝:在堆區(qū)申請(qǐng)一塊空間,進(jìn)行拷貝操作。

淺拷貝:編譯器提供的拷貝構(gòu)造函數(shù)對(duì)傳入值進(jìn)行賦值拷貝操作

#include<iostream>
using namespace std;class Person
{
public:Person(){cout << "Person無參構(gòu)造函數(shù)的調(diào)用" << endl;}Person(int age){cout << "Person有參構(gòu)造函數(shù)的調(diào)用" << endl;m_Age = age;}~Person(){cout << "Person析構(gòu)函數(shù)的調(diào)用" << endl;}int m_Age;
};void test01()
{Person p1(18);cout << "p1的年齡是: " << p1.m_Age << endl;Person p2(p1);cout << "p2的年齡是: " << p2.m_Age << endl;
}int main()
{test01();system("pause");return 0;
}

上述代碼類中我們沒有寫入拷貝構(gòu)造函數(shù),但是運(yùn)行毫無問題,這是編譯器為我們提供了拷貝構(gòu)造函數(shù),并且我們稱這種拷貝為淺拷貝;

深拷貝:在堆區(qū)申請(qǐng)一塊空間,進(jìn)行拷貝操作。

#include<iostream>
using namespace std;class Person
{
public:Person(){cout << "Person無參構(gòu)造函數(shù)的調(diào)用" << endl;}Person(int age,int height){m_Age = age;m_Height = new int(height);cout << "Person有參構(gòu)造函數(shù)的調(diào)用" << endl;}~Person(){if (m_Height != NULL)    //標(biāo)準(zhǔn)的對(duì)堆區(qū)空間釋放的一個(gè)格式{delete m_Height;m_Height = NULL;}cout << "Person析構(gòu)函數(shù)的調(diào)用" << endl;}int m_Age;int* m_Height;   //這塊為什么要把類型寫為int*呢,因?yàn)槎褏^(qū)申請(qǐng)的空間為空間首地址
};                   //s所以拿指針來接收void test01()
{Person p1(18,160);cout << "p1的年齡是: " << p1.m_Age << "身高為: " << *p1.m_Height << endl;Person p2(p1);cout << "p2的年齡是: " << p2.m_Age << "身高為: " << *p2.m_Height << endl;
}int main()
{test01();system("pause");return 0;
}

重點(diǎn):上述代碼中的int* m_Height為什么要將類型寫為int*呢? ?因?yàn)槎褏^(qū)申請(qǐng)的空間為空間首地址,所以得拿指針來接收

但是很不幸的是 上述代碼會(huì)報(bào)錯(cuò):

?錯(cuò)誤原因就是:其中0x112233只是舉個(gè)例子而已,并不是說地址真的是0x112233

因?yàn)榫幾g器所給出的拷貝構(gòu)造函數(shù)如下圖,所以會(huì)出現(xiàn)重復(fù)釋放內(nèi)存而報(bào)錯(cuò)的情況?

Person(const Person& p)
{cout << "Person拷貝構(gòu)造函數(shù)的調(diào)用" << endl;m_Age = p.m_Age;m_Height = p.m_Height;  //如果用編譯器給的拷貝構(gòu)造函數(shù)就是這樣的底層邏輯
}

正確的拷貝構(gòu)造函數(shù):

Person(const Person& p)
{cout << "Person拷貝構(gòu)造函數(shù)的調(diào)用" << endl;m_Age = p.m_Age;m_Height = new int(*p.m_Height);
}

原理如下:

?這就是深拷貝的原理。

深拷貝所有代碼如下:

#include<iostream>
using namespace std;class Person
{
public:Person(){cout << "Person無參構(gòu)造函數(shù)的調(diào)用" << endl;}Person(int age,int height){m_Age = age;m_Height = new int(height);cout << "Person有參構(gòu)造函數(shù)的調(diào)用" << endl;}Person(const Person& p){cout << "Person拷貝構(gòu)造函數(shù)的調(diào)用" << endl;m_Age = p.m_Age;m_Height = new int(*p.m_Height);}~Person(){if (m_Height != NULL){delete m_Height;m_Height = NULL;}cout << "Person析構(gòu)函數(shù)的調(diào)用" << endl;}int m_Age;int* m_Height;
};void test01()
{Person p1(18,160);cout << "p1的年齡是: " << p1.m_Age << "身高為: " << *p1.m_Height << endl;Person p2(p1);cout << "p2的年齡是: " << p2.m_Age << "身高為: " << *p2.m_Height << endl;
}int main()
{test01();system("pause");return 0;
}

代碼這東西? 真的是三天不敲手生了? 一周不敲可能連頭文件都能寫錯(cuò)了,所以兄弟們記得每天練習(xí)!!!沖沖沖!!!

撐不住的時(shí)候,可以對(duì)自己說聲“我好累”,永遠(yuǎn)不要在心里承認(rèn)說“我不行”。

總結(jié)

以上是生活随笔為你收集整理的对象特性---->深拷贝与浅拷贝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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