gpt4 book ai didi

C++ 类实例未初始化但没有编译错误,为什么

转载 作者:行者123 更新时间:2023-12-02 09:50:35 25 4
gpt4 key购买 nike

我的问题是关于以下代码:

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

class Blob {
public:
int age;
void hello() { printf("hello\n"); }
};

void test_case() {
Blob a;
//a.hello(); //(1)
cout << a.age << endl;
}

int main() {
test_case();
return 0;
}

如果我注释掉(1),它编译成功。如果取消注释 (1),则会发生编译错误,例如在 VS2017 中,它提示“使用未初始化的局部变量 'a'”。

我在搜索引擎中搜索了一段时间,现在只知道编译器会自动帮我定义默认构造函数的以下4种情况:
  • 一个类成员是一个类的实例(比如 B),并且类 B 已经定义了默认构造函数
  • 一个类派生自另一个类(比如 B),并且 B 定义了默认构造函数
  • 一个类有虚函数
  • 前三种情况的任意组合。

  • 我很好奇,如果我注释掉 (1),编译器会为类 Blob 添加构造函数的定义吗? ?

    最佳答案

    其实和注释掉没关系a.hello(); , Blob总是有 generated default constructor , 否则 Blob a;不会编译。

    (强调我的)

    If no user-declared constructors of any kind are provided for a class type (struct, class, or union), the compiler will always declare a default constructor as an inline public member of its class.

    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 the same effect as a user-defined constructor with empty body and empty initializer list.



    结果, a.agedefault-initialized对于不确定的值,对它的任何访问(如 cout << a.age; )都会导致 UB。

    3) when a base class or a non-static data member is not mentioned in a constructor initializer list and that constructor is called.

    otherwise, nothing is done: the objects with automatic storage duration (and their subobjects) are initialized to indeterminate values.



    这取决于您的意图;作为解决方法,您可以添加用户定义的默认构造函数。
    class Blob {
    public:
    int age;
    void hello() { printf("hello\n"); }
    Blob() : age(42) {}
    };

    关于C++ 类实例未初始化但没有编译错误,为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59855468/

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