1、const关键字
const的作用:
1、定义只读变量,即常量。
2、修饰函数的参数及返回值。
3、修饰函数的定义体,这里的函数为类的成员函数,被const修饰的成员函数代表不修改成员变量的值。非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员。非常量成员函数不能被常量实例调用,因为它可能企图修改常量的数据成员。
const的总结:
1、const对象必须初始化,一旦创建,不能改变。
2、const对象默认作用域为文件作用域,二普通变量默认作用域为整个程序。举例:在一个工程中有1个header.h头文件定义了int a = 1,两个工程文件1.cpp和2.cpp包含了header.h,会产生错误。普通变量作用域是整个程序,相当于a变量被重复定义了两次。但是如果 int a = 1 改为 const int a = 1 则不会报错,因为const对象默认文件作用域,所以可以利用在头文件中定义一个const变量实现多个工程文件重复使用相同变量。(如果想使用其它工程文件中的const对象,应当在const对象定义时使用extern const int a = 1; 在需要使用时对这个对象进行声明:extern const int a;)
3、顶层const与底层const:对象本身为const,说明该对象为顶层const;对象指向或引用的是const对象,说明这是底层const。执行对象拷贝时有限制,常量的底层const不能赋值给非常量的底层const。使用命名的强制类型转换函数const_cast时,需要能够分辨底层const和顶层const,因为const_cast只能改变运算对象的底层const。
const引用的一些规律
引用前带const修饰符 | 被引用前带const修饰符 | 附注 |
是 | 是 | 对const变量的const引用 |
是 | 否 | 引用认为它引用的变量不可以改变 |
否 | 是 | 在下面的代码中有例子(最后一行) |
否 | 否 | 就是普通的引用 |
const与指针
指针 | 被指数据 | 附注 |
变量 | 变量 | 普通的指针 |
变量 | 常量 | 不可以 |
常量 | 变量 | 可以。常量指针“自以为是”,认为自己指向了常量,所以自觉的不去改变所指对象的值。实际上,这个值是可以改变的 |
常量 | 常量 | 定义一个常量指针指向一个常量对象。 |
以下是const的声明例子,具体是什么意义已经在注释中写明。
const int a; //定义一个常量a
int const a; //同上
const int *a; //定义一个指向整型常量的指针a
int * const a; //定义一个指向整型变量的常指针
int const * a const; //定义一个指向整型常量的常指针
int &b = a; //企图让一个非常量引用指向一个常量对象。如果该初始化合法,则a的值可改变,这显然不正确。
2、static关键字
作用:
1、隐藏;
上面的static关键字中提到,普通变量的作用域为整个程序,具有全局可见性。在加上static关键字之后,就会对其他源文件不可见,即隐藏,将作用域限定为文件作用域。
2、默认初始化为0;
在静态数据区,内存中所有的字节默认值都是0x00,全局变量也具备这一属性。由于static关键字修饰的变量存放在静态数据区,所以static对象具有持久性和默认值为0两个特性。
3、持久化;
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以限制变量的可见范围。
在成员变量中声明static时,必须对它进行初始化,否则报错,且不能将静态成员函数定义为虚函数。
3、C++中&的含义
通常来说,C++中&的作用主要是引用与取地址,可用概括为:在等号左边位引用,在等号右边为取地址。
取地址可概括为根据指向变量的指针寻找存储变量的内存,并读取。一旦引用了一个对象之后,不管是修改引用的对象或者被引用的对象两者都会改变。
int a = 1;
int &b = a; //引用
int *p = &a; //取地址