C++变量的默认初始化规则

野性酷女 2022-01-12 06:09 282阅读 0赞

定义没有初始化式的变量时,系统有时候会帮我们初始化变量。系统如何初始化取决于变量的类型以及变量定义的位置。

  

  内置类型变量是否自动初始化取决于变量定义的位置。函数体外定义的变量初始成0;函数体内定义的变量不进行自动初始化。除了用作赋值操作的左操作数,其他任何使用未初始化变量的行为都是未定义的,不要依赖未定义行为。

以int类型为例,一段简单的测试代码:

  1. #include <iostream>
  2. using namespace std;
  3. int a;
  4. int main()
  5. {
  6. int b;
  7. cout << a << endl;
  8. cout << b << endl;
  9. return 0;
  10. }

在VS执行这段代码,输出变量a的值0,同时VS会报错:Run-Time Check Failure #3 — The variable ‘b’ is being used without being initialized。 变量a被自动初始化为0;变量b未被自动初始化。

  类类型变量在定义时,如果没有提供初始化式,则会自动调用默认构造函数进行初始化(不论变量在哪里定义)。如果某类型没有默认构造函数,则定义该类型对象时必须提供显示初始化式。

一段简单的测试代码(默认构造函数由编译器自动生成):

  1. #include <iostream>
  2. using namespace std;
  3. class testA
  4. {
  5. public:
  6. void printf() const
  7. {
  8. cout << data << endl;
  9. }
  10. private:
  11. int data;
  12. };
  13. testA a;
  14. int main()
  15. {
  16. testA b;
  17. a.printf();
  18. b.printf();
  19. return 0;
  20. }

 在VS执行这段代码,得到以下结果:
1577027-20190410210928599-418691096.png

  编译器自动生成的默认构造函数使用与变量初始化相同的规则来初始化数据成员。对象a在函数体外定义,其int类型数据成员被初始为0;对象b在函数体内定义,合成默认构造函数不会对其进行初始化(符合内置类型变量初始化规则),其中存放的都是随机值。同样,如果数据成员是类类型,则会调用相应的默认构造函数对数据成员进行初始化。

  如果稍微改变一下这个类的定义,定义一个构造函数以阻止编译器自动生成默认构造函数:

  1. #include <iostream>
  2. using namespace std;
  3. class testA
  4. {
  5. public:
  6. testA(int a)
  7. {
  8. data = a;
  9. }
  10. void printf() const
  11. {
  12. cout << data << endl;
  13. }
  14. private:
  15. int data;
  16. };
  17. testA a;
  18. int main()
  19. {
  20. testA b;
  21. a.printf();
  22. b.printf();
  23. return 0;
  24. }

  这段代码无法通过编译:error C2512: “testA”: 没有合适的默认构造函数可用。

  定义数组时,如果没有显示提供初始化列表,则数组元素的自动化初始规则同普通变量一样:函数体外定义的内置类型数组,其元素初始为0;函数体内定义的内置类型数组,其元素无初始化;类类型数组无论在哪里定义,皆调用默认构造函数进行初始化,无默认构造函数则必须提供显示初始化列表。

  如果定义数组时,仅提供了部分元素的初始列表,其剩下的数组元素,若是类类型则调用默认构造函数进行初始,若是内置类型则初始为0(不论数组定义位置)。

  对于动态分配的数组,如果数组元素是内置类型,其元素无初始化;如果数组元素是类类型,依然调用默认构造函数进行初始化。也可以在使用跟在数组长度后面的一对空圆括号对数组元素做值初始化。

  例如: int *ptrA = new int[10];

      int *ptrB = new int[10] ();

  其中ptrA指向的动态数组其元素未初始化,而ptrB指向的动态数组元素被初始化为0。

  

  对于动态分配的单个对象,可使用直接初始化的语法规则在定义时显示初始化。如果不提供显示初始化式,动态创建的对象与在函数内部定义的变量初始化方式相同(即:内置类型无初始化,类类型调用默
认构造函数进行初始化)。

粘贴自:https://www.cnblogs.com/FoxShark/p/5802239.html

转载于:https://www.cnblogs.com/youpeng/p/10686132.html

发表评论

表情:
评论列表 (有 0 条评论,282人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C语言变量初始化

    一、前言 C语言的变量如果未初始化,其变量值是随机的,特别是对指针而言,很容易导致程序崩溃。 二、各类型变量初始化方法 1. 数值型 整型、浮点型的变量可以

    相关 C++变量命名规则

    求十分详细的的java变量命名规范 您好,提问者: 在java编程中命名规范是统一的,而且老外发明的东西是没有中文的,严格区分大小写。 规范:以字母、下划线、'$'符

    相关 C_C++变量命名规则

    C\_C++变量命名规则 变量命名规则是为了增强代码的可读性和容易维护性。以下为C++必须遵守的变量命名规则: 1、 变量名只能是字母(A-Z,a-z)和数字(0-9)

    相关 C++变量初始化问题

    初始化和赋值的区别 在C++中,变量初始化和赋值操作符是两个完全不同的概念。 初始化不是赋值,初始化的含义是创建变量分配存储空间时为其赋一个初始值,而赋值的含义是把内存空间

    相关 C++变量默认初始化规则

    定义没有初始化式的变量时,系统有时候会帮我们初始化变量。系统如何初始化取决于变量的类型以及变量定义的位置。      内置类型变量是否自动初始化取决于变量定义的位置。函数体