Ori*_*Ori 3 c++ memory operator-overloading
在c ++中,您可以在堆和堆栈上创建类的新实例.当重载运算符时,您是否能够以有意义的方式在堆栈上实例化?
据我所知,一旦函数执行完毕,就会删除堆栈上的实例.这使得好像返回一个坐在堆栈上的新实例会有问题.
我写这篇文章知道必须有办法,但我不确定最佳做法是什么.如果我有一些设计为始终驻留在堆栈中的类,我该如何处理运算符重载?
任何信息都会有所帮助,谢谢
{编辑}我正在重载+运算符.现在我使用这段代码
Point Point::operator+ (Point a)
{
Point *c = new Point(this->x+a.x,this->y+ a.y);
return *c;
}
Run Code Online (Sandbox Code Playgroud)
我对如此实例化c持怀疑态度:
Point c(this->x + a.x, this->y, a.y);
Run Code Online (Sandbox Code Playgroud)
因为那会将它分配给堆栈.我担心的是,一旦这个函数完成执行,堆栈指针就会改变,并且实例将不再安全,因为定义的任何新的局部变量都可以擦除它.这不是一个问题吗?
Ste*_*sop 12
例如operator+,如果您正在讨论返回的对象不是那些输入,那么答案是您在堆栈上实例化并按值返回:
struct SomeClass {
int value;
};
SomeClass operator+(const SomeClass &lhs, const SomeClass &rhs) {
SomeClass retval;
retval.value = lhs.value + rhs.value;
return retval;
}
Run Code Online (Sandbox Code Playgroud)
要么
class SomeClass {
int value;
public:
SomeClass operator+(const SomeClass &rhs) const {
SomeClass retval;
retval.value = this->value + rhs.value;
return retval;
}
};
Run Code Online (Sandbox Code Playgroud)
甚至:
class SomeClass {
int value;
public:
SomeClass(int v) : value(v) {}
friend SomeClass operator+(const SomeClass &lhs, const SomeClass &rhs) {
return SomeClass(lhs.value + rhs.value);
}
};
Run Code Online (Sandbox Code Playgroud)
然后编译器担心返回值实际存储在哪里(在堆栈上).
例如,如果可以的话,它将应用返回值优化,但原则上正在发生的是"as-if"你所做的工作在你的运算符重载的堆栈上构造一些值,然后在返回时将它复制到它需要的任何地方接下来.如果调用者分配了返回值,则将其复制到那里.如果调用者通过值将其传递给某个其他函数,则会将其复制到调用约定所需的任何位置,以便成为该函数参数.如果调用者采用const引用,则将其复制到隐藏在堆栈上的临时值.