自動呼叫拷貝建構函式情況:
1.用類的乙個物件去初始化另乙個物件;
cat cat1;
cat cat2(cat1);
2.用類的乙個物件去初始化另乙個物件的另一種形式(賦值運算子)
cat cat2=cat1;
3.物件作為函式引數傳遞時,呼叫拷貝建構函式
f(cat a){}
cat b;
f(b);
4.如果函式的返回值是類的物件,函式呼叫返回時,呼叫拷貝建構函式
cat f()
cat b;
b=f();
淺拷貝會出現釋放問題:因為都指向同乙個物件
淺拷貝是對原陣列或物件的引用;
深拷貝是對原陣列或物件作乙個新的建立,開闢了新的記憶體
意義:深拷貝可以避免改變新陣列或物件時,改變了原陣列或物件;
一般的用系統預設的淺拷貝就夠用了
如果出現指向堆記憶體的指標,就需要自定義深拷貝建構函式,為物件建立新的空間,否則會出現野指標。
深拷貝同時複製了資源 和 空間
——開闢空間大小 和 內容
這樣就不會新舊都指向同乙個記憶體位址
好文,還需研讀)
所謂深淺拷貝:
對於僅僅是複製了引用(位址),換句話說,複製了之後,原來的變數和新的變數指向同乙個東西,彼此之間的操作會互相影響,為
淺拷貝。
而如果是在堆中重新分配記憶體,擁有不同的位址,但是值是一樣的,複製後的物件與原來的物件是完全隔離,互不影響,為
深拷貝。
深淺拷貝
當資料成員是指標,要做深複製
*深淺拷貝建構函式
屬於淺拷貝,就是後來改變的可以改變初始值,因為兩者指標雖然是不同的,但指標所str的位址相同
// testcopy.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
/**深淺拷貝建構函式
拷貝建構函式:
#include #include #include #include using namespace std;
class complex{
public:
float real_number,imaginary_number;
complex();
complex(complex&);//拷貝建構函式宣告
void display()
{cout<< "復數值:"<
complex c2=c;//這種格式的拷貝,結果不對
另一種方式:
結果正確
complex c3(c);
c3.real_number=6;
c3.imaginary_number=8;
c3. display();
深拷貝和淺拷貝
淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...
淺拷貝和深拷貝
以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...
深拷貝和淺拷貝
ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...