gpt4 book ai didi

C++ 用户定义的空默认构造函数与隐式或默认默认构造函数

转载 作者:行者123 更新时间:2023-11-30 01:08:27 25 4
gpt4 key购买 nike

我正在使用 Visual Studio 2013。

我有以下代码

class Foo{
public:
Foo(){};
Foo* fPtr;
float f;
};

int main()
{
Foo foo1; // No Warning. fPtr is initialized to NULL, f is set to 0.0.
Foo foo2(foo1); // Compiles fine. Uses compiler generated copy constructor
return 0;
}

现在考虑相同的代码,但没有用户定义的默认构造函数。

class Foo{
public:
// No user defined default constructor, or equivalently
// Foo() = default;
Foo* fPtr;
float f;
};

int main()
{
Foo foo1; // Neither fPtr nor f are initialized, both contain garbage.
//Foo foo2(foo1); // error C4700: uninitialized local variable 'foo1' used
return 0;
}

我认为用户定义的默认构造函数和隐式定义的默认构造函数是等价的,但在我看来它们不是。

编译器定义的默认构造函数究竟是如何工作的?

在这种情况下,我对使用编译器定义的默认构造函数持谨慎态度,并始终提供我自己的默认构造函数,即使有时默认构造函数为空。我是不是误会了什么?

最佳答案

在实现时,implicitly-defined default constructor 与具有空主体和空初始化列表的用户定义构造函数相同的事情。

If the implicitly-declared default constructor is not defined as deleted, it is defined (that is, a function body is generated and compiled) by the compiler if odr-used, and it has exactly the same effect as a user-defined constructor with empty body and empty initializer list.

Foo foo1; // No Warning. fPtr is initialized to NULL, f is set to 0.0.

没有。不仅对于第二个代码示例,即使对于第一个代码示例,foo1.fPtrfoo1.f 也没有被初始化;空的用户定义构造函数根本不初始化任何成员。

关于编译器警告,MSVS 似乎认为如果提供并调用了用户定义的构造函数,则可以假定该对象已被初始化。但是您需要确保构造函数执行或不执行您期望的操作。

请注意,它们仍然有一些微妙的不同副作用;例如 list initializationvalue intialization , (但此处不使用 default initialization)。例如对于

Foo foo1{};

那么对于第一种情况,会调用用户自定义的默认构造函数;因为它什么都不做,所以 foo1.fPtrfoo1.f 仍将未初始化;但对于第二种情况,aggregate initialization将执行(因为缺少用户定义的构造函数),然后 foo1.fPtrfoo1.f 将被值初始化。即 foo1.fPtr 被初始化为 nullptrfoo1.f 被初始化为 0

关于C++ 用户定义的空默认构造函数与隐式或默认默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42710228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com