c++ - 为什么在 C++ 中按值返回是推荐的方式?
解决方案
在考虑返回引用之前,您必须首先确定结果将引用哪个对象。你有什么选择?
- 您可以返回对本地自动变量的引用......这非常糟糕,因为一旦函数返回,本地变量将不存在。
- 您可以返回对静态或线程本地存储中的变量的引用。这很糟糕,因为全局状态很糟糕。
- 您可以返回对调用者作为参数提供的对象的引用。好吧,在这种情况下,返回引用通常是没有意义的,因为调用者已经知道对象在哪里,因为他们首先负责提供参数。这只是引用文本推荐的“输出参数”的复杂版本。
当然,在某些情况下返回引用是有意义的。引用的一般经验法则并不适用于所有情况。它们适用于大多数简单的情况。如果您知道不遵循它的充分理由,那就不要这样做。如果你不知道是否有原因,那么就按照规则,直到你理解为止。
重要的是要注意建议的上下文。该部分以“如果您有一个需要返回类的对象的函数...”开头。上下文不是“如果您有一个需要返回对类对象的引用的函数”。
我对可以在链中调用的成员函数进行引用返回
obj.DoX(...).DoY(...).DoZ(...);
方法链接是返回引用的习惯用法*this
。所以,这将是常规的。从技术上讲,我上面的第 3 点适用于这种情况。调用者已经有了obj
,那么为什么要返回对它的引用呢?在这种情况下,答案是:为方便起见返回引用。
我想说这本书的建议非常适用于函数式编程范式。
面向对象的编程范式完全不同。修改的成员函数*this
实际上是一个带有输出参数的函数 - 参数是隐式*this
对象 - 被修改。因此,引用的经验法则可以被视为对 setter 函数的建议......或者它可能被视为不适用于面向对象的编程。
推荐阅读
- sql-server - SSIS 在不使用 SQL Server 代理的情况下安排包
- r - 由于 POSIXIt 错误而无法执行变异
- javascript - 无法让 jQuery 动画与 ASP.NET 母版页一起使用
- mysql - 另一个表中存在的sql查询条目
- google-static-maps - 即使使用 API 密钥,Google Maps Static API 403
- r - 如何抓取csvs文件夹的部分文件名并将该名称作为列插入到R中的数据框中
- r - 省略 RColorBrewer 调色板上较亮的颜色以在 ggplot2 中使用
- https - Crawlera HTTPS 页面永久超时
- reactjs - 创建反应应用程序(打字稿)将环境文件添加到生产构建
- bash - 字符串中的 Bash 回显变量总是有空格