C++中淺拷貝與深拷貝的詳解及其作用介紹
概述
淺拷貝 (shallow copy) 只是對(duì)指針的拷貝, 拷貝夠兩個(gè)指針指向同一個(gè)內(nèi)存空間. 深拷貝 (deep copy) 不但對(duì)指針進(jìn)行拷貝, 而且對(duì)指針指向的內(nèi)容進(jìn)行拷貝. 經(jīng)過深拷貝后的指針是指向兩個(gè)不同地址的指針.

對(duì)象的賦值
同類對(duì)象之間可以相互賦值. 對(duì)象賦值的一般形式:
對(duì)象名1 = 對(duì)象名2;
舉個(gè)栗子:
int main() {
Time t1(6,6,6);
Time t2 = t1; // 對(duì)象賦值
return 0;
}
實(shí)現(xiàn)原理: 賦值運(yùn)算符的重載.
對(duì)象的復(fù)制
對(duì)象的復(fù)制即用已有的對(duì)象克隆出一個(gè)新對(duì)象. 對(duì)象復(fù)制的一般格式:
類名 對(duì)象2(對(duì)象1);
舉個(gè)栗子:
int main() {
Time t1(8, 8, 8);
Time t2(t1); // 對(duì)象的復(fù)制
return 0;
}
int main() {
Time t1(8, 8, 8);
Time t2 = t1; // 對(duì)象的復(fù)制
return 0;
}
原理: 編譯系統(tǒng)默認(rèn)提供的默認(rèn)復(fù)制構(gòu)造函數(shù). 如:
Time::Time(const Time& t){
hour = t.hour;
minute = t.minute;
second = t.second;
}
對(duì)象復(fù)制的用途
建立一個(gè)新對(duì)象
我們可以利用復(fù)制構(gòu)造函數(shù)進(jìn)行初始化而建立一個(gè)新對(duì)象.
Time t2(t1);
函數(shù)的參數(shù)為類對(duì)象
通過調(diào)用復(fù)制的構(gòu)造函數(shù)來建立一個(gè)實(shí)參的拷貝, 在調(diào)用函數(shù)時(shí)我們可以將實(shí)參對(duì)象完整的傳遞給形參. 例如:
void fun(Time time);
using namespace std;
int main() {
Time t1(8, 8, 8);
fun(t1);
return 0;
}
void fun(Time time) {
cout << "function" << endl;
}
函數(shù)的返回值為類對(duì)象
當(dāng)函數(shù)調(diào)用完畢, 我們需要通過調(diào)用復(fù)制的構(gòu)造函數(shù)將函數(shù)中的對(duì)象復(fù)制一個(gè)臨時(shí)的對(duì)象并返回. 例如:
Time fun();
using namespace std;
int main() {
Time t2;
t2 = fun();
return 0;
}
Time fun() {
Time t1(8, 8,8);
return t1;
}
淺拷貝
淺拷貝 (Shallow Copy) 只復(fù)制某個(gè)對(duì)象的指針, 而不復(fù)制對(duì)象本身, 新舊對(duì)象還是共享同一塊內(nèi)存.

Test 類:
#ifndef PROJECT2_TEST_H
#define PROJECT2_TEST_H
class Test {
public:
int x;
Test(int n);
void show();
};
#endif //PROJECT2_TEST_H
Test.cpp:
#include <iostream>
#include "Test.h"
using namespace std;
Test::Test(int n) : x(n){}
void Test::show() {
cout << x << endl;
}
main:
#include "Test.h"
#include <iostream>
using namespace std;
int main() {
Test *pt1 = new Test(100);
Test *pt2 = pt1;
pt1 -> x = 5;
pt1 -> show();
pt2 -> show();
delete pt1;
delete pt2;
return 0;
}
輸出結(jié)果:
5
5
深拷貝
深拷貝 (Deep Copy) 在拷貝的過程中會(huì)另外創(chuàng)造一個(gè)一模一樣的對(duì)象. 新對(duì)象跟原對(duì)象不共享內(nèi)存, 修改新對(duì)象不會(huì)改到原對(duì)象. 例如:
#include "Test.h"
#include <iostream>
using namespace std;
int main() {
Test a(100);
Test b = a;
a.x = 5;
a.show();
b.show();
return 0;
}
輸出結(jié)果:
5
100
到此這篇關(guān)于C++中淺拷貝與深拷貝的詳解及其作用介紹的文章就介紹到這了,更多相關(guān)C++淺拷貝深拷貝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu)之歸并排序的實(shí)例詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之歸并排序的實(shí)例詳解的相關(guān)資料,這里對(duì)歸并排序進(jìn)行詳細(xì)介紹,需要的朋友可以參考下2017-08-08
C語言實(shí)現(xiàn)計(jì)算圓周長(zhǎng)以及面積
這篇文章主要介紹了C語言實(shí)現(xiàn)計(jì)算圓周長(zhǎng)以及面積方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Qt5.9實(shí)現(xiàn)簡(jiǎn)單的多線程實(shí)例(類QThread)
Qt開啟多線程,主要用到類QThread。用一個(gè)類繼承QThread,然后重新改寫虛函數(shù)run()。具有一定的參考價(jià)值,感興趣的可以了解一下2021-09-09
C++中異常機(jī)制的實(shí)現(xiàn)機(jī)制詳解
這篇文章主要給大家介紹了關(guān)于C++中異常機(jī)制的實(shí)現(xiàn)機(jī)制的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
C 語言基礎(chǔ)之C 語言三大語句注意事項(xiàng)
今天講解的內(nèi)容,則是自己對(duì)于這三種語句一些細(xì)節(jié)的簡(jiǎn)單介紹,分支語句:if,switch、循環(huán)語句:while,for,do while、goto語句,感興趣的小伙伴可以參考下面具體的文章內(nèi)容2021-09-09

