将对象实例化为不带默认构造函数的类成员

Instantiating an object as class member without default constructor

本文关键字:构造函数 成员 默认 对象 实例化      更新时间:2023-10-16

我是C++的新手。我想将一个对象声明为另一个类的私有成员。是否可以在没有默认构造函数的情况下完成此对象的实例化?下面列出了一个示例代码:

class Vertex{
  int i;
public: 
  Vertex(int j):i(j){};
  Vertex(const Vertex & v){i=v.i;};
}
class Test{
  Vertex v;
public:
  Test(const Vertex & v1){v(v1);}
}
int main()
{//some code here;
  Vertex v1(int j=1);
  Test(v1); // *error: no matching function for call to 'Vertex::Vertex()'*
  return 0;
}

在我看来,一旦将一个对象声明为私有类成员(例如 Vertex v),默认构造函数就会立即受到追捧。无论如何要避免这种情况?多谢。

Vertex v1(int j=1);

这声明了一个函数 v1 ,它返回一个Vertex并接受一个int参数。你想要的是

Vertex v1(1);

此外,您需要使用初始化器列表,如其他答案所示:

Test(const Vertex & v1) : v(v1) {}

初始化Test::v就像初始化Vertex::i一样。(private完全无关紧要!

因此,使用 Test::Test 的成员初始化列表:

Test(const Vertex & v1) : v(v1) {};

为了保持一致性,我还建议:

Vertex(const Vertex & v) : i(v.i) {};

尽可能初始化成员。

使用构造函数初始化列表:

Test(const Vertex & v1) : v(v1) {}

进入构造函数的主体(在{}之间)后,所有数据成员都已初始化。如果不显式执行此操作,它们将默认初始化,这需要用户定义类型的可用默认构造函数。

接下来,您将在此处声明一个函数:

Vertex v1(int j=1);

你可能的意思是

Vertex v1(1);