当已经包含对象的变量在c ++代码中接收到另一个对象时,是否会调用类析构函数?
Car car1;
Car car2;
car1 = car2;
Run Code Online (Sandbox Code Playgroud)
是否car1析构函数被调用在这种情况呢?
当你这样做时,析构函数car1将不会被执行
car1 = car2;
Run Code Online (Sandbox Code Playgroud)
仅(可能隐式生成)Car::operator= (const Car&);将被调用car1。
仅当以下情况时才会调用析构函数car1超出范围时才会被调用(或者当您显式调用它时,但您实际上很少需要它)。
另请注意,它car1并不“保存”Car实例,它是实例本身。
您可以在以下程序中看到,直到 main() 函数结束才调用 t1 或 t2 的析构函数:
#include <iostream>
#include <string>
class Test
{
std::string _name;
public:
Test(std::string name) : _name(name) { }
~Test()
{
std::cout << "Destructor " << _name << std::endl;
}
Test& operator=(const Test& fellow)
{
// avoid changing the name of the object
std::cout << "Assignment operator "
<< _name << "=" << fellow._name << std::endl;
return *this;
}
};
int main()
{
Test t1("t1"), t2("t2");
t1 = t2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在赋值中t1=t2,仅在t1将其t2作为参数时调用赋值运算符。如果需要释放 的资源t1,可以在实现的赋值运算符中执行此操作,如代码示例所示。不要忘记也实现复制构造函数 - 这是针对分配给未初始化实例的情况(不需要释放以前持有的资源,因为在复制构造函数调用时没有保留资源)。