当已经拥有对象的变量接收到c ++代码中的另一个对象时,是否会调用类析构函数?
Car car1;
Car car2;
car1 = car2;
在这种情况下是否会调用car1
析构函数?
答案 0 :(得分:4)
时,
car1
的析构函数将不执行
car1 = car2;
Car::operator= (const Car&);
只会调用(可能是隐式生成的)car1
。
只有当car1
超出范围时(或者当你明确地调用它时,才会调用析构函数,但你真的很少需要它)。
另请注意car1
没有"持有" Car
实例, 实例本身。
答案 1 :(得分:1)
你可以在下面的程序中看到,在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;
}
在作业t1=t2
中,仅在t1
上调用赋值运算符,并将t2
作为参数。如果需要释放t1
的资源,可以在代码示例显示的赋值运算符中执行此操作。不要忘记实现复制构造函数 - 这是分配给未初始化实例的情况(不需要释放以前保存的资源,因为复制构造函数调用时没有资源)。
答案 2 :(得分:1)
Car car1();//error, Car car1; call default construct function
Car car2(); //error, Car car2;call default construct function
car1 = car2; //call operator=()
答案 3 :(得分:0)
这取决于。如果在堆上分配内存并将一个变量分配给另一个变量,它将不会调用析构函数:
{
Car* car1 = new Car();
Car* car2 = new Car();
car1 = car2;
}
但这会,因为它超出范围而不是因为复制分配。
{
Car car1;
Car car2;
car1 = car2;
}
答案 4 :(得分:0)
car1 = car2;
这导致car1
的破坏者不被执行
如果你想要调用析构函数,car1
需要被显式调用,或者它应该超出范围。(正如我们的朋友Baum mit Augen所说,调用car1
显然很少需要)。< / p>