c ++运算符重载内存问题

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引用,则将其复制到隐藏在堆栈上的临时值.