c++ - 返回 const 对象引用(getter)和仅返回字符串有什么区别?
问题描述
我正在浏览 c++ 网站教程,作为对我本学期(初学者)上的大学课程的一个很好的补充。在学习复制构造函数和析构函数时,我遇到了这段代码:
// destructors
#include <iostream>
#include <string>
using namespace std;
class Example4 {
string* ptr;
public:
// constructors:
Example4() : ptr(new string) {}
Example4 (const string& str) : ptr(new string(str)) {}
// destructor:
~Example4 () {delete ptr;}
// access content:
const string& content() const {return *ptr;}
};
int main () {
Example4 foo;
Example4 bar ("Example");
cout << "bar's content: " << bar.content() << '\n';
return 0;
}
现在,我理解了析构函数部分,但字符串成员的 getter 让我感到困惑。为什么要返回对对象(在这种情况下为字符串)的引用(别名)?
// access content:
const string& content() const {return *ptr;}
那和只返回字符串有什么区别?
string content() const {
return *ptr;
}
返回一个 const 别名更有效吗?您是只返回字符串的地址,还是返回字符串本身?仅返回字符串时,您是否返回整个字符串呢?谢谢。
解决方案
返回字符串是不可取的,原因有两个:
- 这意味着执行了不必要的字符串副本,这对性能不利
- 这也意味着有人可能会尝试修改返回的字符串,认为他们修改了类的实际成员 -
const
引用不允许这样做,并触发编译错误。
推荐阅读
- javascript - 按键后的Three.js移动动画不起作用
- python - 为什么我的线性回归表现不佳?
- angular - 无法在页面上找到 firebase ui 小部件 - Angular 测试环境
- flutter - Flutter Autocomplete 小部件延迟更新建议
- r - How do I install the arrow package on RStudio Cloud with lz4 support?
- sqlite - SQLite3,使用 ORDER BY 时:“数据库磁盘映像格式错误”
- sequelize.js - 从响应中删除“包含”表名 - Sequelize
- reactjs - initialRouteName 不起作用,React-Native
- ios - 允许根据 UITouch.TouchType 使用 point(inside:with:) 与后面的视图交互。(PKCanvasView)
- c# - 对字典中的数组进行排序