zoukankan      html  css  js  c++  java
  • (转)C++变量初始化规则

    下面为大家简单地讲解一下C++中变量初始化的若干规则,限于本人学识有限,定有不详或不正确之描述,还望午饭们发扬找不到错误不罢休的精神,多多指点纠正,这样我也好及时修改自己的文章,为午饭们提供更好更有用的基础学习贴。

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

    #include <iostream>
    using namespace std;
    
    //全局范围内的部分内部变量
    int gi;  //被自动初始化为0
    float gf;  //被自动初始化为0.0
    double gd;  //被自动初始化为0.0
    char gc;  //被自动初始化为''
    
    int main(int argc, char **argv)
    {
      return EXIT_SUCCESS;
    }

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

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

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

      

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

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

    //构造函数中的初始化发生在构造函数的初始化列表中
    //而非构造函数体中
    class Foo
    {
      public:
        Foo(int i):_integer(i)  //初始化列表中进行的是初始化
        {
          //这里是构造函数的函数体
          //在这里进行的是赋值操作,而不是初始化
          _integer = i;
        }
      private:
        int _integer;
    };

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

    #include<iostream>
    using namespace std;
    
    class Foo
    {
      public:
        Foo(void):_explicitInit(1024){}
      private:
        int _explicitInit;  //在构造函数初始化列表中
                            //显式初始化的内置类型变量
        int _implicitInit;  //没有在构造函数中显式初始
                            //化的内置类型变量
    };
    
    Foo gF;  //全局范围内的类类型变量,_explicitInit被
             //显式初始化为1024,_implicitInit被自动初始
             //化为0
    
    int main(int argc, char **argv)
    {
      Foo f; //局部范围的类类型变量,_explicitInit被
             //显式初始化为1024,_implicitInit不会被
             //自动初始化,值随机
    
      return EXIT_SUCCESS;
    }

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

  • 相关阅读:
    .net core 注入的几种方式
    Entity framework Core 数据库迁移
    Net Core中使用Newtonsoft.Json进行序列化保持原有大小写
    .net core 中间件
    .net core webapi 中使用Swagger
    HttpClient使用
    使用第三方库(Senparc)完成小程序支付
    JDK官网下载与安装过程
    制作多系统U盘
    WIN7共享打印机
  • 原文地址:https://www.cnblogs.com/cquljw/p/3603612.html
Copyright © 2011-2022 走看看