摘录不熟悉的知识点
2.1基本内置类型
待补充
2.2变量
变量提供一个具名的、可供程序操作的存储空间。
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,以一个新值来替代。
定义在函数体之外的变量被初始化为0。
声明(declaration)使得名字为程序所知,为了支持分离式编译,c++将声明和定义区分开来;变量声明(extern)规定了变量的类型和文字,在这一点上定义与之相同。但除此之外,定义还申请存储空间,也可能会为变量赋一个初始值。
如果要在多个文件中使用同一个变量,就必须将声明和定义分离。此时,分离的定义必须出现在且只能出现在一个文件中,而其他用到该变量的文件必须对其进行声明,却绝对不能重复定义。
标识符由字母、数字、下划线组成,必须以字母或下划线开头,标识符长度无限制,但对大小写字母敏感。
变量名一般用小写字母,自定义的类名以大写字母开头。
建议:当你第一次使用变量时再定义它。
当全局作用域和块作用域中定义了同一变量时,在块作用域中访问变量指定的实体将会是块作用域中所定义的,但通过 ::x (作用域操作符) 可以访问得到全局作用域中定义的x实体。
理解练习2.14
2.3复合类型
复合类型是指基于其他类型定义的类型,如 引用 和 指针。
一条声明语句由一个基本数据类型(base type)和紧随其后的一个声明符(declarator)列表组成。每个声明符命名了一个变量并指定该变量为与基本数据类型有关的某种类型。之前接触到的声明语句中,声明符其实就是变量名(int a; 声明符a只是变量名)。其实还可能有更复杂的声明符,它基于基本数据类型得到更复杂的类型,并把它指定给变量。
引用并非对象,它只是为一个已经存在的对象所起的另外一个名字;引用本身不是对象,所以不能定义的引用的引用。所以它必须给定初始值,且初始值是一个对象。
引用一旦被定义,就无法令其再绑定到另外的对象,之后每次使用这个引用都是访问它最初绑定的那个对象。
指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。
1.int ival = 42; int *p; p = &ival; 2. int ival = 42; int *p = &ival; 1和2是等价的。int *p; 实际上就定义了p为指针,在定义后使用p就已经是在使用指针了,p = &ival 则说明让指针存放ival的地址。(&这里为取地址符,不是引用)
如果*或者&紧随类型名出现,它们就是声明的一部分,就是指针或者引用;在表达式中则为解引用符或者取地址符。
指针无法指向引用,因为引用不是一个对象,没有实际地址。即不存在int& *p;(念法是从右往左读,比如int *p;是the pointer to int)。
空指针定义尽量使用nullptr。int *p = 0;也是可以定义空指针的。
void*是一种特殊的指针类型,可用于存放任意对象的地址。比如存放指针的地址(指针的指针),但它能做的事有限,只能和别的指针比较、作为函数的输入输出或者赋给另一个void*指针。不能直接操作它所指的对象,因为并不知道这个对象到底是什么类型。所以,以void*视角来看内存空间就仅仅是内存空间,没办法访问内存空间中所存的对象。
很多程序员容易迷惑于基本数据类型和类型修饰符(&和*)的关系,其实后者不过是声明符的一部分罢了。如int* p,a;实际上a只是一个int型普通变量,这种写法可能产生了误导,*仅仅是修饰了p而已。
constexpr常量表达式,是指值不会改变且在编译过程就能得到计算结果的表达式。因此对声明constexpr时用到的类型必须有所限制。因为这些类型比较简单,值也显而易见,就把它们称为“字面值类型”(literal type)。算术类型、引用和指针都属于字面值类型。IO库,string类型等则不属于字面值类型,也就不能被定义为constexpr。
decltype类型指示符。
关于 为何C++中未初始化全局变量为什么都会被编译器自动置0
参考:
https://blog.csdn.net/linuxtiger/article/details/26835239
网友评论