目录
一、const
1、C语言:常量
修饰的是常变量
编译阶段,常变量有没有做左值,其他的处理和变量是一样的
修饰的全局变量,是globle
2、C++:常变量
(1)修饰的变量是常量,需要初始化
编译阶段,把常量使用的地方替换成常量初始化的值,常量一定要初始化
(2)直接访问,不允许做左值
不允许间接访问来修改常量内存,杜绝间接访问的风险
(3)const修饰的全局变量,是local
extern声明之后,l->g
3、const的作用
(1)定义const常量,具有不可变性
(2)进行类型检查,使编译器对处理内容有更多的了解,消除一些隐患
eg:void f(const int i){……} //编译器会知道i是一个常量,不允许修改
(3)避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。通宏定义一样,可以做到不变则已,一变都变
(4)保护被修饰的东西,防止被意外的修改,增强了程序的健壮性
(5)为函数重载提供参考
(6)节省空间,避免不必要的内存分配
(7)提高了程序的效率。编译器不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高
4、const关键字的应用场景
(1)修饰一般常量
(2)修饰常数组
(3)修饰常对象
(4)修饰常指针
(5)修饰常引用
(6)修饰函数的常参数
(7)修饰函数的返回值
(8)修饰类的成员函数
(9)在另一连接文件中使用const常量
5、什么是常引用
常引用也成为const引用。
之所以引用常引用,是为了避免在使用变量的引用时,在毫不知情的情况下改变了变量的值,从而引起程序的错误。常引用主要用于定义一个普通变量的只读属性的别名,作为函数的传入形参,避免实参在调用函数中被意外的改变
常引用声明方式:const 类型标识符 & 引用名 = 目标变量名;
6、常引用的主要用途
(1)用作普通变量的只读属性的别名。
通常这个别名只能获得这个变量的值,而不能改变这个变量的值
(2)用于函数的形参
常引用作形参,可以确保在函数内不会改变实参的值,所以参数传递时尽量使用常引用类型。
二、static
1、static(静态)变量的作用
(1)在函数体内,静态变量具有“记忆”功能,即一个被声明为静态的变量在这一函数被调用的过程中其值维持不变
(2)在模块内(但在函数体外),它的作用域范围是有限制的,即如果一个变量被声明为静态的,那么该变量可以被模块内所有函数访问,但不能被模块外其他函数访问
(3)内部函数应该在当前源文件中说明和定义,对于可在当前源文件以外使用的函数,应该在一个头文件中说明,使用这些函数的源文件要包含这个头文件
2、静态成员函数的特点
(1)对于非静态数据成员,每个类对象都有自己的复制品。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少,静态数据成员在程序中也只有一份复制品,由该类型的所有对象共享访问
(2)静态数据成员存储在全局数据区。
定义时要分配空间,所以不能在类声明中定义。由于静态数据成员属于本类的所有对象共享,所以它不属于特定的类对象,在没有产生类对象时,其作用域就可见,即在没有产生类的实例时,程序员也可以使用它
(3)静态数据成员和普通数据成员一样遵从public、protected、private访问规则
(4)static成员变量的初始化是在类外,此时不能再带上static关键字。private、protected的static成员虽然可以在类外初始化,但是不能在类外被访问
3、与全局变量相比,使用静态成员的优势
(1)静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性
(2)可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能
4、为什么static变量只初始化一次?
对于所有的对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直没有被销毁,而是保存在内存区域中,所以不会再次初始化
存放在静态区的变量的声明周期一般比较长,一般与整个源程序“同生死、共存亡”,所以它只需要初始化一次。
5、在头文件中定义静态变量,是否可行?为什么?
不可行
如果在头文件中定义静态变量,会造成资源浪费的问题,同时也可能引起程序错误。因为如果在使用了该头文件的每个C语言文件中定义静态变量,按照编译的步骤,在每个头文件中都会单独存在一个静态变量,从而引起空间浪费或者程序错误
所以不推荐在头文件中定义任何变量,当然也包括静态变量