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

  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/cquljw/p/3603612.html
Copyright © 2011-2022 走看看