在哪些情况下,如果复制了容器,则调用复制构造函数
In which cases is the copy constructor called, if a container is copied
我测试了以下代码:
#include <iostream>
#include <vector>
class foo {
public:
int m_data;
foo(int data) : m_data(data) {
std::cout << "parameterised constructor" << std::endl;
}
foo(const foo &other) : m_data(other.m_data) {
std::cout << "copy constructor" << std::endl;
}
};
main (int argc, char *argv[]) {
std::vector<foo> a(3, foo(3));
std::vector<foo> b(4, foo(4));
//std::vector<foo> b(3, foo(4));
std::cout << "a = b" << std::endl;
a = b;
return 0;
}
我得到
parameterised constructor
copy constructor
copy constructor
copy constructor
parameterised constructor
copy constructor
copy constructor
copy constructor
copy constructor
a = b
copy constructor
copy constructor
copy constructor
copy constructor
但是,如果我将std::vector<foo> b(4, foo(4));
替换为std::vector<foo> b(3, foo(4));
则a = b
不会调用复制构造函数,并且输出为
parameterised constructor
copy constructor
copy constructor
copy constructor
parameterised constructor
copy constructor
copy constructor
copy constructor
a = b
为什么在这种情况下不调用复制构造函数?
我正在使用 g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
在第一种情况下,a
在分配给它时需要增长,这意味着它的所有元素都必须重新分配(因此被破坏和构造)。
在第二种情况下,a
不需要增长,因此使用赋值运算符。
请参阅 http://ideone.com/atPt9; 添加打印消息的重载复制赋值运算符,我们在第二个示例中得到以下内容:
parameterised constructor
copy constructor
copy constructor
copy constructor
parameterised constructor
copy constructor
copy constructor
copy constructor
a = b
copy assignment
copy assignment
copy assignment
它使用赋值运算符。
#include <iostream>
#include <vector>
class foo {
public:
int m_data;
foo(int data) : m_data(data) {
std::cout << "parameterised constructor " << m_data << std::endl;
}
foo(const foo &other) : m_data(other.m_data) {
std::cout << "copy constructor " << m_data << " " << other.m_data << std::endl;
}
foo& operator= (const foo& other){
std::cout << "assignment operator " << m_data << " " << other.m_data << std::endl;
}
};
main (int argc, char *argv[]) {
std::vector<foo> a(3, foo(3));
//std::vector<foo> b(4, foo(4));
std::vector<foo> b(3, foo(4));
std::cout << "a = b" << std::endl;
a = b;
for(std::vector<foo>::const_iterator it = a.begin(); it != a.end(); ++it){
std::cout << "a " << it->m_data << std::endl;
}
for(std::vector<foo>::const_iterator it = b.begin(); it != b.end(); ++it){
std::cout << "b " << it->m_data << std::endl;
}
return 0;
}
parameterised constructor 3
copy constructor 3 3
copy constructor 3 3
copy constructor 3 3
parameterised constructor 4
copy constructor 4 4
copy constructor 4 4
copy constructor 4 4
a = b
assignment operator 3 4
assignment operator 3 4
assignment operator 3 4
a 3
a 3
a 3
b 4
b 4
b 4
请参阅奥利斯的答案以了解原因。
相关文章:
- 当从函数参数中的临时值调用复制构造函数时
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 为什么默认复制函数在按值发送参数时不调用?
- 为什么调用复制构造函数而不是移动构造函数?
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 复制构造函数中的递归调用
- 编译器调用复制运算符而不是移动运算符
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 使用 pybind11 调用 Python 函数时避免复制输入数据
- 为什么没有调用此模板类的复制构造函数?
- 为什么当我做复制和交换习语时不调用我的复制构造函数?
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- 调用类模板中隐式删除的复制构造函数
- 我不知道为什么复制构造函数的调用在 c++ 中不稳定
- push_back std::vector,则重复调用复制构造函数
- 减少复制构造函数调用
- 调用值构造函数而不是复制构造函数
- 向量<shared_ptr<X>>复制- 调用 X 构造函数?