版权声明:本文为博主原创文章,未经博主允许不得转载。 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所指向对象的引用