构造函数和析构函数调用的顺序?

时间:2015-04-24 17:37:23

标签: c++ codeblocks

我无法理解构造函数和析构函数调用的顺序?什么将在本声明中首先执行A b = f(a)?有人可以帮帮我吗?

#include<iostream>
using namespace std;

class A {
    int x;

    public:
        A(int val = 0)
        :x(val) {
            cout << "A " << x << endl << flush;
        }
        A(const A& a) {
            x = a.x;
            cout << "B " << x << endl << flush;
        }
        void SetX(int x) {
            this->x = x;
        }
        ~A() {
            cout << "D " << x << endl << flush;
        }
};

A f(A a) {
    cout << " C " << endl << flush;
    a.SetX(100);
    return a;
}

int main()
{
    A a(1);
    A b=f(a);
    b.SetX(-100);
    return 0;
}

输出窗口:

A 1
B 1
 C
B 100
D 100
D -100
D 1

为什么在输出窗口的第2行打印B 1?

1 个答案:

答案 0 :(得分:5)

  

“为什么在第2行打印B 1?”

因为从这个语句中调用了复制构造函数

A b=f(a);

函数f()需要通过值传递A,因此在函数调用堆栈上创建此参数的副本。

如果您的下一个问题应该是,如何克服此行为,并避免调用复制构造函数,则只需将A实例作为对f()的引用传递:

    A& f(A& a) {
  // ^    ^
        cout << " C " << endl << flush;
        a.SetX(100);
        return a;
    }

旁注:endl << flush;是多余的BTW,std::endl已包含已刷新。