代码之家  ›  专栏  ›  技术社区  ›  hookenz

STD::向量构造函数不为每个元素调用对象构造函数吗?

c++
  •  4
  • hookenz  · 技术社区  · 14 年前

    我的代码与这些代码类似。

    class A
    {
      public:
        A(int i) { printf("hello %d\n", i); }
        ~A() { printf("Goodbye\n"); }
    }
    
    
    std::vector(10, A(10));
    

    我注意到Hello打印了一次。 这似乎意味着向量只为元素分配空间。 但不构成它。我如何使它构造10A对象?

    4 回复  |  直到 14 年前
        1
  •  12
  •   SebastianK    14 年前

    该对象只构造一次,当您传递给STD::vector。然后这个对象被复制10次。您必须在复制构造函数中执行printf才能看到它。

        2
  •  6
  •   Å imon Tóth    14 年前

    您忘记了复制构造函数:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class A
    {
            int i;
    public:
            A(int d) : i(d) { cout << "create i=" << i << endl; }
            ~A() { cout << "destroy" << endl; }
            A(const A& d) : i(d.i) { cout << "copy i=" << d.i << endl; }
    };
    
    int main()
    {
            vector<A> d(10,A(10));
    }
    

    输出:

    create i=10
    copy i=10
    copy i=10
    copy i=10
    copy i=10
    copy i=10
    copy i=10
    copy i=10
    copy i=10
    copy i=10
    copy i=10
    destroy
    destroy
    destroy
    destroy
    destroy
    destroy
    destroy
    destroy
    destroy
    destroy
    destroy
    
        3
  •  3
  •   Armen Tsirunyan    14 年前

    A(10) 构造临时对象。只有一次。向量的10个元素是通过 复制构造函数 . 因此,如果定义一个复制构造函数来打印b,将得到10b。

        4
  •  1
  •   BЈовић    14 年前

    定义复制构造函数,您就可以:

    #include <cstdio>
    #include <vector>
    
    
    class A
    {
        public:
            A(int i) { printf("hello %d\n", i); }
            ~A() { printf("Goodbye\n"); }
            A(const A&)
            {
                printf("copy constructing\n");
            }
    };
    
    
    int main()
    {
        std::vector< A > a( 10, A(5) );
    }