是否在赋值中调用了类析构函数?

时间:2015-06-28 16:54:02

标签: c++

当已经拥有对象的变量接收到c ++代码中的另一个对象时,是否会调用类析构函数?

Car car1;
Car car2;

car1 = car2;

在这种情况下是否会调用car1析构函数?

5 个答案:

答案 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>