• 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

  • 相关阅读:
    【JDBC】JDBC实战
    【JDBC】JDBC操作实战
    【Oracle】事务、表复制
    Hibernate 再接触 继承映射
    Hibernate 再接触 集合映射
    Hibernate 再接触 CRUD
    Hibernate 再接触 多对多单向双向关联
    Hibernnate 一对多多对一双向关联
    Hibernate 再接触 一对多单向关联
    Hibernate 再接触 多对一与一对多
  • 原文地址:https://www.cnblogs.com/a3192048/p/12241291.html
Copyright © 2020-2023  润新知