
例子:
#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