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)当类类型的成员没有在构造函数初始值列表中显式地初始化时;

  • 相关阅读:
    angry_birds_again_and_again(2014年山东省第五届ACM大学生程序设计竞赛A题)
    数学入门题目
    POJ1236:Network of Schools(tarjan+缩点)?
    POJ2186:Popular Cows(tarjan+缩点)
    HDU2426:Interesting Housing Problem(还没过,貌似入门题)
    POJ1175:Starry Night(bfs)
    POJ2506:Tiling(递推+大数斐波那契)
    POJ2135:Farm Tour
    POJ2195:Going Home(费用流入门)
    POJ1273:Drainage Ditches(最大流入门 EK,dinic算法)
  • 原文地址:https://www.cnblogs.com/lustar/p/7450097.html
Copyright © 2011-2022 走看看