为啥在默认成员初始化时内置类型的零成员? [复制]

     2023-02-22     293

关键词:

【中文标题】为啥在默认成员初始化时内置类型的零成员? [复制]【英文标题】:Why a zeroed member of a built-in type on default member initialization? [duplicate]为什么在默认成员初始化时内置类型的零成员? [复制] 【发布时间】:2020-12-15 21:01:55 【问题描述】:

我想知道为什么这段代码的输出是零:

#include <iostream>    

class C

public:
    int m;
    C() 
;

int main ()
 
    C c;
    std::cout << c.m << '\n';
    return 0;

我一直认为,当构造函数初始化列表中没有提到内置类型的成员时,它不会被初始化。此外,在调试模式下构建时,结果是我所期望的——一些非零值。为什么我在发布模式下得到零而在调试中却没有?为什么我会得到零?

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

int 只能包含整数值。那么假设的“统一价值”应该是什么?

因此,对于 C++ 中的整数来说,未初始化的含义是该值不能以任何方式得到保证。有时可能为 0。其他时候可能是其他整数值。进行一些代码更改后,未初始化的值可能会有所不同。它可能与程序上的一次运行不同。或者它可能看起来保持不变,偶然。没有任何保证。

在调试模式下,编译器可能会尝试通过将其设置为不寻常的值来帮助您识别它未初始化的事实。

【讨论】:

int 不一定只能包含整数值。 int 类型可以(在 C++20 之前)在末尾包含未使用的位。这样的位可以用来表示未初始化的int,这似乎是合理的。 有趣。我没有考虑过 C++ 标准在理论上是否允许这样的事情。尽管在实践中,我认为这不是实施的可能选择。

为啥就地成员初始化在 C++11 中使用复制构造函数?

】为啥就地成员初始化在C++11中使用复制构造函数?【英文标题】:Whydoesanin-placememberinitializationuseacopyconstructorinC++11?为什么就地成员初始化在C++11中使用复制构造函数?【发布时间】:2014-03-0915:18:18【问题描述】:我对下面的代... 查看详情

构造函数和初始化列表(代码片段)

区别:对于在函数体中(构造函数)初始化,是在所有的数据成员被分配内存空间后才进行的。列表初始化是给数据成员分配内存空间时就进行初始化,就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须... 查看详情

全局对象内的内置类型的成员变量是不是已初始化为零?

】全局对象内的内置类型的成员变量是不是已初始化为零?【英文标题】:Isamembervariableofbuilt-intypeinsideaglobalobjectzeroinitialised?全局对象内的内置类型的成员变量是否已初始化为零?【发布时间】:2017-12-2117:45:58【问题描述】:使... 查看详情

为啥可以删除任何函数,但只能删除默认的特殊成员函数? [复制]

】为啥可以删除任何函数,但只能删除默认的特殊成员函数?[复制]【英文标题】:Whycanyoudeleteanyfunction,butonlydefaultspecialmemberfunctions?[duplicate]为什么可以删除任何函数,但只能删除默认的特殊成员函数?[复制]【发布时间】:2014-... 查看详情

默认构造函数是不是初始化内置类型?

】默认构造函数是不是初始化内置类型?【英文标题】:Doesthedefaultconstructorinitializebuilt-intypes?默认构造函数是否初始化内置类型?【发布时间】:2011-01-2521:37:19【问题描述】:默认构造函数(由编译器创建)是否初始化内置类... 查看详情

我可以防止非 POD 类中数组数据成员中元素的零初始化吗?

