C++;函数调用,为什么使用析构函数? 我试图理解C++中的函数调用。我有以下代码: class A{ public: A() { cout << "hello\n"; } A(const A& obj) { cout << "world\n"; } ~A() { cout << "bye\n"; } virtual void print() { cout << "a\n"; } }; A foo(A aobj) { aobj.print(); return aobj; } int main(){ A a,b,c; foo(a); system("pause"); return 0; }

C++;函数调用,为什么使用析构函数? 我试图理解C++中的函数调用。我有以下代码: class A{ public: A() { cout << "hello\n"; } A(const A& obj) { cout << "world\n"; } ~A() { cout << "bye\n"; } virtual void print() { cout << "a\n"; } }; A foo(A aobj) { aobj.print(); return aobj; } int main(){ A a,b,c; foo(a); system("pause"); return 0; },c++,function,destructor,C++,Function,Destructor,有人能解释一下为什么析构函数在最后被调用了两次吗?是因为两个复制构造函数调用吗 谢谢你抽出时间 “bye”被打印5次,因为~A()也被调用5次。对于对象a,b,c析构函数称为对象。然后,当您通过值传递a时,将在foo中创建一个副本,然后销毁该副本。最后,foo的返回类型是A的一个实例,当执行移动到下一行时,该实例将被销毁。因此,~A()总共会被调用5次 在对象生命周期结束时调用析构函数以释放对象使用的内存。尝试以下操作: class A { public: A() { co

有人能解释一下为什么析构函数在最后被调用了两次吗?是因为两个复制构造函数调用吗

谢谢你抽出时间

“bye”被打印5次,因为
~A()
也被调用5次。对于对象
a
b
c
析构函数称为对象。然后,当您通过值传递
a
时,将在
foo
中创建一个副本,然后销毁该副本。最后,foo的返回类型是
A
的一个实例,当执行移动到下一行时,该实例将被销毁。因此,
~A()
总共会被调用5次

在对象生命周期结束时调用析构函数以释放对象使用的内存。

尝试以下操作:

class A {
       public:
    A() { cout << "Default ctor → A::A()\n"; }
    ~A() { cout << "Default dtor → A::~A()\n"; }

    A(const A&) {
        cout << "Copy ctor → A::A(const A& rhs)\n";
    }
    A& operator=(const A& rhs) {
        cout << "Copy operator= → A& A::operator=(const A& rhs)\n";
        return *this;
    }

    A(const A&&) {
        cout << "Move ctor → A::A(const A&& rhs)\n";
    }
    A& operator=(const A&& rhs) {
        cout << "Move operator= → A& A::operator=(const A&& rhs)\n";
        return *this;
    }
};
A类{
公众:

A(){cout创建了5个对象,因此将输出5个“bye”

但是,在调用
系统(“暂停”)
(由
foo()
创建的2个对象)之前,只有2个对象超出范围并被销毁。其他3个对象在调用
系统(“暂停”)
之后超出范围并被销毁。因此,您可能没有机会看到这3个“再见”s如果应用程序退出时控制台窗口关闭

您可以通过引入另一个寿命较短的作用域来强制这3个对象更快地超出作用域,如下所示:

int main(){
    {
    A a,b,c;
    foo(a);
    }
    system("pause");
    return 0;
}
void doIt(){
    A a,b,c;
    foo(a);
}

int main(){
    doIt();
    system("pause");
    return 0;
}
或者像这样:

int main(){
    {
    A a,b,c;
    foo(a);
    }
    system("pause");
    return 0;
}
void doIt(){
    A a,b,c;
    foo(a);
}

int main(){
    doIt();
    system("pause");
    return 0;
}

现在,在调用
系统(“暂停”)

2次或5次之前,所有5个对象都将超出范围并被销毁,这就是问题所在?为什么是5次?“再见”在输出中只打印了2次。我得到了5个
bye
。应该有5个,5个对象被构造,5个对象被删除。是的,当然有。有些事情发生在
main
的末尾。请只发布您运行的实际代码。好的!谢谢您澄清这一点!您真的不应该在代码中包含任何内容,但不能包含纯ASCII。Wny不是吗?B因为有人试图了解特殊成员函数,所以运行您的代码时,会被一些与特殊成员函数完全无关的东西(编译器需要ascii码并给出错误、输出格式错误等)弄糊涂,从而使您的答案不那么有用(可能有害)为了它明显的目的。这个答案的目的是什么?你认为添加赋值运算符和移动构造函数可以实现什么?是的,我读了这个问题。这就是为什么我知道OP问的是关于析构函数的问题,而不是关于赋值运算符或移动构造函数的问题。而且在任何情况下,代码转储都不是答案。我不会回答swer,因为无法再现报告的问题OP。