2014-06-26 29 views
5

Giả sử tôi có lớp sau:Điều gì sẽ xảy ra nếu bạn không sử dụng "điều này" trong một lớp học?

class foo{ 
public: 
     int someNum; 
     void calculation(int someNum); 

}; 

Định nghĩa:

void foo::calculation(int someNum){ 
     someNum = someNum; 
} 

Bây giờ trong dòng someNum = someNum, mà someNum được nhắc đến? Nếu tôi làm:

this->someNum = someNum 

Sau đó someNum thứ hai là gì?

Phong cách đặt tên tốt để tránh vấn đề này là gì? Ví dụ, trong mục tiêu-c, một tiền tố "_" trước tên biến thành viên. (ví dụ: _someNum);

Trả lời

9

Bên trong một hàm thành viên tên tham số ẩn tên thành viên lớp giống hệt nhau, vì vậy trong

void foo::calculation(int someNum){ 
     someNum = someNum; 
} 

cả someNum s đang đề cập đến các tham số. Đó là sự tự gán không thay đổi this->someNum.

Trong this->someNum = someNum;, thứ hai someNum tham chiếu đến tham số hàm. Vì vậy, điều này gán giá trị của tham số chức năng someNum cho thành viên lớp someNum.

Quy ước đặt tên thông thường bao gồm tiền tố m hoặc m_ hoặc postfix _ cho thành viên của lớp học. Dấu gạch dưới tiền tố có thể có vấn đề vì C++ đặt tên bắt đầu bằng dấu gạch dưới theo sau là chữ cái viết hoa.


Lưu ý rằng danh sách thành viên khởi tạo trong nhà thầu là một trường hợp đặc biệt:

foo(int someNum) : someNum(someNum) { someNum = someNum; } 
       ^ ^  ^  ^
        |  |   |   | 
        |  ---------------------- 
        |  These three all refer to the parameter 'someNum', 
        |  and not the class member. 
        | 
    The language requires this name to be referring 
    to a class member (or a base class) and so the 
    parameter called 'someNum' is not considered. 
+5

Điều đáng chú ý là quy định này không áp dụng cho danh sách thành viên khởi tạo một constructor. 'foo (int someNum): someNum (someNum) {}' làm điều đúng. – sbabbi

+0

@sbabbi Cảm ơn, đã thêm. –

1

Biến được khai báo trong phạm vi bên trong nhất sẽ làm bóng các biến trong phạm vi bên ngoài. Vì vậy, someNum = someNum' trong foo::calculation không ảnh hưởng đến biến thành viên someNum. Thay vào đó, someNum đề cập đến đối số được truyền vào. Để giúp giảm bớt điều này, các tiêu chuẩn đặt tên đề xuất tiền tố cho biến thành viên của bạn với số nhận dạng nhất quán - ví dụ: "m_".

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