所謂「深拷貝」和「淺拷貝」,各自代表不同的意義,各有所需。主要要分清值語意和引用語意。
值語意:x=y完成複製後,得到的x完全獨立於y, x的改變不會影響原來的y。
引用語意:x=y完成複製後,修改x會影響y,x,y某種程度上共享了一片記憶體空間,存在耦合的。如下:
class obj;所以拷貝,其實都是值傳遞,只是c++中乙個物件包含指標時候,直接淺拷貝會把指標的值傳遞給另乙個物件,也就是這兩個物件的中的指標成員指向了同一片儲存空間。 所以深拷貝和淺拷貝的區別只存在於類中包含指標變數的時候。下面這個類是不存在深拷貝淺拷貝的,都是值語意。
class obj;c++ primer中說到拷貝建構函式時,建議入參都寫成const的引用,即
a(const a &other)而不是:
a(a &other)原因是什麼?以下是我寫乙個bigint類遇到的問題:
a,b都是bigint型別,我過載了加法運算,得到的依然是乙個bigint,我以為bigint sum = a + b會呼叫建構函式bigint(bigint &bi),但是a+b得到的是乙個右值(函式的返回值是右值),而bigint(bigint &bi)需要乙個左值左入參。所以編譯的時候報錯,提示找不到匹配的構造函。
要弄清這個報錯,首先要搞懂左值和右值的概念。
左值的定義就是非臨時變數,可以在多個語句中使用。右值的定義就是臨時物件,只在當前語句中有效。
我簡單的認為,左值是存放在記憶體位址上的,可以定址,所以可以反覆使用。右值不能定址,存放在**片段上。
在 c++11 之前,右值是不能被引用的,我寫的**企圖引用右值,所以這裡報錯。改成bigint(const bigint &bi)就正確了。
思考:拷貝建構函式入參一定都是const麼?
答:不是。比如智慧型指標shared_ptr的copy constructor,此時的入參是會發生變化的,因為其引用計數器發生了變化,要做++操作。
拷貝建構函式,預設拷貝建構函式
拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...
建構函式 拷貝建構函式
建構函式可以分為三類 1 不帶引數的建構函式 在函式體中對資料成員賦初值,這種方式使該類的每乙個物件都得到同一組初值 2 帶引數的建構函式 如果使用者希望對不同的物件賦不同的初值,可以採用帶引數的建構函式。在呼叫不同物件的建構函式時從外面將不同的資料傳遞給建構函式,以實現初始化 3 複製建構函式 建...
建構函式 拷貝建構函式
person person 引用就是指標常量 所以person p person const p,引用所以一旦初始化指向某個位址,就不能在改變了。為什麼前面還要加const,因為拷貝建構函式的目的就是將乙個物件的所有屬性拷貝到另外乙個物件,這個物件的屬性不變,加上const 相當於 const pe...