先來看c++物件的賦值
student xiaoming = new student(「一年級」,「一班」);
student xiaohong = xiaoming;
c++支援物件的賦值,上面的**是沒有問題的,物件xiaohong擁有和物件xiaoming一樣的屬性(同樣是「一年級一班」)。
問題1:以上**物件的賦值是怎麼實現的?
答:乙個物件xiaohong的生成,一般我們會想到建構函式。但是建構函式往往伴隨著類成員屬性的初始化,而且物件xiaoming初始化後,屬性還可以改變,所以建構函式這條路就行不通了。c++編譯器提供了一種特殊的建構函式,即預設拷貝建構函式,預設拷貝建構函式對物件中的屬性進行依次拷貝。
問題2:拷貝建構函式什麼時候被呼叫?
答:1、物件在建立時使用其他的物件初始化時;2、物件作為函式的引數進行值傳遞時。
問題3:拷貝建構函式的使用會引入什麼風險?
答:會引入「深拷貝」和「淺拷貝」問題帶來的重複釋放資源的錯誤。
問題4:如何規避風險?
答:可以自定義拷貝建構函式,增加分配資源操作。
1、先看一段**,這段**展示了拷貝建構函式和賦值運算子的使用方法。
// copyconstructortest.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#includeclass student
//析構函式 destructor
~student()
//拷貝建構函式 copy constructor
student(const student& stu)
//賦值運算子 assignment operator
student& operator=(const student&)
private:
std::string name;
int age;
};int main()
2、深拷貝和淺拷貝
上述**中,類的成員變數都是基本資料型別,在複製的時候,會新開闢一塊記憶體來存值,這種拷貝方式叫做深拷貝。但是,如果類成員中有指標變數,則會出現淺拷貝,即同一塊記憶體多了乙個指標指向它,這樣一來,在釋放資源的時候,釋放第乙個指標時把記憶體釋放,在釋放第二個指標的時候,記憶體已經不存在了,所以報錯。如下**:
// copyconstructortest.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#includeclass student
//析構函式 destructor
~student()
//拷貝建構函式 copy constructor
student(const student& stu)
//賦值運算子 assignment operator
student& operator=(const student&)
private:
std::string name;
int age;
char* address; //如果類成員變數中有指標,則涉及到淺拷貝
};int main()
3、解決指標淺拷貝的問題
解決方法就是在拷貝建構函式中,為指標新開闢一塊記憶體空間,如下**;
// copyconstructortest.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include#includeclass student
//析構函式 destructor
~student()
//拷貝建構函式 copy constructor
student(const student& stu)
//賦值運算子 assignment operator
student& operator=(const student&)
friend std::ostream& operator<<(std::ostream& os, student& stu)
private:
std::string name;
int age;
char* address; //如果類成員變數中有指標,則涉及到淺拷貝
};int main()
如果你的類裡面有指標變數,就要考慮深淺拷貝帶來的問題。 C 建構函式 拷貝建構函式
建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...
C 學習篇 拷貝建構函式
在學習這一章內容前我們已經學習過了類的建構函式和析構函式的相關知識,對於普通型別的物件來說,他們之間的複製是很簡單的,例如 int a 10 int b a 自己定義的類的物件同樣是物件,誰也不能阻止我們用以下的方式進行複製,例如 include using namespace std class ...
C 學習筆記 拷貝建構函式
拷貝建構函式是一種特殊的建構函式 1 它是建構函式,所以函式名是類名 沒有返回值 2 它是特殊的建構函式 引數形式是固定的 class object 拷貝建構函式的含義 以乙個物件為藍本,來構造另乙個物件。object b object a b 稱作 以b為藍本,建立乙個新的物件a。a是b的乙個拷貝...