2012-07-07 113 views
8

我有點新的C++,並嘗試使用Qt工作的事情和整個這個令人困惑的事情就來了:C++類對象的指針和訪問成員函數

Class *obj; 

各種教程狀態類似的概念

*obj - 將顯示存儲在引用的內存對象的值
obj - 將其所指向

這樣的存儲器地址,我會做somethi NG像

*obj=new Class(); 

,但如果我要訪問一個功能,我要做的obj->function1(); 代替*obj->function1();

- 不知道爲什麼,因爲正常的對象[normalObj.function1();]會的工作,因爲這是在直接值。

所以,對指針的對象,爲什麼我們使用內存引用來訪問功能, 抑或是在普通的對象也時,其總是引用

PS:有人可以指導我的一個很好的教程在C++中使用指針,這樣我的查詢就可以直接在這裏查詢。

+1

[「在C++指針的好教程」(http://dl.dropbox.com/u/6101039/Modern%20C%2B%2B .pdf) – 2012-07-07 08:43:35

回答

23

*符號用於定義指針並取消引用指針。例如,如果我想創建一個指向一個int,我可以這樣做:

int *ptr;

在這個例子中,*被用來聲明這是一個指向int。現在,當你沒有聲明一個指針,並且你已經使用了已經聲明的指針的*符號,那麼你正在對它進行解引用。你可能知道,指針只是一個地址。當您取消引用指針時,您正在獲取該地址所指向的值。例如:

​​

這會打印出5。此外,如果您分配一個指向一個新的地址,這不是在聲明中,你使用*符號。所以:

int pointToMe = 5; 
int *ptr; 
ptr = &pointToMe; 

是你如何做到這一點。您也可以使用指針來爲地址指向的值分配一個新值。如:

int pointToMe = 5; 
int *ptr = &pointToMe; 
std::cout << *ptr; // Prints out 5 
*ptr = 27; 
std::cout << *ptr; // Prints out 27 

現在,->就像尊敬符號一樣。它將取消引用指針,然後使用成員函數和變量,就像您使用帶有非指針對象的.一樣。即使有一個對象,它是不是一個指針,你可以通過先獲得地址使用->

CObj object; 
(&object)->MemberFunction(); 

這只是指針的簡要概述,希望它幫助。

+1

感謝您解釋 - >運算符 – 2012-07-07 14:04:39

3

其實,你錯了。你這樣做:

obj=new Class(); 

Class *obj = new Class; 

,這是完全不同的。

Class *obj; 
*obj = new Class; 

不會編譯。

obj的類型是Class*,所以這是您可以分配給它(和什麼new Class返回)。

3

您可以使用「普通」.訪問對象成員,但必須先取消引用指針。

由於運營商的優先級,這看起來像(*obj).member。對於那些認爲這寫得太多的人來說,obj->member是一個較短的選擇。

如果有一個對象Class類型的c*c.ptr手段解引用指針ptr那就是Class成員。這是(*obj).member的一個原因,這意味着別的。

0

更確切地說ü可以這樣做

Class obj; 
Class* obj_ptr; 

obj_ptr = &obj; 

// Now onwards you can use the pointer to access data members and function 

obj_ptr->a = 10; // Like this