考虑这个课程:
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
的副本?
答案 0 :(得分:4)
如果存在可访问的复制构造函数,则它将是副本,否则将是编译错误。如果您将变量声明为一个变量,则该变量只是一个参考。
答案 1 :(得分:1)
在第二个示例中,您已声明了一个局部变量(不是引用),因此您将获得从函数返回的参考值的副本。
那说:不要这样做。通过非const引用返回的公共非const方法仅比具有复杂性成本的公共成员的结构更好一步。只需使用带有公共成员的结构和直接访问,或者正确封装数据。
答案 2 :(得分:0)
您可以通过此代码示例进行简单检查:
#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;
}