Gần đây, tôi tìm thấy một cuộc thảo luận thú vị về cách cho phép truy cập chỉ đọc cho các thành viên tư nhân mà không Obfuscating thiết kế với nhiều thu khí, và là một trong những gợi ý là để làm điều đó theo cách này:const tham chiếu thành viên công khai cho thành viên lớp học tư nhân - tại sao nó hoạt động?
#include <iostream>
class A {
public:
A() : _ro_val(_val) {}
void doSomething(int some_val) {
_val = 10*some_val;
}
const int& _ro_val;
private:
int _val;
};
int main() {
A a_instance;
std::cout << a_instance._ro_val << std::endl;
a_instance.doSomething(13);
std::cout << a_instance._ro_val << std::endl;
}
Output:
$ ./a.out
0
130
GotW#66 nêu rõ rằng cuộc đời của đối tượng bắt đầu
khi constructor của nó hoàn tất thành công và lợi nhuận cũng không mally. Tức là, điều khiển đến cuối thân của hàm tạo hoặc một câu lệnh trả về sớm hơn.
Nếu vậy, chúng tôi không đảm bảo rằng người ghi _val
sẽ được tạo đúng cách khi chúng tôi thực hiện _ro_val(_val)
. Vì vậy, làm thế nào đến các mã trên hoạt động? Đó là hành vi không xác định? Hoặc là các kiểu nguyên thủy được cấp một số ngoại lệ cho tuổi thọ của đối tượng?
Bất cứ ai có thể chỉ cho tôi một số tham chiếu sẽ giải thích những điều đó?
Nếu bạn đang lo lắng về điều này, bạn chỉ cần khai báo '_val' trước tiên trong định nghĩa lớp của bạn. Các thành viên được khởi tạo theo thứ tự mà chúng được khai báo. (Nhưng như câu trả lời nói, bạn không cần đối tượng được khởi tạo để tạo thành một tham chiếu đến nó.) –
Hãy nhớ rằng điều này sẽ làm tăng kích thước của đối tượng và yêu cầu thêm một hướng để truy cập vào thành viên, trong khi một getter nội tuyến sẽ có hiệu quả như truy cập trực tiếp vào thành viên. Nó cũng tấn công tôi như là obfuscated hơn là một getter (kể từ khi bạn phải nhìn vào định nghĩa constructor để tìm ra những gì nó đề cập đến), nhưng đó chỉ là ý kiến của tôi. –
Nếu bạn thực sự thấy rằng getters và setters của bạn là "obfuscating thiết kế", nó có thể là có cái gì đó sai trong thiết kế của bạn. Bạn có thể đang sử dụng kiểu chống đối của Thiên Chúa. Xem http://stackoverflow.com/questions/565095/java-are-getters-and-setters-evil/565158#565158 – Raedwald