2013-06-17 34 views
33
struct Foo 
{ 
void f() 
{ 
// (*) 
} 
}; 

Loại "này" trong dòng được đánh dấu bằng (*) là gì?Loại "này" trong c + +?

Có phải là const Foo * hoặc Foo *?

+5

Đây có thể là 'Foo * const' –

+6

@TomKnapen không có nó không phải: http://stackoverflow.com/questions/16102143/c-the-this-pointer-is-always-const/ –

+1

Nếu nó là 'const Foo *', điều đó có nghĩa là bạn không thể thay đổi thành viên và riables trong đối tượng (hãy tưởng tượng tất cả các truy cập có 'this->' được khai báo một cách rõ ràng).Đó không phải là ý định trừ khi bạn tự khai báo hàm thành viên 'const'. – Steve314

Trả lời

71

n3376 9.3.2/1

Trong cơ thể của một tổ chức phi tĩnh (9,3) chức năng thành viên, từ khóa này là một biểu prvalue có giá trị là địa chỉ của đối tượng cho mà hàm được gọi.

Loại hình này trong chức năng thành viên của một lớp X là X *. Nếu hàm thành viên được khai báo const, kiểu này là const X *, nếu hàm thành viên được khai báo dễ bay hơi, kiểu này là X * dễ bay hơi và nếu hàm thành viên được khai báo const dễ bay hơi, kiểu này là const dễ bay hơi X *.

+2

Điều đó khiến tôi tự hỏi tại sao họ không tạo ra 'cái này 'một con trỏ const ... Bất kỳ lý do cụ thể nào? –

+17

@TomKnapen 'this' là giá trị r, do đó bạn không thể sửa đổi nó. Đối với hầu hết các ý định và mục đích, nó hoạt động như 'X * const'. Nhưng bạn không thể lấy địa chỉ của nó, ví dụ. – Angew

+3

@TomKnapen: Không. Trong hindsight, nó nên có được một tài liệu tham khảo, không phải là một con trỏ. Nhưng 'điều này 'trước các tham chiếu, và truyền thống C++ không phá vỡ mã hiện tại thực sự là cũ. – MSalters

-5

this là đối tượng hiện tại. Loại this bằng C++ là Foo *const.

5

Bên trong f, this có loại Foo *f không phải là chức năng thành viên const.

Bạn không thể gọi f trên đối tượng const Foo. Sau đây là sai lầm:

const Foo obj; 
obj.f(); 

Đây là chính xác bởi vì bên trong Foo::f, con trỏ thisFoo * hơn const Foo *, và do đó gọi hàm đòi hỏi một sự chuyển đổi con trỏ mà loại bỏ khuôn khổ vòng loại.

Chính con trỏ this không phải là biến. Nó không thể chuyển nhượng được, nhưng không phải là do vòng loại const. Không có tuyên bố nào trong phạm vi như Foo *const this. Biểu thức this đơn giản không phải là một giá trị, như một quy tắc của ngôn ngữ.

Con trỏ this không khác với &obj.

+1

Một lời giải thích đẹp hơn, sư phạm hơn so với báo giá tiêu chuẩn. +1 – StellarVortex

2

Loại điều này phụ thuộc vào chức năng thành viên.

Ví dụ cho một lớp X, nếu các hàm thành viên là

1) const, thì đây là kiểu const X *

2) ổn định, thì đây là dễ bay hơi X * vv

nếu không nó là X *

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