在他自己的方法中,有可能将一个对象取消引用到另一个对象吗



我有一个关于C++问题的问题。假设我有一个非常大的类,叫做BigClass,我说BigClass* foo = new BigClass();

假设我在BigClass中有一个方法,它定义了另一个BigClass类型的本地对象tmp,在方法的末尾,我通过对tmp进行一些操作来检查是否存在错误,如果没有,我想将this取消引用到该对象。我不想将所有参数从tmp复制到this,因为对象太大,过程会很慢。有没有任何方法可以在对象自己的方法中取消引用该对象?

示例:

class BigClass
{
int a;
long b;
std::vector<int> c;
// other members...
void replace()
{
BigClass* tmp = new BigClass();
// do some calculations with tmp
*this = tmp; // problem
}
}

为什么*this=tmp是个问题

我定义了一个运算符=它只做这样的事情:

this.a = src.a;
this.b = src.b;
this.c = src.c;
.
.
.

但在那里,我复制了所有成员变量,这很慢。我想简单地取消引用对象,而不是复制所有成员变量。

如果你不想复制,你可以移动它:

struct BigClass {
void func() {
BigClass tmp;
*this = std::move(tmp);
}
};

移动操作通常不涉及大缓冲区的动态分配或复制。

如果您遵循零规则,将为您定义移动分配运算符。

否则,您可以始终使用默认运算符来定义它:

struct BigClass {
BigClass& operator=(BigClass&&) = default;
// ...
};

你也可以编写自己的运算符,但默认的运算符通常能很好地完成任务。

struct BigClass {
//          quite important ----v------v
BigClass& operator=(BigClass&& rhs) noexcept {
this->a = std::move(rhs.a);
this->b = std::move(rhs.b);
this->c = std::move(rhs.c);
}
// ...
};

移动操作通常非常快,并且比new快得多。


或者,您也可以新建对象并将指针分配给它:

struct BigClass {
auto replace() -> BigClass* {
auto tmp = new BigClass{};
// ...
return tmp;
}
};

小心,因为它涉及动态分配,所以速度要慢得多。

相关内容

最新更新