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将非常有用。)