C 類和物件的使用之物件指標

2021-09-24 23:41:54 字數 3644 閱讀 8732

物件指標:指向類的成員的指標。在c++中,可以說明指向類的資料成員和成員函式的指標。

物件指標遵循一般變數指標的各種規則:類名 *物件指標名;

物件指標名*成員名;

物件指標在使用之前,也一定要先進行初始化,讓它指向乙個已經宣告過的物件,然後再使用。通過物件指標,可以訪問到所指向物件的公有成員。

class time

;void time::get_time()

在此有以下語句:

time *pt;//定義pt 為指向time類對像的指標變數

time t1;//定義t1為time類對像

pt=&t1;//將t1的起始位址賦給pt

這樣,pt 就是指向time類物件的指標變數,它指向物件t1。

定義指向類物件的指標變數的一般形式為:

類名 *物件指標名;
可以通過物件指標訪問物件和物件的成員。如:

*pt       pt所指向的對像,即t1

(*pt).hour pt所指向的物件中的hour成員,即t1.hour

pt->get_time() pt把指向的物件中的get_time函式,即t1.get_time()

(*pt).get_time()

定義指向物件資料成員的指標的方法與定主指向變通的指標變數的方法相同。如:

int *p;
定義指向物件資料成員的指標變數的一般形式為:

資料型別名 *指標變數名;
定義指向物件成員函式的指標變數的方法和定義指向變通函式的指標變數方法有所不同。

定義指向變通函式的指標變數的方法:

資料型別名  (*指標變數名)();如:

void (*p)();//p是指向void型函的指標變數

定義指向成員函的指標:

資料型別名 (類名::*指標變數名)();

使指標變數指向乙個公用成員函式的一般形式為

指標變數名=&類名::成員函式名;

示例:

1 #include 2 using namespace std;

3 class time

4 ;12 time::time(int h,int m,int s)

13 18 void time::get_time()

19 22

23 int main()

24

指向物件成員的指標使用前也要先宣告,再賦值,然後引用,因此首先要宣告指向該物件所在類的成員的指標。注意,通過指向成員的指標也只能訪問到公有成員。

語法形式:

型別說明符   類名::*指標名;          //宣告指向公有資料成員的指標

型別說明符 (類名::*指標名)(參數列);//宣告指向公有函式成員的指標

對資料成員指標賦值:

指標名 = &類名::資料成員;
此時還不能通過指標訪問變數。類的宣告只確定了各個資料成員的型別、所佔記憶體大小以及它們的相對位置,在宣告時並不為資料成員分配具體的位址。因此經上述賦值之後,只是說明了被賦值的成員指標式專門用於指向哪個資料成員的,同時在指標中存放該資料成員在類中的相對位置,當然通過這樣的指標現在並不能訪問什麼。

由於類是通過物件而例項化的,在宣告類的物件時才會為具體的物件分配記憶體空間,這時只要將物件在記憶體中的起始位址與成員指標中存放的相對偏移結合起來就可以訪問到物件的資料成員了。

語法形式:物件名.*類成員指標名

或 物件指標名à*類成員指標名

成員函式指標賦值:

指標名 = 類名::函式成員名;

經過上述對成員函式指標賦值之後,還不能用指標直接呼叫成員函式,而是需要首先宣告類的物件,因為必須要通過物件來呼叫非靜態成員函式。

利用指標呼叫成員函式:

(物件名.*類成員指標名)(參數列)

或 (物件指標名à*類成員指標名)(參數列)

類的靜態成員可以用普通的指標來指向和訪問。/**形式上把靜態成員看成普通變數就可以**/
物件指標:在c++中,可以說明指向類的資料成員和成員函式的指標。

使用物件指標作為函式引數要經使用物件作函式引數更普遍一些。因為使用物件指標作函式引數有如下兩點好處:

實現傳址呼叫。可在被呼叫函式中改變呼叫函式的引數物件的值,實現函式之間的資訊傳遞。

使用物件指標實參僅將物件的位址值傳給形參,而不進行副本的拷貝,這樣可以提高執行效率,減少時空開銷。

當形參是指向物件指標時,呼叫函式的對應實參應該是某個物件的位址值,一般使用&後加物件名。下面舉一例子說明物件指標作函式引數。

1 #include 2     class m

3

6 m(int i, int j)

7 void copy(m *m);

8 void setxy(int i, int j)

9 void print()

19 20 void fun(m m1, m *m2);

21 void main()

22

29 30 void fun(m m1, m *m2)

31

35 36 輸出結果為:

37 5,7

38 22,25

從輸出結果可以看出,當在被呼叫函式fun中,改變了物件的資料成員值[m1.setxy(12, 15)]和指向物件指標的資料成員值[m2->setxy(22, 25)]以後,可以看到只有指向物件指標作引數所指向的物件被改變了,而另乙個物件作引數,形參物件值改變了,可實參物件值並沒有改變。因此輸出上述結果。

在實際中,使用物件引用作函式引數要比使用物件指標作函式更普遍,這是因為使用物件引用作函式引數具有用物件指標作函式引數的優點,而用物件引用作函式引數將更簡單,更直接。所以,在c++程式設計中,人們喜歡用物件引用作函式引數。現舉一例子說明物件引用作函式引數的格式。

1 #include 2     class m

3

6 m(int i, int j)

7 void copy(m &m);

8 void setxy(int i, int j)

9 void print()

6 a(int i, int j)

7 void copy(a &aa); //物件引用作函式引數

8 void print()

9 private:

10 int a, b;

11 };

12 13 void a::copy(a &aa)

14

19 20 void main()

21

C 類和物件 this指標

先來乙個c語言中的結構體 struct student 在建立結構體變數後,要修改結構體中的變數的話,需要這樣 int main 這樣子來修改或者呼叫 比如說我要寫乙個函式初始化學生 void initstudent student this,char name,char gender,int ag...

C 類和物件(三) C 物件模型和this指標

c 中,類的成員變數和成員函式分開儲存。只有非靜態成員變數屬於類的物件,占用物件的記憶體空間。注1 非靜態成員函式和靜態成員 包括靜態成員變數與靜態成員函式 均不屬於類的物件,不占用物件的記憶體空間。注2 非靜態成員函式並非某個物件獨有,記憶體中僅存在乙份資料 乙份函式例項 不同物件的某個非靜態成員...

C 類和物件(概念 this指標)

比如 世界上有很多人,但是 人 這個詞是一開始就存在的嗎。並不是,我們把 人 叫做 人 那麼老外可能就會叫做 person 或者 people 那麼我們就可以說 人 就是一種抽象,就是類 而我們每乙個人就相當於是 人 這個類的乙個個實體。2.class的定義 1 類的內容有哪些?類內成員都有什麼呢?...