std :: vector和Constructors

Rar*_*rge 0 c++ constructor vector object

std :: vector在创建它所包含的对象的新实例时会调用哪个构造函数?我的印象是它调用了默认构造函数但是如果没有定义或者编译器为我做了什么呢?

特别是在这样的情况下:

class Foo
{
    public:
        Foo(int size)
        {
            data = new double[size];
        }


        ~Foo()
        {
            delete[] data;
        }

    private:
        double* data;
};

std::vector<Foo> myVector;
Foo bar(5);
myVector.push_back(bar);
//stuff
Run Code Online (Sandbox Code Playgroud)

当对象具有未知大小直到构建之后,它如何知道要分配多少内存?

Oli*_*rth 7

至少,要std::vector<T>进行编译,T必须是可复制构造的,并且可以复制.如果要使用std::vector<T>::vector(int)(或std::vector<T>::resize()),则T必须具有默认构造性.如果未满足任何这些要求,则代码将无法编译.

...

C++ 03标准,第23.1节(一般讨论容器):

存储在这些组件中的对象类型必须满足CopyConstructible类型(20.1.3)的要求以及Assignable类型的附加要求.

第20.1.4节:

20.1.4默认构造

默认构造函数不是必需的.某些容器类成员函数签名将默认构造函数指定为默认参数.T()如果使用默认参数(8.3.6)调用其中一个签名,则应该是一个明确定义的表达式(8.5).

  • 不完全正确......只要您没有使用默认初始值设定项不尝试调整容器大小,它们就不需要是默认构造的. (4认同)