Chỉ cần một số sự kiện ngẫu nhiên về this
để bổ sung cho câu trả lời khác:
class Foo {
public:
Foo * foo() { return this; }
const Foo * cfoo() const { return this; /* return foo(); is an error */ }
};
Foo x; // can call either x.foo() or x.cfoo()
const Foo y; // can only call x.cfoo()
Khi đối tượng là const
, loại this
trở thành một con trỏ đến const
.
class Bar {
int x;
int y;
public:
Bar() : x(1), y(2) {}
void bar (int x = 3) {
int y = 4;
std::cout << "x: " << x << std::endl;
std::cout << "this->x: " << this->x << std::endl;
std::cout << "y: " << y << std::endl;
std::cout << "this->y: " << this->y << std::endl;
}
};
Con trỏ this
có thể được sử dụng để truy cập vào một thành viên đó đã bị lu mờ bởi một tham số chức năng hoặc một biến địa phương.
template <unsigned V>
class Foo {
unsigned v;
public:
Foo() : v(V) { std::cout << "<" << v << ">" << " this: " << this << std::endl; }
};
class Bar : public Foo<1>, public Foo<2>, public Foo<3> {
public:
Bar() { std::cout << "Bar this: " << this << std::endl; }
};
Nhiều thừa kế sẽ làm cho các bậc cha mẹ khác nhau để có this
giá trị khác nhau. Chỉ cha mẹ kế thừa đầu tiên sẽ có cùng giá trị this
làm đối tượng dẫn xuất.
Tất cả các phương pháp không tĩnh đều có con trỏ 'this' ẩn. Trong các triển khai C++ điển hình, nó được truyền vào trong khe đối số nguyên đầu tiên. –
Tôi sẽ tránh làm một cái gì đó như thế này - bất kỳ chức năng mà "làm một cái gì đó để một foo" có lẽ nên là một chức năng thành viên/phương pháp của Foo! –
@Wayne Uroda: Không nhất thiết phải. –