天天看點

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 構造函數的差別

繼續閱讀