以自定义的string类为例。已有有构造好的变量a b
问题一:针对a = b表达式,会调用拷贝赋值构造函数,那在拷贝赋值函数内需要对a原有的资源释放吗?我看例子里一般都没有,是隐式调用了析构还是大家忽略了。
问题二:针对a=a+b表达式,我想对+号重载,使对右侧的a的资源进行移动,避免深拷贝,但是这里右侧的a又是一个左值。只能通过重载函数参数用右值引用,调用的时候用a=std::move(a)+b吗
以自定义的string类为例。已有有构造好的变量a b
问题一:针对a = b表达式,会调用拷贝赋值构造函数,那在拷贝赋值函数内需要对a原有的资源释放吗?我看例子里一般都没有,是隐式调用了析构还是大家忽略了。
问题二:针对a=a+b表达式,我想对+号重载,使对右侧的a的资源进行移动,避免深拷贝,但是这里右侧的a又是一个左值。只能通过重载函数参数用右值引用,调用的时候用a=std::move(a)+b吗
该回答引用GPTᴼᴾᴱᴺᴬᴵ
对于问题一,如果在拷贝赋值函数内对原有资源进行释放,那么当函数返回时,原有资源已经被释放掉,从而导致a成为悬空指针。因此,在拷贝赋值函数中不需要对原有资源进行释放。如果需要释放资源,可以在析构函数中进行。
对于问题二,如果您希望避免对右侧的a进行深拷贝,可以考虑在重载+号运算符时,实现移动语义,避免创建新的对象。在实现移动语义时,可以使用右值引用来接受右侧的参数,同时在函数中使用std::move()将参数强制转换为右值,从而进行资源的移动操作。例如:
String operator+(String&& rhs) {
// 进行资源移动操作,避免深拷贝
...
return *this;
}
在调用时,可以使用std::move()来将左侧的a转换为右值引用:
a = std::move(a) + b;
这样,就可以避免对右侧的a进行深拷贝,从而提高了性能。