返回 void 或对自我的引用
Return void or reference to self?
给定以下类:
struct Object {
int x, y;
void addtoall( int value ){ x += value; y += value; };
Object& addtoall( int value ){ x += value; y += value; return *this; };
};
两个成员函数之间有什么区别?
我知道某些运算符重载(例如:operator+=)需要返回对self的引用,但不包括运算符重载,有必要吗?如果没有,你什么时候想要或需要返回对自我的引用,而不是返回 void?
如果这可以通过google-fu找到,或者是一个非常基本的问题,我深表歉意,但我不确定究竟要搜索什么(而不是因为缺乏尝试)。
两个成员函数之间有什么区别?
返回对实例的引用的函数可以在调用时链接,例如
Object o;
o.addtoall(5).addtoall(6).addtoall(7);
这是否有用取决于实际用例,但它通常用于开发所谓的领域特定语言语法。
我知道某些运算符重载需要返回对 self 的引用(例如:运算符+=)
不,不是。许多人(包括我自己)主张这样的运算符应该被声明为返回void
,最明显的是operator=
,其链接(或表达式重用)实际上在绝大多数情况下掩盖了代码。我们这样做只是为了(不幸的)惯例。
什么是链接?确切地说,返回此类引用的目的是允许:
std::string{"asdf"}.append(c1).append(c2)
不出所料,append
string&
回归。虽然对string
有点用(append({c1, c2})
更简洁),但在大多数其他情况下(例如您的,我们可以只添加两个int
而不是调用该方法两次)毫无意义。
相关文章:
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 当我尝试通过 arduino 上的引用传递布尔数组时出现问题
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 我可以从其变量中获取对类对象的引用吗?
- 我可以引用模板的基类吗?
- 为什么我不能直接从返回指针的函数返回对指针的引用?
- 为什么我的C++代码无法编译,出现未定义的引用错误
- 我的代码中C++未定义的引用错误?
- 在 vscode for c++ 中使用 sqlite3(未定义对 'xxx' 的引用)(我使用了 -lsqlite3)
- 使用Cygwin C++时出现未定义的引用错误,为什么我的文件没有链接?
- 为什么我总是收到错误:"未定义对'robots::robots()'的引用
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 未定义的引用错误,我该怎么办?
- 我可以在将项目编译为静态库(未定义的引用)时在代码中使用 QImage 吗?
- 我仍然收到此错误未定义的引用:boost::log::v2_mt_posix::trivial::logger::get
- 在成员初始化列表中,我可以创建对列表中不在列表中的成员变量的引用
- makefile对我的名称空间对象/函数/构造函数的不确定引用
- 我不明白我的引用计数中的内存错误