zoukankan      html  css  js  c++  java
  • C++ 值初始化和默认初始化

    对于初始化的问题,我之前一直傻傻分不清。有关初始化以及赋值的区别也是一问题,这次回过头来看,配合<<CSAPP>>的内容,对初始化有了一些新的认识。

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

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

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

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

    1 {//在一个块中
    2 int i;//默认初始化,不可直接使用
    3 int j=0;//值初始化
    4 j=1;//赋值
    5 }

    对于在一个块作用域中的局部变量来说,该变量会默认初始化。而内置类型默认初始化的时候,对其进行操作是违法的,编译器也会进行报错。如果在全局中进行初始化,

    //不在块中
    int i;//正确,i会被值初始化为0,也称为零初始化

    内置类型也是合法的,会被零初始化

    静态变量在编译期间就可以确定他们的值,静态变量即使不提供初始值也会被零初始化。此外,类内静态变量同样如此,不过显式初始化是一个比较好的选择。

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

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

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

    上面是我自己的一些理解,<<C++ Primer>>总结了值初始化和默认初始化的适用场景:

    值初始化:

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

    (2)当我们不使用初始值定义一个局部静态变量时;

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

    默认初始化:

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

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

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

  • 相关阅读:
    node
    github
    [模块] pdf转图片-pdf2image
    python 15 自定义模块 随机数 时间模块
    python 14 装饰器
    python 13 内置函数II 匿名函数 闭包
    python 12 生成器 列表推导式 内置函数I
    python 11 函数名 迭代器
    python 10 形参角度 名称空间 加载顺序
    python 09 函数参数初识
  • 原文地址:https://www.cnblogs.com/lustar/p/7450097.html
Copyright © 2011-2022 走看看