C++中淺拷貝與深拷貝的詳解及其作用介紹
概述
淺拷貝 (shallow copy) 隻是對指針的拷貝, 拷貝夠兩個指針指向同一個內存空間. 深拷貝 (deep copy) 不但對指針進行拷貝, 而且對指針指向的內容進行拷貝. 經過深拷貝後的指針是指向兩個不同地址的指針.
對象的賦值
同類對象之間可以相互賦值. 對象賦值的一般形式:
對象名1 = 對象名2;
舉個栗子:
int main() { Time t1(6,6,6); Time t2 = t1; // 對象賦值 return 0; }
實現原理: 賦值運算符的重載.
對象的復制
對象的復制即用已有的對象克隆出一個新對象. 對象復制的一般格式:
類名 對象2(對象1);
舉個栗子:
int main() { Time t1(8, 8, 8); Time t2(t1); // 對象的復制 return 0; }
int main() { Time t1(8, 8, 8); Time t2 = t1; // 對象的復制 return 0; }
原理: 編譯系統默認提供的默認復制構造函數. 如:
Time::Time(const Time& t){ hour = t.hour; minute = t.minute; second = t.second; }
對象復制的用途
建立一個新對象
我們可以利用復制構造函數進行初始化而建立一個新對象.
Time t2(t1);
函數的參數為類對象
通過調用復制的構造函數來建立一個實參的拷貝, 在調用函數時我們可以將實參對象完整的傳遞給形參. 例如:
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; }
函數的返回值為類對象
當函數調用完畢, 我們需要通過調用復制的構造函數將函數中的對象復制一個臨時的對象並返回. 例如:
Time fun(); using namespace std; int main() { Time t2; t2 = fun(); return 0; } Time fun() { Time t1(8, 8,8); return t1; }
淺拷貝
淺拷貝 (Shallow Copy) 隻復制某個對象的指針, 而不復制對象本身, 新舊對象還是共享同一塊內存.
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; }
輸出結果:
5
5
深拷貝
深拷貝 (Deep Copy) 在拷貝的過程中會另外創造一個一模一樣的對象. 新對象跟原對象不共享內存, 修改新對象不會改到原對象. 例如:
#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; }
輸出結果:
5
100
到此這篇關於C++中淺拷貝與深拷貝的詳解及其作用介紹的文章就介紹到這瞭,更多相關C++淺拷貝深拷貝內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!