【问题标题】:Will a class recall its constructor when pushed in a std::vector?当推入 std::vector 时,一个类会调用它的构造函数吗?
【发布时间】:2010-07-02 18:05:56
【问题描述】:

如果我这样做:

FOO foo;
foovect.push_back(foo);

其中 FOO 是具有默认构造函数的类。

构造函数是在 foo 入栈时才被调用,还是在压入 std::vector 时再次调用?

谢谢

我在做:

OGLSHAPE::OGLSHAPE(void)
{
    glGenBuffersARB(GL_ARRAY_BUFFER_ARB,&ObjectVBOInt);

}

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    FOO foo; 将调用构造函数。
    foovect.push_back(foo); 将调用复制构造函数。

    #include <iostream>
    #include <vector>
    
    class FOO
    {
    public:
        FOO()
        {
            std::cout << "Constructor" << std::endl;
        }
        FOO(const FOO& _f)
        {
            std::cout << "Copy Constructor" << std::endl;
        }
    };
    
    int main()
    {
        FOO foo;
        std::vector<FOO> foovect;
        foovect.push_back(foo);
    }
    

    为此的输出:
    Constructor
    Copy Constructor

    【讨论】:

      【解决方案2】:

      不,使用了复制构造函数,即看起来像这样的构造函数:

      FOO( const FOO & f );
      

      如果您自己不提供,编译器会提供默认的复制构造函数。

      【讨论】:

      • 那么构造函数不会被调用两次?因此,如果我的构造函数显示一个消息框,我最终只会看到 1 个消息框?
      • @user 一次构造名为“foo”的对象(在您的代码中),一次在向量中制作副本。
      • @user146780:你是什么意思,“那个”构造函数?有一个默认构造函数、一个复制构造函数,也许还有更多。
      • 好吧,假设我调用 GlGenBuffers() 分配一个缓冲区对象,它最终会为显卡生成 2 个缓冲区吗?
      • @user:取决于如何定义“缓冲区对象”。
      【解决方案3】:

      当您执行 push_back 时,您的对象被复制到向量中。这意味着您的对象的复制构造函数被调用。所有标准库容器都处理对象的副本,而不是对象本身。如果您想要这种行为,则需要使用指针。

      【讨论】:

        猜你喜欢
        • 2020-10-05
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 2014-03-23
        • 1970-01-01
        • 2012-07-10
        • 2013-12-08
        相关资源
        最近更新 更多