1. C\C++关键字
1.1static变量的作用
static的意思是静态,有三个明显的作用:
- 在函数体内,静态变量具有“记忆”功能,即一个呗声明为静态的变量在这一函数被调用的过程中其值维持不变。
- 在模块内(函数体外),它的作用域范围有限,即如果一个变量被声明为静态的,那么该变量可以被模块内的所有函数访问。但不能被模块外的其他函数访问。是一个本地的全局变量,如果一个函数被声明为静态的,则该函数与普通函数作用域不同,只可以被该模块的其他函数调用。
- 内部函数应该在当前源文件中说明和定义,对可在当前源文件以外使用的函数,应该在一个头文件中说明,使用这些函数的源文件要包含这个头文件。
static全局变量和普通全局变量区别在于static全局变量只能初始化一次,目的是防止在其他文件单元中被引用。static局变量和普通局部变量区别在于static局部变量只被初始化一次,下次计算依据是上次的结果值。static函数与普通函数区别在于,static函数只在一个源文件中有效,不能被其他源文件使用。
静态化成员变量有这些特点:
- 对非静态数据成员,每个类对象都有自己的复制品,而静态数据成员被当做是类的成员,无论这个类的对象被定义多少个,静态数据成员在程序中也只有一份复制品。由该类型的所有对象共同访问。
- 静态数据成员存储在全局数据区,由于静态数据成员属于本类中的所有对象共享,所以他不属于特定的类对象,在没有产生类对象时其作用域就可见。
- 与普通数据成员都遵从public、protected、private。
- 静态成员变量的初始化在类外,此时不能在带上static的关键字private。
静态数据成员的优势:
- 静态数据成员没有进入程序的全局名称空间,因此不存在与程序中其他全局名字冲突的可能性。
- 可实现信息隐藏。静态数据成员可以是private成员。
static变量只初始化一次的原因:
对于所有的对象,初始化都只有一次,由于静态变量具有“记忆”功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。
存放在静态区的变量的生命周期一般较长,与整个源程序的存在时间一样,只需要初始化一次。auto变量由于存放在栈区,一旦调用过程结束,则会马上被销毁。
与静态数据成员一样,当类的成员函数前面添加static关键字后变成类的静态成员函数,静态成员函数为类的全部服务而不是为某个类的具体对象服务。静态成员函数是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象。与普通函数相比,静态成员函数由于不是与任何对象相联系,因此不具有this指针。
类的静态成员必须初始化,在程序初始化的时候分配。
1.2 const的作用
常类型也称为const类型,在C中,主要定义变量为常类型以及修饰函数参数与返回值,在C++中还可以修饰函数的定义,定义类的成员函数。常类型的变量或对象的值不能被更新。
const有以下几个方面的作用:
- 定义const常量,具有不可变性
- 进行类型检查,例如
void f(const int i){}
- 避免意义模糊的数字出现,同样可以进行参数的调整和修改。
- 保护被修饰的东西,防止被以外的修改,增强程序的健壮性。
- 为函数重载提供参考
- 节省空间,避免不必要的内存分配
什么情况下需要使用const关键字
- 修饰一般常量。这种常量在定义时,修饰符const可以用在类型说明符前,也可以在类型说明符后。
- 修饰常数组。
- 修饰常对象,是对象常量。定义常对象时,同样需要进行初始化,并且该对象不能在被更新,const可以放在类名后面,也可放在类名前面。
- 修饰常指针:
- 修饰常引用。使用const修饰符也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被更新。格式如下:
- 修饰函数的返回值。
- 修饰类的成员函数。
- 在另一链接文件中引用const常量。
什么是常引用:
也称为const引用,是指向const对象的引用,非const引用表示指向非const类型的引用。常引用为了避免在使用变量的引用时,在毫不之情下改变变量的值,主要用于定义一个普通变量的只读属性的别名,作为函数的传入形参,避免实参在调用函数中被意外改变。
常引用声明方法:
常引用的主要用途如下:
- 用作普通变量的只读属性的别名。
- 用于函数的形参。常引用做形参,可以确保在函数内不会改变实参的值,所以参数传递尽量使用常引用类型。
对于引用的初始化,需要注意:当初始化值是一个左值(可以取得地址)时,没有问题。当不是一个左值时,只能对一个常引用赋值,而且这个赋值是有一个过程的,首先将值隐式转化到类型T,然后将这个转换结果窜放在一个临时对象里,最后用这个临时对象初始化这个引用变量。
1.3 switch语句中的case结尾是否必须添加break语句
一般必须在case语句结尾添加break,因为当通过switch语句确定入口点,进一步的case语句被忽略,除非遇到break,否则执行满足这个case之后的其他case语句,直到switch结束或者遇到break,如果在switch省略break语