• c++ 变量定义 的初始化规则



          当定义
    没有初始化式的变量(如int i;)时,系统有可能会为我们进行隐式的初始化。至于系统是否帮我们隐式初始化变量,以及为变量赋予一个怎样的初始值,这要取决于该变量的类型以及我们在何处定义的该变量
          
          1】内置类型变量的初始化
               内置变量是否自动初始化,取决于该变量定义的位置。
               ①在全局范围内的或者静态局部内置类型变量均被编译器自动初始化为0值

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 //全局范围内的部分内部变量
     6 int gi;  //被自动初始化为0
     7 float gf;  //被自动初始化为0.0
     8 double gd;  //被自动初始化为0.0
     9 char gc;  //被自动初始化为''
    10 
    11 int main(int argc, char **argv)
    12 {
    13   return EXIT_SUCCESS;
    14 }

    ②在函数体内定义的内置类型变量值随机(有的编译器可能会为你初始化为0,但千万别依赖于这种可能行为,因为它会给你的程序带来未定义的行为)

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 int main(int argc, char **argv)
     6 {
     7   //局部范围内的部分内部变量
     8   int i;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
     9   float f;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
    10   double d;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
    11   char c;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
    12 
    13   return EXIT_SUCCESS;
    14 }

    ③内置类型数组的初始化规则同上

    #include<iostream>
    
    using namespace std;
    
    //全局范围内的内置类型数组
    int gIntArr[5];  //5个元素都被初始化为0
    
    int main(int argc, char **argv)
    {
      //局部范围内的内置类型数组
      int intArr[5];  //未被初始化
      
      return EXIT_SUCCESS;
    }

    2】类类型变量的初始化
               类类型变量是通过构造函数进行初始化的,不论类类型变量在哪里(全局或者局部)定义,该类类型变量的构造函数(默认构造函数或者指定的带参构造函数)总会被调用
               想要知道构造函数在各种情况下如何初始化类中数据成员的,我们必须首先了解构造函数的初始化发生在何时。

     1 //构造函数中的初始化发生在构造函数的初始化列表中
     2 //而非构造函数体中
     3 class Foo
     4 {
     5   public:
     6     Foo(int i):_integer(i)  //初始化列表中进行的是初始化
     7     {
     8       //这里是构造函数的函数体
     9       //在这里进行的是赋值操作,而不是初始化
    10       _integer = i;
    11     }
    12   private:
    13     int _integer;
    14 };

    现在我们知道,构造函数的初始化是发生在初始化列表中的,那么,对于初始化列表中没有显示进行初始化的内置类型变量来说,其初始化规则就与上述内置类型变量的规则相同了。
               下面我们就一起来探索这个问题:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 class Foo
     5 {
     6   public:
     7     Foo(void):_explicitInit(1024){}
     8   private:
     9     int _explicitInit;  //在构造函数初始化列表中
    10                         //显式初始化的内置类型变量
    11     int _implicitInit;  //没有在构造函数中显式初始
    12                         //化的内置类型变量
    13 };
    14 
    15 Foo gF;  //全局范围内的类类型变量,_explicitInit被
    16          //显式初始化为1024,_implicitInit被自动初始
    17          //化为0
    18 
    19 int main(int argc, char **argv)
    20 {
    21   Foo f; //局部范围的类类型变量,_explicitInit被
    22          //显式初始化为1024,_implicitInit不会被
    23          //自动初始化,值随机
    24 
    25   return EXIT_SUCCESS;
    26 }

    本文出自 “Bill_Hoo专栏” 博客,请务必保留此出处http://billhoo.blog.51cto.com/2337751/733279

  • 相关阅读:
    在 Vim 中,删除 ^@ 符号的几种方法
    西瓜书机器学习算法脉络梳理之聚类
    西瓜书机器学习算法脉络梳理之集成学习
    西瓜书机器学习算法脉络梳理之贝叶斯分类器
    springboot项目,打包时携带所有依赖
    【转载】JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案
    Tomcat组件梳理—Service组件
    Tomcat组件梳理—Digester的使用
    Tomcat组件梳理--Server
    Tomcat组件梳理--Catalina
  • 原文地址:https://www.cnblogs.com/xaf-dfg/p/3821188.html
Copyright © 2020-2023  润新知