【问题标题】:Creating vector of class with parametrized constructor使用参数化构造函数创建类的向量
【发布时间】:2022-01-22 02:32:35
【问题描述】:

我正在尝试使用参数化构造函数创建一个类的向量。

#include <iostream>
#include <vector>
using namespace std;

struct foo
{
  foo() {
  cout << "default foo constructor " << endl;
  }  
  
  foo(int i)
  {
      cout << "parameterized foo constructor" << endl;
  }
  ~foo() {
    cout << "~foo destructor" << endl;
  }
};

int main()
{
    std::vector<foo> v(3,1);
}

我预计会有 3 次调用 parameterized foo constructor,但我得到的输出为

parameterized foo constructor
~foo destructor
~foo destructor
~foo destructor
~foo destructor

这里发生了什么?

如何使用向量的构造函数,以便通过参数化构造函数创建类对象?

【问题讨论】:

  • 监控构造函数/析构函数调用时,不要忘记复制/移动构造函数。
  • 有些相关:stackoverflow.com/q/28716209/4117728。不过,请注意,对于 C++11 及更高版本,它还不是最新的
  • 请注意,foo(int i) 提供了从 intfoo 的隐式转换。在v(3, 1) 中,第二个参数被隐式转换为foo(提供一行输出),并且该实例被复制3 次以填充向量(因此有4 个实例,4 个析构函数)。您未能提供打印任何内容的复制构造函数,编译器提供了一个根本不被注意的构造函数。

标签: c++ vector constructor


【解决方案1】:

这里发生了什么?

您可以添加用户定义的复制构造函数来查看代码中发生的情况:

#include <iostream>
#include <vector>

struct foo {
  foo() { std::cout << "default foo constructor\n"; }    
  foo(int i) { std::cout << "parameterized foo constructor\n"; }
  ~foo() { std::cout << "~foo destructor\n"; }
  foo(const foo&) { std::cout << "copy constructor called\n"; }  // <---
};

int main() {
    std::vector<foo> v(3,1);
}

Output:

parameterized foo constructor
copy constructor called
copy constructor called
copy constructor called
~foo destructor
~foo destructor
~foo destructor
~foo destructor

来自您正在调用的std::vector 构造函数上的cppreference

使用具有值 value 的元素的 count 个副本构造容器。

所以...

如何使用向量的构造函数,以便通过参数化构造函数创建类对象?

元素是通过调用复制构造函数来创建的。但是,它只被调用一次,然后向量被副本填充。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    相关资源
    最近更新 更多