cuốn sách gpt4 ai đã làm

c++ - tham chiếu const từ thành viên công khai đến thành viên lớp riêng tư - tại sao nó hoạt động?

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 18:36:16 25 4
mua khóa gpt4 Nike

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 các thành viên riêng tư có quyền truy cập chỉ đọc mà không làm lộn xộn thiết kế với nhiều getters và một trong những gợi ý là thực hiện điều này:

#include 

hạng A {
public:
A() : _ro_val(_val) {}
void doSomething(int some_val) {
_val = 10*some_val;
}
const int& _ro_val;
private:
int _val;
};

int chính() {
Một a_instance;
std::cout << a_instance._ro_val << std::endl;
a_instance.doSomething(13);
std::cout << a_instance._ro_val << std::endl;
}

Đầu ra:

$ ./a.out 
0
130

Đã nhận được #66Chỉ ra rõ ràng thời điểm bắt đầu vòng đời của đối tượng

khi hàm tạo của nó hoàn thành thành công và trả về bình thường. Nghĩa là, điều khiển đạt đến phần cuối của phần thân hàm tạo hoặc câu lệnh trả về trước đó.

Nếu vậy, chúng tôi không thể đảm bảo _val Các thành viên biểu diễn trong _ro_val(_val) đã được tạo chính xác. Vậy đoạn mã trên hoạt động như thế nào? Đây có phải là hành vi không xác định? Hoặc các kiểu nguyên thủy có được cấp một số ngoại lệ cho vòng đời của đối tượng không?

Bất cứ ai có thể chỉ cho tôi một số trích dẫn giải thích những điều này?

câu trả lời hay nhất

Trước khi gọi hàm tạo, đối với đối tượng trên Freestore (nếu bạn sử dụng new) hoặc dành một lượng bộ nhớ thích hợp trên ngăn xếp nếu bạn tạo đối tượng trên bộ nhớ cục bộ. Điều này có nghĩa là khi bạn tham chiếu nó trong danh sách khởi tạo thành viên,_val Bộ nhớ đã được cấp phát nhưng bộ nhớ chưa được khởi tạo đúng cách.

_ro_val(_val)

làm thành viên tham khảo _ro_val trích dẫn như _val Bộ nhớ được phân bổ, thực tế có thể chứa bất cứ thứ gì vào thời điểm này.

Bạn vẫn có hành vi không xác định trong chương trình của mình vì bạn nên đặt _val Được khởi tạo rõ ràng thành 0(hoặc một số giá trị bạn chọn) Danh sách. 0 Chỉ vì bạn may mắn, nó có thể mang lại cho bạn một số giá trị khác bởi vì _val Chưa được khởi tạo. Xem hành vi đây Trên gcc 4.3.4 thể hiện UB.

Nhưng đối với câu hỏi, vâng, hành vi đó cóđược xác định rõ ràng.

Về c++ - tham chiếu const từ thành viên công khai đến thành viên lớp riêng tư - tại sao nó hoạt động? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/7927880/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress