05-const关键字

1. const修饰符的作用

  • const类型定义:指明变量或对象的值是不能被更新的,引入的目的是为了取代预编译指令
  • 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性
  • 编译器通常不为普通const常量分配内存空间,而是将他们保存在符号表中,这使得它成为了一个编译期间的常量,没有了内存读写的操作,效率更高
  • 可以节省空间,避免不必要的内存分配

2. 初始化和cosnt

  • const修饰全局变量是存储在全局区(即静态存储区),修饰局部变量时存储在栈区,const修饰的对象一旦创建后其值便不能再改变
  • 类的数据成员只是声明,如果const修饰类的数据成员,那么必须要有构造函数来初始化这个const对象,其他情况必须在声明的地方就初始化。(默认情况下,const对象仅在文件内有效,如果想在别的文件使用此对象,需要使用关键字extern

3. const和引用

  • 类似于const int &b = a;这样用const修饰的引用称为常量引用
  • 常量引用不能直接修改所引用对象的值,但是对所引用的对象是否是常量并不设限。

4. const和指针

  • 常量指针:指向一个常量的指针,该指针所指向的内存上的值不能被修改
    • const int *p
  • 指针常量:指针本身不可被修改,即该指针的指向不能被修改
    • int* const p
  • 常量常指针:该指针本身的指向和指向的内存上的值都不能被修改
    • const int * const p
  • 顶层const指的是指针本身是常量,底层const指的是指针指向的值是常量

5. Const修饰成员属性

常函数

  • 成员函数后加const,我们称这个函数为__常函数__
  • 其本质是修饰this指向,让指针指向的值也无法修改
  • 常函数内不可以修改成员属性
  • 成员属性声明是加关键字mutable,在常函数和常对象中依然可以进行修改
 class person{
  public:
 	int m_age;
 	mutable int m_height;  //用mutable修饰的特殊变量,即使在常函数中也可以进行修改
 	
 	//该函数用const修饰,为常函数
 	void init_person() const
 	{
 		m_age = 100;  
	//编译出错,此处相当于const person * const this->m_age = 100; this指针本身就是一个指针常量,这里加一个const修饰,就变成了常量常指针,既无法修改指向也无法修改指向地址内的值
	
		m_height = 130;
	//编译通过,该变量用mutable修饰,可以在常函数中修改
 	}
 }

常对象

  • 声明对象前加const称该对象为常对象
  • 常对象只能调用常函数
  • 其本质是防止常对象通过调用非常函数对成员属性进行修改

comments powered by Disqus