C++11之前和C++11之後的 vector 建構函式的區別
阿新 • • 發佈:2018-11-19
例子:
#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