c++ - 'const string& getName() const{ }' vs ' string getName() const{}'?

标签 c++

<分区>

现在,这是高度概念化的。我不知道我是否理解正确,所以请帮助我理解其中的区别。

假设 name 是一个私有(private)的 std::string 数据成员,由 getName() 访问器函数访问:

const string& getName() const {
       return name;  
}

现在,这将返回对 name 的引用,这只是别名的另一个词。因此,将返回一个别名,即返回 name 数据成员。这是允许的还是会破坏数据隐藏的全部目的?

换句话说,上述方法与常规的方法到底有何不同:

string getName() const {
     return name;
}

???

最后,实现前者而不是后者真的值得吗?

最佳答案

首先,如果基础值可能发生变化,那么引用确实会出现问题,尤其是在多线程执行的上下文中。因此,数据成员的值在对象的生命周期内不会改变几乎是一个基本假设。它实际上是一个常数。

现在,引用的一个主要问题是它公开了实现细节,因此很难更改实现。

一个更具学术性的问题是它可能会破坏代码,如果之前有按值返回,或者只是因为它不寻常。例如

const string s& = foo().name();

foo() 通过值返回一个对象,而 name() 通过引用返回一个字符串,这为您提供了一个悬空引用,而不是天真地预期的延长生命周期.我称之为学术,因为我无法想象有人会这样写。尽管如此,墨菲定律等等。

它可能不会(显着)比值返回更有效,正是因为它不太可能仅用于初始化引用。

所以:

  • 可能不会明显更有​​效,

  • 防止轻易改变实现,

  • 还有学术问题,产生悬空引用。

总而言之,就是不要。

这是过早的优化和复杂化。

关于c++ - 'const string& getName() const{ }' vs ' string getName() const{}'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28445353/

相关文章:

c++ - 接受一个参数并返回它的函数

c++ - 在 C++ 中散列字典

c++ - 有没有在 C/C++ 代码中使用 mbind 的例子?

c++ - Widevine session 更新无限循环

c++ - 使用 `__builtin_expect` 会影响程序语义吗?

c++ - 将 vector 传递给cpp中的多个文件

c++ - Tellg 返回意外值

c++ - CPP 线程中的嵌入式 Ruby 崩溃

c++ - 从二进制 dll 文件中删除 C++ 类名

c++ - 如何跟踪消息响应时间和重传