Có ba trường hợp tôi có thể nghĩ:
Khi bạn chỉ muốn vượt qua một con trỏ tới lớp hiện tại:
class B;
struct A {
B* parent_;
A(B* parent) : parent_(parent) {}
};
struct B {
A* a;
B() : a(new A(this)) {}
};
Trong một constructor hoặc hàm thành viên, trong đó một thành viên là bị che khuất bởi một đối số:
struct A {
int a;
void set_a(int a) { this->a = a; }
};
Ở đây, biến thành viên "a" bị bóng mờ bởi argum ent "a", vì vậy this->
được sử dụng để truy cập vào thành viên thay vì đối số.
(ví dụ trên đã chỉnh sửa để có một chức năng chứ không phải là nhà xây dựng, vì bạn sẽ không bình thường gán theo cách này trong một constructor)
Khi truy cập vào một/bảo vệ biến thành viên công cộng hoặc chức năng trong một lớp cơ sở của một lớp mẫu
template <class T>
struct A {
int a;
};
template <class T>
struct B : public A<T> {
int f() { return this->a; }
}
đây, a
một mình sẽ không có một tên phụ thuộc, do đó trình biên dịch sẽ mong đợi để tìm một tuyên bố của nó trong B
hoặc một cơ sở của B
mà không phụ thuộc trên T
. Thêm this->
làm cho việc tìm kiếm phụ thuộc vào loại this
và do this
là loại phụ thuộc, nên tra cứu a
cho đến khi f()
được khởi tạo.
Người ta có thể viết return A::a
thay vì return this->a
, nhưng khi có nhiều cơ sở, dù trực tiếp hay gián tiếp, sử dụng this->
linh hoạt hơn. Cú pháp thay thế này cũng được giới hạn cho các biến thành viên và các hàm không phải ảo - nếu nó được sử dụng với một hàm ảo, hàm sẽ được gọi trực tiếp thay vì thực hiện cuộc gọi hàm ảo.
Đối với C++ xem xét cuối cùng của bạn là đúng, nhưng đối với Java hoặc C#, nó không phải lúc nào cũng là ước – Geoffroy
Đây là lý do tại sao bạn luôn tên thành viên của bạn các biến khác với các biến địa phương của bạn, ví dụ 'm_myVar' hoặc' myVar_', v.v. Vì việc sử dụng 'this' không được thực thi nên hầu hết các dự án chọn tham gia buộc một tiêu chuẩn đặt tên trên các biến thành viên. –
Tôi sẽ không nói đó là hình thức tốt để sử dụng 'này' tất cả các thời gian. Chỉ sử dụng nó nếu có tên bóng tối. Thông thường các bóng tối cũng có thể tránh được. –