gpt4 book ai didi

c++ - const 将公共(public)成员引用到私有(private)类成员 - 为什么它有效?

转载 作者:可可西里 更新时间:2023-11-01 18:36:16 25 4
gpt4 key购买 nike

最近,我发现了一个有趣的讨论,讨论如何在不使用多个 getter 混淆设计的情况下允许对私有(private)成员进行只读访问,其中一个建议就是这样做:

#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;
}

输出:

$ ./a.out 
0
130

GotW#66明确指出对象的生命周期开始

when its constructor completes successfully and returns normally. That is, control reaches the end of the constructor body or an earlier return statement.

如果是这样,我们无法保证 _val 成员在我们执行 _ro_val(_val) 时已正确创建。那么上面的代码是如何工作的呢?这是未定义的行为吗?或者原始类型是否被授予对象生命周期的一些异常(exception)?

谁能给我指出一些可以解释这些事情的引用资料?

最佳答案

在调用构造函数之前,为 Freestore 上的对象(如果您使用 new)或如果您在本地存储上创建对象,则在堆栈上保留适当数量的内存。这意味着当您在成员初始化列表中引用它时,_val 的内存已经分配,​​只是该内存尚未正确初始化。

_ro_val(_val)

使引用成员 _ro_val 引用为 _val 分配的内存,此时它实际上可能包含任何内容。

您的程序中仍然存在未定义行为,因为您应该在构造函数主体/成员初始化程序中将 _val 显式初始化为 0(或您选择的某个值) List.在这种情况下,输出 0 只是因为你很幸运,它可能会给你一些其他值,因为 _val 未初始化。查看行为 here 在演示 UB 的 gcc 4.3.4 上。

但至于问题,是的,行为确实是明确定义

关于c++ - const 将公共(public)成员引用到私有(private)类成员 - 为什么它有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7927880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com