Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 混淆堆内存中的对象和堆栈内存_C++ - Fatal编程技术网

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

C++ 混淆堆内存中的对象和堆栈内存,c++,C++,方法 Sterling operator+(const Sterling& o) const { return Sterling(*this) += o; } 此行“Sterling(*this)+=o”是否在堆栈内存中创建新对象?如果为true,它如何将堆栈中的对象返回到方法外部 我可以这样做吗: Sterling operator+(const Sterling& o) const {

方法

        Sterling operator+(const Sterling& o) const {
           return Sterling(*this) += o;
         }
此行“Sterling(*this)+=o”是否在堆栈内存中创建新对象?如果为true,它如何将堆栈中的对象返回到方法外部

我可以这样做吗:

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

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

在您的示例中,
Sterling
作为传递值对象返回——它存储在堆栈上(或寄存器,无论编译器选择哪种存储方式)。

此处:

Sterling operator+(const Sterling& o) const {
   return Sterling(*this) += o;
}
创建一个临时(是的,新的)对象(在堆栈上,或者更严格地说,在自动存储中),然后修改临时对象并从函数返回其副本(以某种实现定义的方式)

在这里:

Sterling operator+(const Sterling& o) const {
   return *this += o;
}
更改当前对象(调用方法的对象),然后从函数返回其副本

 Sterling operator+(const Sterling& o) const {
     return Sterling(*this) += o;
 }
因此,主要区别在于当前对象是被更改的还是临时对象。在这两种情况下,修改后的对象都会被复制并从函数返回

 Sterling operator+(const Sterling& o) const {
     return Sterling(*this) += o;
 }
在堆栈上创建对象,但实际上不返回此对象,而是返回其副本。此功能用于:

  • 创建临时对象
  • 使用
    o
  • 返回结果副本-注意
    Sterling运算符+(const Sterling&o)常量
    -如果是
    Sterling&operator+(const Sterling&o)常量
    (*注意
    &
    *),则这将是一个问题)
无论如何,编译器可以通过使用


第二个问题:

Sterling operator+(const Sterling& o) const {
   return *this += o;
}
这与第一个不同-第一个案例创建临时对象并更改它,然后返回它。如果执行第二个操作,这将更改
,然后返回其副本。但请注意,
对象已更改


因此,summary-两者都返回相同的结果,但是第二个结果改变了this。(如果您希望重载
运算符+=
,而不是
运算符+
,his将非常有用。)