调用默认构造函数时不引用它

Default constructor is being called with no reference to it

本文关键字:引用 默认 构造函数 调用      更新时间:2023-10-16

为什么以下代码不起作用:

#include <iostream>
class Entity
{
public:
/*
Entity()
{
std::cout << "Create Entity with default constructor" << std::endl;
}
*/
Entity(int x)
{
std::cout << "Create Entity with " << x << std::endl;
}
};
class Example
{
Entity ent;
int age;
public:
Example()
//: ent(7), age(7)
{
ent=Entity(7);
age=7;
}
};
int main() {
Example s1;
return 0;
}

它说它需要实体的默认构造函数,但为什么呢? 我使用的唯一实体对象是使用使用 1 参数的构造函数构建的。

另外,为什么将Example s1;更改为Example s1();会导致我的代码以不同的方式工作(我在屏幕上看不到任何打印。

Example构造函数中,成员变量ent已经需要构造。错误所指的正是这种结构。

解决方案是使用构造函数初始值设定项列表,您在所示示例中已将其注释掉。


至于

Example s1();

这将s1声明为一个不带参数并按值返回Example对象的函数。

在此构造函数的主体中

Example()
//: ent(7), age(7)
{
ent=Entity(7);
age=7;
}

赋值语句中使用的数据成员ent(赋值运算符可以使用已构造的对象(

ent=Entity(7);

必须已经构造好。但是,不能使用不存在的默认构造函数来构造它。此表达式Entity( 7 )不会创建对象ent。它创建一个临时对象,该对象通过使用编译器隐式定义的默认复制赋值运算符分配给ent

你必须至少写

Example() : ent(7), age(7)
{
}

在类Example构造函数的 mem 初始值设定项列表中显式指定调用的构造函数 with 参数。在这种情况下,将使用此构造函数创建数据成员ent,然后再将控件传递给类Example的构造函数的主体。

显式定义任何构造函数时,隐式定义的默认构造函数将被删除,并且不可用。

如果未在构造函数中使用初始化列表语法显式初始化成员,则使用默认构造函数来启动它。

Example()
{
ent=Entity(7);
age=7;
}

相当于

Example() : ent(), age()
{
ent=Entity(7);
age=7;
}

这解释了编译器错误。要修复此错误,请使用

Example() : ent(7), age(7)
{
}