C++ 拷贝函数和赋值函数,emplace_back和push_back的使用记录

  • 出现“=”的地方未必调用的都是赋值函数(算术符重载函数),也有可能是拷贝构造函数,那么什么时候是调用拷贝构造函数,什么时候是调用赋值函数呢?判断的标准其实很简单:如果临时变量是第一次出现,那么调用的只能是拷贝构造函数,反之如果变量已经存在,那么调用的就是赋值函数。

    • 构造函数:对象不存在,没用别的对象初始化
    • 拷贝构造函数:对象不存在,用别的对象初始化
    • 赋值运算符:对象存在,用别的对象给它赋值
  • 使用emplace_back(1,‘a’)可以直接传入参数进行构造,相比于push_back(Data(1,‘a’)),少调用一次拷贝构造函数。

#include 
#include 
using namespace std;
 
class Data {
public:
	Data(int _i, char _s) :i(_i), s(_s){ 
		cout << "Data(int i, char s) " << i << s << endl;
	}
	Data(const Data& t){ // 
		i = t.i + 1;
		s = t.s + 1;
		cout << "Data(const &) " << i << s << endl;
	}
	Data& operator=(const Data& t){
		i = t.i + 1;
		s = t.s + 1;
		cout << "Data =operator " << i << s << endl;
		return (*this);
	}
	~Data() {
		cout << "~Data() " << i << s << endl;
	}
	int i;
	char s;
};
int main()
{
	{
		cout << "------test1() 构造函数和赋值函数的使用------" << endl;
		Data obj1(1, 'a');		// 调用构造函数		Data(int i, char s) 1a
		Data obj2(obj1);		// 调用构造函数		Data(const &) 2b
		Data obj3 = obj2;		// 调用构造函数		Data(const &) 3c
		obj3 = obj3;			// 调用赋值函数		Data =operator 4d
	}
	cout << endl << endl;
	
	{
		cout << "------test2() push_back(Data(1, 'a'))------" << endl;
		vector<Data> vec;
		vec.push_back(Data(1, 'a')); // 先调用1次构造函数,然后调用1次拷贝函数复制,再push进vec 
		cout << "======data:" << vec[0].i << vec[0].s << endl;
	}
	cout << endl << endl;
	
	{
		cout << "------test3() emplace_back(Data(1, 'a'))------" << endl;
		vector<Data> vec;
		vec.emplace_back(Data(1, 'a')); // 调用1次构造函数和1次拷贝函数 
		cout << "======data:" << vec[0].i << vec[0].s << endl;
	}
	cout << endl << endl;
	
	{
		cout << "------test4() emplace_back(1, 'a')------" << endl;
		vector<Data> vec;
		vec.emplace_back(1, 'a'); // 调用1次构造函数,然后push进vec 
		cout << "======data:" << vec[0].i << vec[0].s << endl;
	}

	return 0;
}

运行结果:
C++ 拷贝函数和赋值函数,emplace_back和push_back的使用记录_第1张图片

参考:
C++11容器中新增加的emplace相关函数的使用
C++ 拷贝构造函数与赋值函数

你可能感兴趣的:(C++ 拷贝函数和赋值函数,emplace_back和push_back的使用记录)