是否在作业中调用了类析构函数?

Ren*_*osé 6 c++

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

Car car1;
Car car2;

car1 = car2;
Run Code Online (Sandbox Code Playgroud)

是否car1析构函数被调用在这种情况呢?

Bau*_*gen 5

当你这样做时,析构函数car1不会被执行

car1 = car2;
Run Code Online (Sandbox Code Playgroud)

仅(可能隐式生成)Car::operator= (const Car&);将被调用car1

仅当以下情况时才会调用析构函数car1超出范围时才会被调用(或者当您显式调用它时,但您实际上很少需要它)。

另请注意,它car1并不“保存”Car实例,它实例本身。


Ser*_*tch 3

您可以在以下程序中看到,直到 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,可以在实现的赋值运算符中执行此操作,如代码示例所示。不要忘记也实现复制构造函数 - 这是针对分配给未初始化实例的情况(不需要释放以前持有的资源,因为在复制构造函数调用时没有保留资源)。