c++入门练习13.13,关于构造函数
the c++ primer exercise 13.13, about the constructor
我做了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
的实现方式有关。
其中一个副本是由于按值传递bx
到foo
。将该参数作为参考,副本数量将减少一。
其余的似乎都是由于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;
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为