2017-01-12 24 views
22

Tôi đoán tôi không thể hiểu tại sao điều này không hoạt động. Tôi luôn nghĩ rằng tôi có thể sử dụng con trỏ 'this' bên trong constructor, nhưng tôi không bao giờ biết rằng tôi không thể sử dụng 'this' trong danh sách khởi tạo.Con trỏ 'this' trong danh sách khởi tạo của hàm tạo

#include <iostream> 

class A { 
    public: 
     int a; 
     int b; 
     A(int a = 0, int b = 0) : this->a(a), this->b(b) { } 
     void print() { 
     std::cout << a << ", " << b << std::endl; 
    } 
}; 

int main() { 
    A a; 
    a.print(); 
} 

Tôi muốn biết chi tiết liên quan đến nó.

+0

Tôi đã gắn thẻ "luật sư ngôn ngữ": Tôi không tin rằng câu trả lời của tôi là chính xác. – Bathsheba

+2

Bạn không ở trong cơ thể của hàm tạo, mặc dù bạn đang ở trong danh sách khởi tạo của hàm tạo. –

+2

@DavidSchwartz 'b (this-> a)' sẽ là tốt. – Potatoswatter

Trả lời

28

Đơn giản bởi vì không có nhu cầu, một danh sách initializer đã có thể disambiguate vì cú pháp của nó là nghiêm ngặt:

member(value) 

Vì vậy, bạn chỉ có thể thay đổi nó thành:

A(int a = 0, int b = 0) : a(a), b(b) {} 

this->member chỉ thực sự được sử dụng khi lập trình viên cần giúp trình biên dịch định hướng, ví dụ: nếu nhà xây dựng của bạn sẽ trông giống như:

A(int a = 0, int b = 0) 
{ 
    // set local 'a' to itself 
    a = a; 
} 

A::a của bạn sẽ không được khởi tạo ngay bây giờ, oops!

Bạn sẽ cần this để giúp trình biên dịch:

A(int a = 0, int b = 0) 
{ 
    this->a = a; // set A::a to local a. 
} 
+0

Tôi muốn thêm rằng bằng cách sử dụng 'this' để truy cập các thành viên khi sự mơ hồ là một vấn đề là một điều Java. Trong C++, các thuộc tính của bạn nên (thường) có một tên như 'a_', làm giảm dòng trên thành' a_ = a; '. Để báo [Hướng dẫn kiểu Google C++] (https://google.github.io/styleguide/cppguide.html#Variable_Names): _Data thành viên của các lớp (nhưng không phải cấu trúc) có thêm dấu gạch dưới._ – Konstantin

+10

@ KonstantinĐ .: Lưu ý Hướng dẫn về phong cách của Google C++ không được tôn trọng trong các lập trình viên C++ và không được coi là đại diện cho những gì cộng đồng C++ đề xuất. – ruakh

+0

@ KonstantinĐ. Giá trị của các quy ước đặt tên tiền tố/hậu tố rất chủ quan và thường không cần thiết. Đó là lý do tại sao cấu trúc 'này' tồn tại ngay từ đầu. Tôi muốn giới thiệu Clean Code by Bob Martin cho một góc nhìn khác. – drognisep

25

this->a là về mặt ngữ pháp không hợp lệ vì nó là một biểu hiện thành viên truy cập, nhưng chỉ có một định danh được phép ở đó (hoặc một Bộ xác định kiểu, cho các lớp học cơ sở) .

Từ chuẩn C++, [class.base.init],

mem-initializer-id:
đẳng cấp hay-decltype
định danh

+3

Phải, và "tại sao" là .... bởi vì hoàn toàn không cần phải phức tạp ngữ pháp để cho phép thêm 'this->'. Trong thực tế, bạn sẽ phải quay lại với một loạt các quy tắc "... là không đúng" để cấm về cơ bản bất cứ điều gì bạn chỉ cần thêm _but_ được thêm vào 'this->'. –

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