【发布时间】:2019-08-04 19:26:39
【问题描述】:
首先,我英语不好,所以我使用翻译。
这段代码是支持vector中移动语义的代码。
创建单个向量并将 Test 对象插入 push_back() 方法的代码。
这段代码的结果是,每次因为push_back()方法添加一个Test对象,都应该调用move构造函数,对吧?
但是编译器只有在插入新对象时才调用移动构造函数,而旧对象调用复制构造函数。
为什么会这样?我错过了什么吗?
#include <iostream>
#include <vector>
using namespace std;
class Test
{
public:
Test(int data1, int data2) :data1(data1), data2(data2)
{
cout << "Normal Constructor" << endl;
}
Test(const Test& src)
{
cout << "Copy Constructor" << endl;
this->data1 = src.data1;
this->data2 = src.data2;
}
Test(Test&& rhs)
{
cout << "Move Constructor" << endl;
this->data1 = rhs.data1;
this->data2 = rhs.data2;
rhs.data1 = 0;
rhs.data2 = 0;
}
Test& operator=(const Test& src)
{
if (this == &src)
return *this;
cout << "Copy assignment operator" << endl;
this->data1 = src.data1;
this->data2 = src.data2;
return *this;
}
Test& operator=(Test&& rhs)
{
if (this == &rhs)
return *this;
cout << "Move assignment operator" << endl;
this->data1 = rhs.data1;
this->data2 = rhs.data2;
rhs.data1 = 0;
rhs.data2 = 0;
return *this;
}
private:
int data1, data2;
};
int main()
{
vector<Test> vec;
for (int i = 0; i < 5; i++)
{
cout << "Iteration " << i << endl;
vec.push_back(Test(100, 100));
cout << endl;
}
}
【问题讨论】:
-
同意重复,但tkausl的回答更好
标签: c++