C++复制构造函数和默认构造函数

C++ copy Constructor and default constructor

本文关键字:构造函数 默认 C++ 复制      更新时间:2023-10-16

我正在学习C ++,并发现了一个我不太理解的输出。

#include <iostream>
using namespace std;
class A{
public:
A(){ cout << "A+" << endl;}
A(const A&){ cout << "A(A)" << endl;}
~A(){cout << "A-" << endl;}
};
class B{
public:
B(){ cout << "B+" << endl;}
B(const B&){cout << "B(B)" << endl;}
~B(){cout << "B-" << endl;}
private:
A a;
};
class C : public A{
public:
C(const B& b) : b1(b) { cout << "C+" << endl;}
~C(){ cout << "C-" << endl;}
private:
B b1,b2;
};
void test(A a){
A m(a);
}
int main(){
B b;
C c(b);
test(c);
return 0;
}

输出为

A+
B+
A+
A+
B(B)
A+
B+
C+
A(A)
A(A)
A-
A-
C-
B-
A-
B-
A-
A-
B-
A-

我的意思是第一个,B 默认看到 a 我们从类型 A 中得到了一个成员并转到 A 即A+比回到 B 并打印B+.这就是它B b;C c(b)它去 C 时,看到它的公共 A 去 A 并打印 A+ 而不是回去看我们得到了一个成员 B B1,b2 去 B 和 B 有一个成员 A 和 agean 到 A 并打印A+,而不是我不明白为什么 B(B(?在此之后 B(B(我什么都不懂..我尝试调试它,但它对我没有太大帮助,也许有人可以解释为什么这样工作?

如果我正确理解了您的问题,您正在尝试理解输出

A+
A+
B(B)
A+
B+
C+

与本声明相对应

C c(b);

C 类具有基类 A

class C : public A{

所以类 A 的构造函数称为

A+

然后创建数据成员 B1

C(const B& b) : b1(b) { cout << "C+" << endl;}

类 B 又具有数据成员 A

class B{
public:
B(){ cout << "B+" << endl;}
B(const B&){cout << "B(B)" << endl;}
~B(){cout << "B-" << endl;}
private:
A a;
};

因此,当类 B 的复制构造函数称为数据成员时,将创建数据成员a

A+
B(B)

类 C 具有另一个类 B 的数据成员。它是数据成员 b2。 所以这些构造函数被称为

A+
B+

最后,构造函数 C 的主体获得控制权

C+

析构函数以相对于创建对象的顺序相反的顺序获取控件。

因此,对象的析构函数输出c如下所示

C-
B-
A-
B-
A-
A-

您可以通过对程序进行微小的更改使程序输出更加清晰。

例如

#include <iostream>
using namespace std;
class A{
public:
A(){ cout << "A+" << endl;}
A(const A&){ cout << "A(A)" << endl;}
~A(){cout << "A-" << endl;}
};
class B{
public:
B() : i( n++ ) { cout << "B+" << ' ' << i << endl;}
B(const B&) : i( n++ ) {cout << "B(B)" << ' ' << i << endl;}
~B(){cout << "B-" << ' ' << i << endl;}
private:
size_t i;
static size_t n;
A a;
};
size_t B::n;
class C : public A{
public:
C(const B& b) : b1(b) { cout << "C+" << endl;}
~C(){ cout << "C-" << endl;}
private:
B b1,b2;
};
void test(A a){
A m(a);
}
int main(){
B b;
std::cout << 'n';
C c(b);
std::cout << 'n';
test(c);
std::cout << 'n';
}

此更新程序的程序输出为

A+
B+ 0
A+
A+
B(B) 1
A+
B+ 2
C+
A(A)
A(A)
A-
A-
C-
B- 2
A-
B- 1
A-
A-
B- 0
A-

让我们仔细看看C构造函数(稍微重新格式化(:

C(const B& b)
:
b1(b)
{
cout << "C+" << endl;
}

首先,将调用A构造函数,因为它是C的基类。这将打印A+.

然后,b1成员将被复制构造,由于B::a成员,它将首先打印A+,然后在B复制构造函数主体中打印B(B)

然后b2成员将被默认构造,它将打印A+(再次因为B::a成员(后跟B+

然后C构造函数体将运行,它将打印C+


C构造函数实际上等效于此(添加了注释(:

C(const B& b)
: A(),      // Prints A+
b1(b),    // Prints A+ and B(B)
b2()      // Prints A+ and B+
{
cout << "C+" << endl;    // Prints C+
}

希望这将使人们更容易看到正在发生的事情。