Nếu có thể, nó tốt hơn để thiết lập dữ liệu các thành viên thông qua danh sách initializer, trong trường hợp đó không có vấn đề với các đối số có tên thành viên bóng tối. Một cách khác là sử dụng this->foo = foo;
trong phần thân của hàm tạo. Một vấn đề tương tự tồn tại đối với người định cư, nhưng bây giờ bạn không thể sử dụng giải pháp danh sách khởi tạo. Bạn đang mắc kẹt với this->foo = foo;
- hoặc chỉ sử dụng các tên khác nhau cho các đối số và thành viên.
Một số người thực sự ghét các đối số làm bóng các thành viên dữ liệu; nhiều tiêu chuẩn mã hóa một cách rõ ràng nói không bao giờ làm điều này. Những người khác nghĩ rằng loại bóng tối này, ít nhất là cho các nhà xây dựng và người định cư, là meow của mèo. Tôi nhớ lại việc đọc một hoặc hai tiêu chuẩn mã hóa (nhưng tôi không nhớ cái nào) đã chỉ định loại bóng tối này là một thực hành "nên" (nhưng không phải "phải").
Một tùy chọn cuối cùng là sử dụng tính năng đánh bóng trong khai báo hàm để cung cấp cho người đọc một gợi ý về chức năng, nhưng sử dụng các tên riêng biệt trong quá trình triển khai.
Cập nhật: "shadowing" là gì?
#include <iostream>
void printi (int i) { std::cout << "i=" << i << "\n"; }
int i = 21;
int main() {
printi (i);
int i = 42;
printi (i);
for (int i = 0; i < 3; ++i) {
printi (i);
int i = 10;
printi (i);
}
printi (i);
}
Việc kê khai trong cùng của i
, int i=10
, bóng tối biến i
tuyên bố trong báo cáo for
, do đó bóng tối biến i
tuyên bố tại phạm vi chức năng, do đó bóng tối biến toàn cầu i
.
Trong vấn đề ở bàn tay, các đối số x
, y
, width
và height
để các nhà xây dựng không mặc định cho lớp A
bóng các dữ liệu thành viên có tên giống như những đối số.
width=width;
của bạn không làm gì vì đối số width
bóng (ẩn) thành viên dữ liệu width
. Khi bạn có hai hoặc nhiều biến có cùng tên được khai báo ở các phạm vi khác nhau, người chiến thắng luôn là tên có phạm vi trong cùng. Nói chung, nó luôn là tên có phạm vi trong cùng nhất thắng.
Nguồn
2012-10-10 15:59:54
Euh, gắn một 'a' vào tên đối số? –
'A :: A (int, int ya, int widtha, int heighta)' – corazza
nếu bạn muốn thanh lịch, * trước * pend 'a', tạo thành một bài báo không xác định bằng tiếng Anh: 'anX, aY, aWidth, aHaight' vv Rõ ràng, không thể sử dụng cùng một số nhận dạng để tham chiếu đến hai biến khác nhau trong cùng một phạm vi. Xem câu trả lời của tôi. –