c++入门练习13.13,关于构造函数

the c++ primer exercise 13.13, about the constructor

本文关键字:构造函数 c++ 练习      更新时间:2023-10-16

我做了c++引物的13.13练习,这是我的代码

#include <iostream>
#include <vector>
using namespace std;
struct X{
X(){cout<<"X()"<<endl;}
X(const X&){cout<<"X(const X&)"<<endl;}
X& operator=(const X&){
    cout<<"X& operator=(const X&)"<<endl;
    return *this;
}
~X(){cout<<"~X()"<<endl;}
};
void foo(const X& cx, X bx){
vector<X> v;
v.push_back(cx);
v.push_back(bx);
}
int main(){
X* x1=new X;
X x2;
x2=*x1;
foo(*x1, x2);
delete x1;
return 0;
}

我得到了四次"X(const X&("的输出,我猜前三次来自于传递x2、push_back(cx(和push_back。但是为什么会有第四个"X(const X&(">

它与push_back的实现方式有关。

其中一个副本是由于按值传递bxfoo。将该参数作为参考,副本数量将减少一。

其余的似乎都是由于push_back。我在尝试了你的代码http://www.tutorialspoint.com/compile_cpp_online.php在每个CCD_ 5之前和之后具有额外的打印输出。我还将总共10个元素推到向量上。对CCD_ 6的第二次调用导致复制构造函数被调用两次,第三次呼叫使其被呼叫三次,第五次呼叫引起五次,第九次呼叫造成了九次。对push_back的所有其他调用都导致调用复制构造函数只有一次。

但当我在第一次呼叫CCD_ 9之前执行CCD_,对CCD_ 10的每次调用都会导致对复制构造函数的一次调用。当我把20改为8时,第九个push_back导致对复制构造函数的九次调用,所有其他调用只产生了一次调用。

我得出结论,额外的复制构造函数调用与vector必须进行的维护(复制现有元素(当它在没有"保留"所需空间的情况下增长时。

所以Michael Burr的假设是正确的,你应该能够证实这也是通过对代码进行实验来实现的。

当第二个元素添加到向量(v.push_back(bx);(时,可能会调整向量的底层存储的大小,并将向量中已有的单个元素复制到新的存储中。

在第二个push_back()调用周围添加以下内容:

cout << "about to do push_back(bx)" << endl;
v.push_back(bx);
cout << "done push_back(bx)" << endl;