C++学习笔记-变量及基本类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014527548/article/details/81150868

C++学习笔记-变量及基本类型

2018.07.22

初始值

  • 初始化不是赋值,初始化是创建变量/对象时赋予初始值的操作;
  • 赋值是将变量/对象的当前值擦除,而用新值替换。

默认初始化

  • 内置类型的变量如果没显式的初始化,则其值由变量定义位置决定;
  • 定义在函数体外的变量(内置类型)被初始化为0、空字符串等;
  • 定义在函数体内的变量(内置类型)则不被初始化,其值是未知的,直接使用会引发错误;
  • 类的对象如果没有显式的指定初始化值,则其值由类确定(也就是类的定义决定)。

声明和定义

  • 声明:使名字被程序知道,比如一个程序需要使用别处定义的变量,就需要在自己文件中声明那个变量名(没有开辟新的内存空间)。规定了变量的类型和名字;
  • 定义:创建于名字关联的实体(开辟新的内存空间)。除了规定变量的类型和名字,还可能为变量赋初始值;

    extern int i;//此为声明,非定义
    int j; //声明并定义
    int j = 1; //声明并定义,且赋初始值
  • 任何包含了显式初始化(如上)的声明自动变为定义,如下;

    extern int i = 1; //自动由声明变为定义
  • 变量能且只能被定义一次,但是可以被多次声明。

变量作用域

  • 名称的作用域起始于名字的声明语句,以声明语句所在作用域尾端结束,比如for循环里定义的变量仅在for循环里有效,出了for循环则无法访问。

    for(int i =1; i < 10; i++)
    {
    
    }
  • 在内层作用域允许定义外层作用域已经有的变量名称。但是通常如果函数里可能用到某一个全局变量,不适宜再定义一个同名的局部变量。

引用

  • 引用并非对象,相反,其只是为一个已经存在的对象起的另外一个名称;
  • 引用必须初始化,初始化完成后引用和其初始化对象一直绑定在一起,因此无法令引用重新绑定到另外一个对象;
  • 在一条语句中进行多次引用时,每个引用标志符都必须以&开头;

    int i = 1024, i2 = 2048;
    int & r = i, r2 = i2;//r是引用,r2不是
    int & r3 = i, & r4 = i2;// r3 r4都是引用
  • 引用只能绑定在对象上,不能绑定到一个字面值(常量)或者某个表达式的计算结果;

    int & reValue = 10;// 错

指针

  • 访问无效指针的后果是无法预估的,所以程序员必须清楚任意给定的指针是否有效;
  • 空指针不指向任何对象,所以在使用任何一个指针前都有必要去检测它是否为空,指针初始化最好初始化为空指针,可通过以下三种方法进行:

    int *p1 = nullptr; //等价于 int *p1 = 0; 强烈推荐使用此方法
    int *p2 = 0;//直接将p2初始化为字面常量0,而非变量0,下面方式是错误的
    // 需要# include <cstdlib>
    int *p3 = NULL; //旧方法,不推荐
  • 在条件表达式中,如果指针为0,则表示false,非0为true;
  • void* 是一种特殊的指针类型,可以存储任意对象的地址,不能对void* 指针所指向的对象直接操作,因为我们知道其具体类型。

*和&

  • *和&在不同的位置表示不同的含义,具体意义需要根据上下文推断

    int i = 42;
    int &r = i;//跟随类型名之后,因此&表示定义引用
    int *p;//跟随类型名之后,因此*表示定义指针
    p = &i;//出现在表达式里,表示取地址符号
    *p = i; //出现在表达式里,表示解引用符,*p表示p指向的对象
    int &r2 = *p;// r2为p所指向对象的引用

猜你喜欢

转载自blog.csdn.net/u014527548/article/details/81150868
今日推荐