C++拷贝构造函数和默认构造函数
C++ copy Constructor and default constructor
我正在学习 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+
然后返回 B 并打印 B+
。就是这样 B b;
而不是 C c(b)
它转到 C,看到它的 public A 转到 A 并打印 A+ 比回去看到我们有一个成员 B b1,b2 转到 B 和 B有一个成员 A 并转到 A 并打印 A+
并且我不明白为什么 B(B) ?在这个 B(B) 之后我什么都不懂..我尝试调试它但它对我没有太大帮助,也许有人可以解释为什么这样工作?
让我们仔细看看 C
构造函数(稍微重新格式化):
C(const B& b)
:
b1(b)
{
cout << "C+" << endl;
}
首先将调用 A
构造函数,因为它是 C
的基础 class。这将打印 A+
.
然后b1
成员将被复制构造,由于B::a
成员将首先打印A+
,然后在[=20中打印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+
}
希望这样可以更容易地了解正在发生的事情。
如果我没有正确理解你的问题,那么你正在尝试理解输出
A+
A+
B(B)
A+
B+
C+
对应于此声明
C c(b);
class C 有基数 class A
class C : public A{
所以classA的构造函数被调用
A+
然后创建数据成员b1
C(const B& b) : b1(b) { cout << "C+" << endl;}
class B 又拥有数据成员 A
class B{
public:
B(){ cout << "B+" << endl;}
B(const B&){cout << "B(B)" << endl;}
~B(){cout << "B-" << endl;}
private:
A a;
};
所以当 class B 的复制构造函数被调用时,数据成员 a
被创建
A+
B(B)
classC多了一个classB的数据成员,就是数据成员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++ 并发现了一个我不太理解的输出。
#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+
然后返回 B 并打印 B+
。就是这样 B b;
而不是 C c(b)
它转到 C,看到它的 public A 转到 A 并打印 A+ 比回去看到我们有一个成员 B b1,b2 转到 B 和 B有一个成员 A 并转到 A 并打印 A+
并且我不明白为什么 B(B) ?在这个 B(B) 之后我什么都不懂..我尝试调试它但它对我没有太大帮助,也许有人可以解释为什么这样工作?
让我们仔细看看 C
构造函数(稍微重新格式化):
C(const B& b)
:
b1(b)
{
cout << "C+" << endl;
}
首先将调用 A
构造函数,因为它是 C
的基础 class。这将打印 A+
.
然后b1
成员将被复制构造,由于B::a
成员将首先打印A+
,然后在[=20中打印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+
}
希望这样可以更容易地了解正在发生的事情。
如果我没有正确理解你的问题,那么你正在尝试理解输出
A+
A+
B(B)
A+
B+
C+
对应于此声明
C c(b);
class C 有基数 class A
class C : public A{
所以classA的构造函数被调用
A+
然后创建数据成员b1
C(const B& b) : b1(b) { cout << "C+" << endl;}
class B 又拥有数据成员 A
class B{
public:
B(){ cout << "B+" << endl;}
B(const B&){cout << "B(B)" << endl;}
~B(){cout << "B-" << endl;}
private:
A a;
};
所以当 class B 的复制构造函数被调用时,数据成员 a
被创建
A+
B(B)
classC多了一个classB的数据成员,就是数据成员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-