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