首先定義一個類進行操作。
1
2
3
4
5
6
7
|
class MM { public : protected : int year; string name; } |
構造函數在類中默認有一個無參的構造函數
默認的構造函數為 類名(){};這個構造函數
如果直接寫了構造函數那么這個構造函數將會沒有
構造函數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class MM { public : //MM() {};//無參構造函數 MM( int year, string name) :year(year), name(name) {}; //有參構造函數 在定義對象的時候必須傳參數,沒參數會報錯 MM( int year, string name) { this ->name = name; this ->year = year; } //這兩個是一樣的 MM( int year, string name = "" ) :year(year) {}; //因為string 是缺省的 如果寫沒有構造默認為空 就是 MM mm(15);這里mm對象year=15 name=“”; //缺省只能左邊到右邊 protected : int year; string name; }; |
析構函數
MM(){};就是對構建的對象進行銷毀
析構函數的使用是一個自動調用的過程不需要人為進行,當對象的生命周期結束自動釋放
//析構函數需要注意的點
1.當對象存在指針的時候使用析構函數時,析構函數里面需要釋放指針的指向
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class MM { public : MM( const char * str) { strcpy ( this ->str, str); } ~MM() { delete [] str; }; //這里需要釋放str內存不然析構函數只會釋放類不會釋放str protected : int year; string name; char * str; }; int main() { MM mm( "kkk" ); return 0; } |
如果類中沒有指針就不用在析構函數中去釋放指針指向
拷貝構造(對對象進行賦值)//直接調用拷貝構造不調用構造函數
1
2
3
4
5
6
|
MM mm(15, "kkk" ); //拷貝構造的二種方式對對象進行賦值 MM mm1(mm); MM mm2 = mm; mm1.printfMM(); mm2.printfMM(); |
如果是通過匿名創建時匿名對象調用構造函數
1
2
|
MM mm3 = MM(16, "jfsdl" ); mm3.printfMM(); |
然后匿名對象賦值給對象調用的是拷貝構造函數
拷貝構造之深拷貝和淺拷貝
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//淺拷貝 默認也是淺拷貝就是賦值拷貝 MM( const MM&object) { this ->str = object.str; } //深拷貝 //深拷貝就是通過指針申請指向然后進行賦值 MM( const MM& object) { int len = strlen (object.str) + 1; this ->str = new char [len]; strcpy (str, object.str); } |
深淺拷貝區別
淺拷貝就是進行了賦值操作
深拷貝是通過申請指針后再進行賦值(深拷貝析構函數要釋放申請的指針)
謝謝大家的閱讀,如有不足請及時指出,萬分感激
以上就是C++編程析構函數拷貝構造函數使用示例詳解的詳細內容,更多關于C++編程析構函數拷貝構造函數的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/weixin_56366633/article/details/121375596