c++存储引用返回的私有变量的正确方法

c++ Right way to store a private variable returned by reference

本文关键字:变量 方法 存储 引用 返回 c++      更新时间:2023-10-16

考虑这个类:

class example
{
    inline const A& GetA()
    {
        return _a;
    }
private:
    A _a;
};

带有以下代码:

example Ex;
A& a = Ex.GetA();

_a将通过引用返回,而不复制a。

我的问题是,如果我按如下方式删除参考运算符,会发生什么:

example Ex;
A a = Ex.GetA();

a是对_a的引用还是将创建_a的副本?

如果有一个可访问的副本构造函数,它将是一个副本,否则将出现编译错误。如果您将变量声明为一个引用,那么它只是一个引用。

在第二个示例中,您声明了一个局部变量(而不是引用),因此您将获得从函数返回的引用值的副本

也就是说:不要这样做。通过非常数引用返回的公共非常数方法只比以复杂度为代价的具有公共成员的结构好一小步。只需将结构与公共成员和直接访问一起使用,或者正确封装数据。

您可以通过以下代码示例进行简单的检查:

#include <iostream>
class A {
public:
    A() {
        std::cout << "Creating A from default ctor" << std::endl;
    }
    A(const A &) {
        std::cout << "A copy created!" << std::endl;
    }
};
class Example {
public:
        inline A& getA() {
            return _a;
        }
    private:
        A _a;
};
int main() {
Example a;
A aa = a.getA();
return 0;
}