把類成員改成指標 C 帶有指標成員的類處理方式

2021-10-13 05:48:40 字數 2719 閱讀 7343

在乙個類中,如果類沒有指標成員,一切方便,因為預設合成的析構函式會自動處理所有的記憶體。但是如果乙個類帶了指標成員,那麼需要我們自己來寫乙個析構函式來管理記憶體。在<> 中寫到,如果乙個類需要我們自己寫析構函式,那麼這個類,也會需要我們自己寫拷貝建構函式和拷貝賦值函式。

析構函式:

我們這裡定義乙個類hasptr,這個類中包含乙個int 型別的指標。然後定義乙個析構函式,這個函式列印一句話。

hasptr.h 類的標頭檔案

1 #pragma once

2 #ifndef __hasptr__3 #define __hasptr__

5 classhasptr6 ;20

21 #endif //!__hasptr__

view code

hasptr.cpp 類的實現

1 #include "stdafx.h"

3 #include

4 #include "hasptr.h"

6 using namespacestd;7

8 hasptr::hasptr(int i, int *p)9 13

14 inthasptr::get_ptr_value()15 18

19 void hasptr::set_ptr_value(int *p)20 23

24 inthasptr::get_val()25 28

29 void hasptr::set_val(intv)30 33

34 hasptr::~hasptr()35 13

14 inthasptr::get_ptr_value()15 18

19 void hasptr::set_ptr_value(int *p)20 23

24 inthasptr::get_val()25 28

29 void hasptr::set_val(intv)30 33

34 hasptr::~hasptr()35 13

14 inthasptr::get_ptr_value()15 18

19 void hasptr::set_ptr_value(int *p)20 23

24 inthasptr::get_val()25 28

29 void hasptr::set_val(intv)30 33

34 hasptr::~hasptr()35

view code

執行結果如下,最後還是報錯了:

其實程式執行到第二個析構函式時,報錯了。報錯原因是,ptr 其實已經是pending指標了,因為這個ptr 指標所指向的位址已經被delete了。

不過我們這裡最起碼可以知道預設的拷貝建構函式和賦值操作,也是會直接複製指標值的,不是指標所指向的值。是指標變數的值,也就是位址。

所以這裡引申出來的問題是:如何管理物件中指標成員的記憶體? 這個是乙個核心問題。

上面的例子,就是預設的方式,但是管理失敗了,因為析構函式到最後會刪除pending 指標,導致異常發生。

智慧型指標:

引入乙個類u_ptr,用來管理我們需要在業務物件中需要的指標變數,假設為int *p。標頭檔案如下:

1 #pragma once

2 #ifndef __uptr__3 #define __uptr__

4 #include "hasptr.h"

5 #include

7 using namespacestd;8 classu_ptr9 15 ~u_ptr()16 9

10 hasptr(const hasptr &orgi) :ptr(orgi.ptr), val(orgi.val)11 ;28

29 #endif //!__hasptr__

view code

hasptr.cpp 實現如下:

1 #include "stdafx.h"

2 #include "hasptr.h"

3 #include

5 using namespacestd;6

7 hasptr& hasptr::operator=(const hasptr &rhs)8 14 ptr =rhs.ptr;15 val =rhs.val;16 return *this;17 }18

19 hasptr::~hasptr()20 32 int hasptr::get_int() const

33 36 void hasptr::set_ptr(int *p)37 40 void hasptr::set_int(inti)41

view code

測試類如下:

1 : 定義控制台應用程式的入口點。2 //3

4 #include "stdafx.h"

5 #include "hasptr.h"

6 #include

8 using namespacestd;9

11 intmain()12 {13 int *temp = new int(100);14 hasptr ptr(temp,22);15 cout << "ptr------------>"

view code

我們把u_ptr 叫做智慧型指標,用於幫我們管理需要的指標成員。我們的業務物件hasptr物件包含乙個智慧型指標,這個指標在hasptr 物件建立時建立,智慧型指標的use 變數用來記錄業務物件hasptr物件被複製了多少次,也就是說,有多少個相同的指標指向了ptr所指向的地方。如果要記錄hasptr物件一共有多少個一樣的,那麼就需要在拷貝建構函式和賦值操作處進行對use變數加一操作,在析構函式處進行減一操作。當減到0時,刪除指標。

把類成員改成指標 C 類 物件

c 在 c 語言的基礎上增加了物件導向程式設計,c 支援物件導向程式設計。類是 c 的核心特性,通常被稱為使用者定義的型別。類用於指定物件的形式,它包含了資料表示法和用於處理資料的方法。類中的資料和方法稱為類的成員。函式在乙個類被稱為類的成員。定義乙個類,本質上是定義乙個資料型別的藍圖。這實際上並沒...

C 類成員指標

類成員指標 1.成員指標式可以指向類的非靜態成員的指標。類的靜態成員不屬於任何物件,因此無需特殊的指向靜態成員的指標。指向靜態成員的指標的普通指標沒有任何區別。2.當初始化乙個類成員指標時,我們令其指向類的成員,但不指定代成員所屬的物件,直到使用到成員指標時,才提供所屬的物件。3.資料成員指標 例 ...

C 類成員指標

首先讓我們看一下,乙個簡單的成員變數指標 和 成員函式指標的使用例子。struct a int a pi a i void a pfoo a foo a a a.pi 1 等同於 a.i 1 a.pfoo 等價於 a.foo 在vc 下,輸出 a i 和 a foo 的值,你會發現他們的值都為1 在...