调用默认构造函数时不引用它
Default constructor is being called with no reference to it
为什么以下代码不起作用:
#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)
{
}
相关文章:
- 具有默认值的引用获取函数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 调用默认构造函数时不引用它
- 默认(可选)参数作为引用 c++
- 不能引用类继承默认构造函数
- 可以通过常量引用返回默认参数的值吗?
- 对 const 引用参数使用默认值会导致崩溃
- 为什么C++默认情况下不移动构造右值引用?
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 使用默认值初始化成员引用
- 模板默认参数将丢失其引用类型
- 使用默认构造函数引用成员变量初始化错误
- 未优化的 constexpr 的未定义引用用作默认参数
- 默认情况下C++数组作为参数引用
- 在结构的联合成员中使用std::string时,无法引用默认构造函数
- 无法引用默认构造函数 - 它是 VS 中已删除的函数
- 常量引用默认值