1. 程式人生 > >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輸出了五次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個。

我順便查看了下原始碼如下:

_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