在某些类中,访问器声明为getName1
,而其他类似getName2
。从使用角度看,它看起来完全相同。在一个像样的编译器中,是否有任何性能优势?有什么情况我只能使用其中一个吗?
class MyClass
{
public:
MyClass(const string& name_):_name(name_)
{
}
string getName1() const
{
return _name;
}
const string& getName2() const
{
return _name;
}
private:
string _name;
};
int main()
{
MyClass c("Bala");
string s1 = c.getName1();
const string& s2 = c.getName1();
string s3 = c.getName2();
const string& s4 = c.getName2();
return 0;
}
答案 0 :(得分:4)
通过引用返回可能更快,因为不需要复制(尽管在许多情况下return-value optimization适用。
然而,它也增加了耦合。如果您想要更改类的内部实现,以便以不同的方式存储名称(即不再在string
中),请考虑会发生什么。将不再有引用返回的内容,因此您还需要更改公共接口,这意味着需要重新编译客户端代码。
答案 1 :(得分:1)
string getName1() const
{
return _name;
}
在这种情况下,编译器可以认真做RVO(返回值优化)。