C++11之前和C++11之后的 vector 构造函数的区别

C++11之前和C++11之后的 vector 构造函数的区别

例子:

#include <iostream>
#include <vector>
using namespace std;

class A
{
public:
	A(const char* s = "1234") {
		cout << "ASDF" << endl;
	}
};

int main()
{
	vector<A> av(5);
	cout << av.size() << endl;
	return 0;
}

输出:

C++11之前和C++11之后的 vector 构造函数的区别

可见C++11输出了五次ASDF,而C++11之前仅输出一次ASDF。why?

因为C++11之前调用的是:

explicit vector( size_type count, const T& value = T(), const Allocator& alloc = Allocator());

先构造一个默认值T(),这里即A(),调用一次默认构造函数(注:形参都有默认值的构造函数也是默认构造函数),然后复制5个(调用的是复制(拷贝)构造函数),所以打印一次。

C++11调用的是:

explicit vector( size_type count );

直接调用默认构造函数构造5次,所以打印5个。

我顺便查看了下源代码如下:

C++11之前和C++11之后的 vector 构造函数的区别

_Tp()即是A()。

补充:假设 vector<int> vec(10);  _Tp()就为int(),int()为0,所以vec默认初始化为0

如果代码修改为:

#include <iostream>
#include <vector>
using namespace std;

class A
{
public:
	A(const char* s = "1234") {
		cout << "ASDF" << endl;
	}
};

int main()
{
	vector<A> av(5, A());
	cout << av.size() << endl;
	return 0;
}

则无论C++11之前还是之后都是输出一次ASDF

C++11之前和C++11之后的 vector 构造函数的区别