zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    507. Perfect Number
    Dos与Linux的断行字符
    724. Find Pivot Index
    110. Balanced Binary Tree
    掌握numpy(三)
    掌握numpy(二)
    掌握numpy(一)
    203. Remove Linked List Elements
    25个Java机器学习工具和库
    贝叶斯学习--极大后验概率假设和极大似然假设
  • 原文地址:https://www.cnblogs.com/a3192048/p/12241291.html
Copyright © 2011-2022 走看看