】我可以防止非POD类中数组数据成员中元素的零初始化吗?【英文标题】:CanIpreventzeroinitializationoftheelementsinanarraydatamemberinanon-PODclass?【发布时间】:2010-11-1218:03:40【问题描述】:非POD派生类PayloadMessage包含一个数组数据成员(_pay... 查看详情

windowsdfs初始化复制行为及复制完毕确认

我们日常运维中,企业中很可能会使用windows的dfs作为文件管理,我们在使用dfs的复制过程中,每一个复制文件夹的初始复制会有一个主成员和一个或多个下游成员。在初始复制建立时,默认主成员的文件优先级是高于下游成员... 查看详情

第十二章类和动态内存分配

静态成员变量不能在类声明中初始化静态成员变量(声明描述了如何分配内存,但并不分配内存);可以在类声明之外(在方法文件中)用单独的语句初始化静态成员变量;初始化语句必须指出类型,并使用作用域解析运算符,... 查看详情

为啥结构的大小不等于其各个成员类型的大小之和? [复制]

】为啥结构的大小不等于其各个成员类型的大小之和?[复制]【英文标题】:Whydoesn\'tsizeofstructisequalstosumofsizesofitsindividualmembertypes?[duplicate]为什么结构的大小不等于其各个成员类型的大小之和?[复制]【发布时间】:2011-03-2222:45:2... 查看详情

为啥即使对于“写入时复制”的 const 成员函数也返回代理类?

】为啥即使对于“写入时复制”的const成员函数也返回代理类?【英文标题】:Whyreturnaproxyclassevenforconstmemberfunctionfor"copyonwrite"?为什么即使对于“写入时复制”的const成员函数也返回代理类?【发布时间】:2019-01-2908:24:30... 查看详情

为啥在使用静态 constexpr 成员构造时 std::make_shared 与 new 不同? [复制]

】为啥在使用静态constexpr成员构造时std::make_shared与new不同?[复制]【英文标题】:Whystd::make_shareddifferentwithnewwhenconstructwithstaticconstexprmember?[duplicate]为什么在使用静态constexpr成员构造时std::make_shared与new不同?[复制]【发布时间】... 查看详情

默认初始化值初始化

默认初始化  变量没有指定初始值,则被默认初始化。  内置类型:全局变量的内置类型没有指定初始值,被初始化为0;局部变量则不被初始化。  类:执行默认构造函数(如果默认构造函数是编译器合成的,类中的内... 查看详情

为啥类中的 stringstream 成员会导致编译时错误? [复制]

】为啥类中的stringstream成员会导致编译时错误?[复制]【英文标题】:WhyisstringstreammemberinclasscausingaCompile-timeerror?[duplicate]为什么类中的stringstream成员会导致编译时错误?[复制]【发布时间】:2019-02-1916:37:47【问题描述】:每当我... 查看详情

java中创建对象了,显示初始化值和构造函数初始化对象的区别?先后执行顺序是啥?

两个都可以初始化值,本质上没有区别,不同的是执行的先后。构造方法初始化值时需要包含有参的构造方法,创建对象时使用Objectobj=newObject(arg1,arg2)的形式,你说的显示初始化值应该是使用set方法吧,比如obj.setArg1(arg1)的形式... 查看详情

final成员变量

...员变量指定初始值,那么这些成员变量的值将一直是系统默认分配的0,‘u0000‘,false或null,这些成员变量也就完全失去了存在的意义.因此,Java语法规定:final修饰的成员变量必须由程序员显式地指定初始值.  归纳起来,final修饰的类... 查看详情

c++11——初始化列表,变量类型推到,默认成员函数控制(代码片段)

目录一.初始化列表    1.1C++98的初始化    1.2C++11的初始化    1.3自定义类型的初始化二.变量类型推导    2.1为什么需要变量类型推导        2.2decltype类型推导 三.默认成员函数控制    3.1显示缺省函数... 查看详情

在类中添加方法和成员变量

...用默认访问修饰符)。我们在引用对象时,必须对其进行初始化,否则将会报错。如果我们不自己去初始化值,那马那么电脑回自己默认初始值 查看详情

当我在主函数之外初始化结构成员时,为啥这个 c 程序会出错?

】当我在主函数之外初始化结构成员时,为啥这个c程序会出错?【英文标题】:Whythisc-programgiveserrorwhenIinitializestructurememberoutsidethemainfunction?当我在主函数之外初始化结构成员时,为什么这个c程序会出错?【发布时间】:2021-06-0... 查看详情