2012-07-07 45 views
8

tôi chút mới để C++ và cố gắng làm những điều với Qt và tình cờ gặp điều khó hiểu này:C++ con trỏ đối tượng lớp và các hàm thành viên truy cập vào

Các khái niệm về hướng dẫn khác nhau cái gì đó nhà nước như:

Class *obj; 

*obj - sẽ hiển thị giá trị của đối tượng bảo quản ở bộ nhớ tham chiếu
obj - sẽ là địa chỉ bộ nhớ mà nó trỏ

như vậy, tôi sẽ làm somethi ng như

*obj=new Class(); 

nhưng nếu tôi muốn truy cập vào một chức năng, tôi phải làm obj->function1(); thay vì *obj->function1();

- không chắc chắn lý do tại sao, vì với các đối tượng bình thường [normalObj.function1();] sẽ làm việc, kể từ đó là giá trị trực tiếp.

Vì vậy, cho các đối tượng con trỏ tại sao chúng ta sử dụng tài liệu tham khảo bộ nhớ để truy cập các chức năng, hoặc là nó rằng trong trường hợp của các đối tượng bình thường cũng có, nó luôn luôn tham chiếu

PS: Ai đó có thể hướng dẫn cho tôi đến một hướng dẫn tốt sử dụng con trỏ trong C++, để các truy vấn của tôi như thế này có thể được giải quyết trực tiếp trong đó.

+1

[ “một hướng dẫn tốt về con trỏ trong C++”] (http://dl.dropbox.com/u/6101039/Modern%20C%2B%2B .pdf) –

Trả lời

23

Biểu tượng * được sử dụng để xác định con trỏ và để trỏ đến con trỏ.Ví dụ, nếu tôi muốn tạo ra một con trỏ đến một int, tôi có thể làm:

int *ptr;

Trong ví dụ này, * đang được sử dụng để tuyên bố rằng đây là một con trỏ đến một int. Bây giờ, khi bạn không khai báo một con trỏ và bạn sử dụng biểu tượng * với một con trỏ đã được khai báo, thì bạn đang dereferencing nó. Như bạn có thể biết, một con trỏ chỉ đơn giản là một địa chỉ. Khi bạn dereference một con trỏ, bạn đang có được giá trị đang được trỏ đến bởi địa chỉ đó. Ví dụ:

int pointToMe = 5; 
int *ptr = &pointToMe; 
std::cout << *ptr; 

này sẽ in ra 5. Ngoài ra, nếu bạn đang gán một con trỏ đến một địa chỉ mới và nó không phải trong việc kê khai, bạn làm không sử dụng biểu tượng *. Vì vậy:

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

là cách bạn thực hiện. Bạn cũng có thể chọn con trỏ để gán một giá trị mới cho giá trị được trỏ đến bởi địa chỉ. Chẳng hạn như:

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

Hiện tại, -> hoạt động giống như biểu tượng cảm nhận. Nó sẽ dereference con trỏ và sau đó sử dụng các chức năng thành viên và các biến như thể bạn đã sử dụng . với một đối tượng không trỏ. Ngay cả với một đối tượng mà không phải là một con trỏ, bạn có thể sử dụng -> bằng cách đầu tiên nhận được địa chỉ:

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

Đó chỉ là một cái nhìn tổng quan ngắn gọn về con trỏ, hy vọng nó sẽ giúp. chính xác

+1

Cảm ơn bạn đã giải thích toán tử -> –

3

Thực ra, bạn đã sai. Bạn làm:

obj=new Class(); 

hoặc

Class *obj = new Class; 

đó là hoàn toàn khác nhau.

Class *obj; 
*obj = new Class; 

sẽ không biên dịch.

obj thuộc loại Class*, vì vậy đó là những gì bạn có thể gán cho nó (và số tiền trả lại là new Class).

3

Bạn có thể sử dụng "bình thường" . để truy cập các thành viên đối tượng, nhưng trước tiên bạn phải dereference con trỏ.

Do ưu tiên của nhà điều hành, điều này sẽ giống như (*obj).member. Đối với những người nghĩ rằng đây là quá nhiều để viết, obj->member là một lựa chọn ngắn hơn.

Nếu bạn có một đối tượng c loại Class, *c.ptr phương tiện dereferencing một con trỏ ptr đó là một thành viên của Class. Đó là một lý do cho (*obj).member, có nghĩa là một cái gì đó khác.

0

More u có thể làm như thế này

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 
Các vấn đề liên quan