C++ C++;默认、复制和升级构造函数
我有以下代码[这是一个面试问题]:C++ C++;默认、复制和升级构造函数,c++,inheritance,constructor,C++,Inheritance,Constructor,我有以下代码[这是一个面试问题]: #include <iostream> #include <vector> using namespace std; class A{ public: A(){ cout << endl << "base default"; } A(const A& a){ cout << endl << "base copy ctor"
#include <iostream>
#include <vector>
using namespace std;
class A{
public:
A(){
cout << endl << "base default";
}
A(const A& a){
cout << endl << "base copy ctor";
}
A(int) {
cout << endl << "base promotion ctor";
}
};
class B : public A{
public:
B(){
cout << endl << "derived default";
}
B(const B& b){
cout << endl << "derived copy ctor";
}
B(int) {
cout << endl << "derived promotion ctor";
}
};
int main(){
vector<A> cont;
cont.push_back(A(1));
cont.push_back(B(1));
cont.push_back(A(2));
return 0;
}
我很难理解这个输出,特别是为什么只调用一次基本默认值,而调用最后3个副本。有人能解释一下这个输出吗
谢谢。基本默认构造函数从第行调用一次
cont.push_back(B(1));
所有B
构造函数都调用默认的A
构造函数。最后两个复制构造函数是由于向量重新分配。例如,如果您添加了
cont.reserve(3);
在推回之前,他们会离开
在这之前的一个是临时a(2)
的副本,在最后的push\u back
中,基本默认构造函数从行调用一次
cont.push_back(B(1));
所有B
构造函数都调用默认的A
构造函数。最后两个复制构造函数是由于向量重新分配。例如,如果您添加了
cont.reserve(3);
在推回之前,他们会离开
在此之前的一个是最后一个push_back
中临时a(2)
的副本,此外还有一个足够大的向量,因此它不会调整大小;另请注意:如果在启用优化的情况下编译,那么当编译器优化它们时,两个复制构造函数将消失。为什么a(2)push_back的顺序是:base copy ctor base promotion ctor,base copy ctor,而a(1)push_back的顺序是:base promotion ctor,除了有一个足够大的向量,使其不调整大小之外,还有一个基本副本;另请注意:如果在启用优化的情况下编译,那么当编译器优化它们时,两个复制构造函数将消失。为什么a(2)push_back的顺序是:base copy ctor base promotion ctor,base copy ctor,而a(1)push_back的顺序是:base promotion ctor,请回复评论或提出新问题。这是一个新问题,不是吗?是的,编辑是一个单独的问题;我确实试过reserve()。它们有确切的顺序-请回复评论或提出新问题。这是一个新问题,不是吗?是的,编辑是一个单独的问题;我确实试过reserve()。它们有确切的顺序-