c++ - 混淆堆内存和栈内存中的对象

标签 c++

一个方法;

        Sterling operator+(const Sterling& o) const {
           return Sterling(*this) += o;
         }

“Sterling(*this) += o”这一行是否在堆栈内存中创建了一个新对象?如果为真,它如何将堆栈中的对象返回到方法外?

我可以这样做吗:

         Sterling operator+(const Sterling& o) const {
           return *this += o;
         }

因为我认为 *this 是一个对象所以我们不需要创建一个新对象?

最佳答案

 Sterling operator+(const Sterling& o) const {
     return Sterling(*this) += o;
 }

在堆栈上创建对象,但您实际上并没有返回该对象,而是返回了它的一个拷贝。这个函数做:

  • 创建一个临时对象
  • o调用临时对象的operator+=
  • 返回结果的拷贝 - 注意 Sterling operator+(const Sterling& o) const - 如果它是 Sterling& operator+(const Sterling& o) const ( *注意 & * ),那么这将是一个问题)

无论如何,您的编译器可以通过使用 RVO 优化它并避免复制本地对象。


第二个问题:

Sterling operator+(const Sterling& o) const {
   return *this += o;
}

这与第一个不同 - 第一个案例创建临时对象并更改它,然后返回它。如果您执行第二个操作,这将更改this,然后返回它的拷贝。但请注意,this 对象已更改!


因此,总结 - 两者都返回相同的结果,但第二个改变了this。 (如果你想重载 operator+= 而不是 operator+ ,他会很有用)

关于c++ - 混淆堆内存和栈内存中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6042948/

相关文章:

c++ - 从派生类初始化列表调用基类构造函数的顺序

c++ - 如何在 C++ MFC 中同时打开两个对话框?

c++ - 如何在 CMake 中删除特定系统包含目录

c++ - 通过并行处理在二维数组中找到最大值及其坐标

c++ - 每当我尝试获取程序的结果时,调试实验室都会在我看到结果之前退出

c++ - 按 STL - C++ 中的成绩对学生列表进行排序?

c++ - 为什么我运行 node-waf build 后有一个 .lock-wscript 文件

c++ - 两点距离的解是什么?

c++ - 安全且跨越库边界的唯一类类型 ID

c++ - std::iterator 的错误指示器