我有一个关于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;
}
};
小心,因为它涉及动态分配,所以速度要慢得多。