• 变量的默认初始化和值初始化


    值初始化和默认初始化的适用场景:

    值初始化:

    (1)在数组初始化的过程中,如果提供的初始值数量少于数组的大小,剩下的元素会进行值初始化;

    (2)静态static变量定义在块作用域外的全局变量如果没有显式的初始值,将执行值初始化;

    (3)当我们通过书写形如T()的表达式(例如 int())显式地请求值初始化时;

    默认初始化:

    (1)当我们在块作用域内类内也属于块作用域内)不使用任何初始值定义一个非静态变量时;

    (2)当一个类本身含有类类型成员且使用合成的默认构造函数时;

    (3)当类类型的成员没有在构造函数初始值列表中显式地初始化时;

    一、相关概念:

    声明:在环境/上下文中指定一个变量的名字。也就是说,声明仅仅是让编译器知道,而没有实际分配空间

    初始化:给一个声明后尚未初始化的变量一个有意义的初始值。

    赋值 : 销毁一个变量原来的值,并赋予一个新值。相当于改变了一个变量的状态

    二、初始化是在声明一个变量的同时赋予它一个值,而赋值是已经声明过了变量,后续再对它进行赋值操作。对于内置类型:

    //在一个块作用域内
    { 
        int i;    //默认初始化,其值未定义
        int j=0;  //值初始化
        j=1;      //赋值
    }

     三、对于定义了自己的构造函数的类类型(例如string)来说,不管采用默认初始化还是值初始化,对象都会通过默认构造函数来初始化。

            但对于内置类型,值初始化的内置类型对象有着良好定义的值,而默认初始化的对象的值则是未定义的。

            对于类中那些依赖于编译器合成的默认构造函数的内置类型成员,如果他们未在类内被初始化,那么它们的值也是未定义的。

     1     string *ps1 = new string;     //默认初始化为空string
     2     string *ps2 = new string();   //值初始化为空string
     3     int *pi1 = new int;           //默认初始化;*pi1的值未定义
     4     int *pi2 = new int();         //值初始化为0;*pi2为0
     5 
     6 
     7     class X
     8     {
     9         int a;
    10     public:
    11         void ShowX()
    12         {
    13             cout << a ;
    14         }
    15         X() = default;
    16     };
    17     int main()
    18     {
    19         X xx;
    20         xx.ShowX();    //对象xx中的a成员的值被默认初始化,由于a是在块作用域内定义的,所以此处输出的值未定义
    21 
    22         return 0;
    23     }

    四、定义于块作用域内(类内也属于块作用域内)的内置类型变量将不被初始化,其值未定义;定义于块作用域外的全局变量被值初始化为0。

    静态static变量如果没有显式的初始值,它将执行值初始化。

     1 class X
     2 {
     3     int a;           
     4 public:
     5     void ShowX(){cout << a ;}
     6     X() = default;
     7 };
     8 int main()
     9 {
    10    X xx;
    11    xx.ShowX();    //对象xx中的a成员的值被默认初始化,由于a是在块作用域内定义的,所以此处输出的值未定义
    12 
    13    return 0;
    14 }

    五、对于自定义类型和STL中的容器,

    class A;
    A a=A();//值初始化
    std::vector<int> vec1;//默认初始化,调用默认构造函数

    一个类对象进行默认初始化和值初始化,必须要有相应的默认构造函数。否则将会报错,因为无法构造这个类。

  • 相关阅读:
    $python打包工具pyinstaller的用法
    $命令行参数解析模块argparse的用法
    $用ConfigParser模块读写conf配置文件
    $用python-docx模块读写word文档
    $git学习总结系列(4)——gitignore文件
    $ git学习总结系列(3)——分支管理
    $ 专治各种python字符编码问题疑难杂症
    $python数据分析基础——初识matplotlib库
    $ python-json模块的基本用法
    $python虚拟化运行环境——virtualenv
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/9276618.html
Copyright © 2020-2023  润新知