ext*_*mmy 10 c++ initialization
基于以下,我是对的吗?
谢谢你的帮助.
A global_A;
int global_int;
class A {
public : int x;
}
int main()
{
int local_int;
A local_A;
}
Run Code Online (Sandbox Code Playgroud)
Chu*_*dad 13
建立安德烈的回应.
$ 3.6.2-"具有静态存储持续时间(3.7.1)的对象应在进行任何其他初始化之前进行零初始化(8.5)." 在OP中,"global_A"和"global_int"具有静态存储持续时间."local_int"和"local_A"没有链接,因为它们是本地对象.
$ 8.5/5-零初始化T类型的对象意味着:
- 如果T是标量类型(3.9),则将对象设置为0(零)转换为T的值;
- 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的;
- 如果T是联合类型,则对象的第一个命名数据成员89)是零初始化的;
- 如果T是数组类型,则每个元素都是零初始化的;
- 如果T是引用类型,则不执行初始化.
因此,下次控制进入声明时将再次尝试.如果控件在初始化对象时重新输入声明(递归),则行为是未定义的."
编辑2:
$ 8.5/9-"如果没有为对象指定初始化程序,并且该对象是(可能是cv限定的)非POD类类型(或其数组),则该对象应默认初始化;如果该对象为const -qualified类型,底层类类型应具有用户声明的默认构造函数. 否则,如果用于非静态对象,该对象及其子对象没有指定初始化,如果有的话,有一个不确定的初始value90) ;如果该对象或任何它的子对象属于const限定类型,程序结构不合理."
一般情况下,您希望阅读这些部分以及8.5美元,以便在此方面保持良好状态.
您的代码中没有引用,因此您提及"引用"的任何要点都没有意义.
在您的示例中,全局对象 - global_int和global_A- 都是零初始化的.两个本地对象 - local_int和local_A- 包含不确定的值,这意味着local_int并且local_A.x未初始化.
PS当然,正如其他已经指出的那样,您的代码是不可编译的.A在声明之前不能声明对象class A(并且;在类定义之后缺少a ).
基本上,无论何时声明变量,编译器都将调用其默认构造函数,除非您另行指定.
语言级别类型(例如指针,'int','float','bool'等)"默认构造函数"什么都不做,它只是在声明时保留内存(全局/静态变量是特殊情况) ,有关细节的更多信息,请参阅chubsdad的答案.这意味着它们几乎可以是任何东西,因为你通常不能确定之前的内存中是什么,甚至是内存来自哪里(除了'placement new'操作符的情况).
您创建的类没有构造函数,因此编译器将为您生成一个默认构造函数,它只调用其每个成员/变量的构造函数.如果您合并上一段中提供的信息,您可以看到变量'x'将调用其默认构造函数,该函数不执行任何操作,因此未初始化为任何值.
正如其他人所说,你的代码或指针中没有引用,因此术语"NULL"在这里的所有情况下都是无效的.NULL通常是指一个指针,与其他语言级别类型一样,在为其赋值之前不会将其设置为任何值(当然除非它是全局/静态变量).
| 归档时间: |
|
| 查看次数: |
17835 次 |
| 最近记录: |