2012-03-06 32 views
12

Trong một hàm thành viên của một lớp trong C++, nó có khác biệt không, nếu tôi sử dụng this->dataMember hoặc chỉ dataMember? Những gì được coi là phong cách tốt hơn? Có sự khác biệt về hiệu suất nào không?Tôi có nên sử dụng 'this` trong một lớp học không?

(Tôi không nói về trường hợp một biến địa phương có tên tương tự như các thành viên dữ liệu, trong trường hợp này bạn phải, để kiến ​​thức của tôi, sử dụng this-> để phân biệt giữa chúng.)

Trả lời

4

nó chỉ đơn giản là không cần thiết sử dụng this-> để gọi cho thành viên, trừ khi bạn muốn phân biệt ngữ nghĩa giữa người dân địa phương và thành viên một cách nhanh chóng. nhiều người sử dụng tiền tố m_ cho các thành viên trong lớp học, để tránh viết this-> mọi lúc.

1

này sử dụng khi bạn có một ẩn/viên tin =) trong bất kỳ trường hợp khác nó không tạo sự khác biệt =)

từ trung tâm thông tin IBM i Quote sau

Unless a class member name is hidden, using the class member name is equivalent to using 
the class member name with the this pointer and the class member access operator (->). 
1

sử dụng " này-> "tốt hơn (bạn chắc chắn đó là các thành viên) nhưng nó không tạo sự khác biệt

0

Nếu một hàm mẫu thực hiện cuộc gọi đến chức năng thành viên sao cho cuộc gọi không phụ thuộc vào bất kỳ tham số mẫu nào, this-> có thể được sử dụng để giúp trình biên dịch thay thế cho MyUtopicClass<int, double, double>::vin().

+2

Cẩn thận: nếu 'vin' là một hàm ảo, thì' this-> vin() 'và' MyUtopicClass :: vin() 'là khác nhau. – aschepler

6

Đây là vấn đề về phong cách. Một số người thích thêm this-> để làm rõ hơn là bạn đang truy cập một thành viên của lớp học. Nhưng nếu bạn cảm thấy nó đủ rõ ràng nếu không có nó, sẽ không có sự khác biệt trong mã hoặc hiệu suất được tạo ra.

(Bên cạnh những trường hợp bạn nêu với phạm vi chồng chéo, this-> cũng có thể là bắt buộc trong một mẫu khi cố gắng đặt tên một thành viên của một lớp cơ sở kiểu phụ thuộc.)

19

Theo nguyên tắc chung, đó là một vấn đề các công ước địa phương. Hầu hết các địa điểm tôi đã xem không sử dụng this-> trừ khi cần, và đó là quy ước tôi thích, nhưng tôi đã nghe nói về những người thích sử dụng nó một cách có hệ thống.

Có hai trường hợp khi cần thiết. Đầu tiên là nếu bạn đã ẩn tên có cùng tên trong phạm vi địa phương; nếu ví dụ bạn có một thành viên có tên toto và bạn cũng đã đặt tên đối số chức năng của mình toto. Nhiều công ước mã hóa đánh dấu thành viên hoặc lập luận để tránh trường hợp này , ví dụ: tất cả tên thành viên bắt đầu bằng my hoặc m_ hoặc tên thông số sẽ bắt đầu bằng the.

Trường hợp còn lại là this-> có thể được sử dụng trong mẫu để đặt tên theo phụ thuộc . Điều này có liên quan nếu lớp mẫu kế thừa từ loại phụ thuộc và bạn muốn truy cập thành viên của cơ sở, ví dụ::

template <typename T> 
class Toto : public T 
{ 
public: 
    int f() 
    { 
     return this->g(); 
    } 
}; 

Nếu không có sự this-> đây, g() sẽ là một tên không phụ thuộc, và trình biên dịch sẽ trông nó lên trong bối cảnh các mẫu định nghĩa, mà không cần dùng các lớp cơ sở xem xét.

+0

Đây là một câu trả lời tuyệt vời, tôi đã không xem xét trường hợp mẫu. – MadPumpkin

5

Tôi luôn sử dụng this khi gọi thành viên chức năng.

  1. Nó biến tên hàm thành tên phụ thuộc để tìm thấy các hàm thành viên lớp cơ sở trong mẫu lớp.
  2. Nó ngăn chặn tra cứu phụ thuộc vào đối số. ADL có lợi thế của nó, nhưng nó có thể dẫn đến hành vi đáng ngạc nhiên, và tôi thích nó nếu nó không nhận được theo cách của tôi.
  3. Nó không có bất lợi thực sự, và vì vậy tôi sử dụng nó cho tất cả các cuộc gọi hàm thành viên vì lý do nhất quán.
  4. Tôi lập trình bằng Python rất nhiều, trong đó self rõ ràng là bắt buộc, vì vậy nó không phải là gánh nặng thực sự đối với tôi.

Nhưng đối với các thành viên dữ liệu tôi chỉ sử dụng nó khi cần thiết vì không có ADL diễn ra. Để trả lời các câu hỏi cụ thể của bạn:

Trong hàm thành viên của một lớp trong C++, có khác biệt không, nếu tôi sử dụng dữ liệu này-> dữ liệu hoặc chỉ dữ liệu?

Có, nếu điều này nằm trong mẫu lớp học. Sau đó, dataMember được coi là một tên không phụ thuộc, có thể dẫn đến sự khác biệt ngữ nghĩa. Ví dụ:

#include <iostream> 

int i = 1; 

struct R { 
    int i; 
    R(): i(2) { } 
}; 

template<typename T> 
struct S: T { 
    void f() { 
    std::cout << i << ' '  // selects ::i 
       << this->i  // selects R::i 
       << std::endl; 
    } 
}; 

int main() { 
    S<R>().f(); 
} 

Phong cách nào được coi là tốt hơn?

Tôi không nghĩ rằng có một ý kiến ​​mạnh mẽ trong cộng đồng về điều này. Sử dụng một trong hai kiểu, nhưng nhất quán.

Có sự khác biệt về hiệu suất nào không?

Tôi chắc chắn là không có.

Các vấn đề liên quan