const
const含义
常类型的变量和对象是不可更新的
const作用概述
- 定义常量
- 与#define的区别
– const常量具有类型,可以进行安全性检查 - 只有整数,枚举,以表达式初始化时才可以作为常量表达式,其他时候只是const限定。
- 节省空间
–只给出汇编地址而不是立即数(define)
–程序运行时只有一份拷贝,而不是多个(define)
const默认文件局部变量
- 非const默认为extern,const需要显示声明(并初始化)
定义常量
常量不可更改,变量可更改
把一个变量引用数据的方式指定为const的话,就意味着你不能通过这个变量对被引用的数据进行写操作。就是说你不希望数据被你或别人通过这个变量修改其数据。
指针
-
如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
-
如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
(1)指向常量的指针
1.不能用常量指针修改指向的对象值。
2.必须使用const void*类型的指针保存const对象的地址(不能用void*)。
3.const对象指针可指向非const对象,但不能修改对象值(通过其他指针)
(2)常指针
- 常指针必须进行初始化,初始化后指针值不能更改1
- const指针指向的值可以通过非const指针修改
- const常量地址不能赋给变量指针
(3)指向常量常指针
结合前两种情况理解
函数const
修饰返回值
- const int无意义:返回值本身就是赋值给其他变量
- const int* 指针指向内容不变
- *int const 指针本身不可变
修饰函数参数
- const int 和int *const无意义,本身形参在函数内值传递就不会改变
- const int* 参数所指内容不可变
- 对于非内部输入数据void func(A a)改为void func(const A &a),参考类const 6
类const
- const成员变量必须通过初始化列表进行初始化,例:
Apple::Apple(int i): apple_number(i){}
- const对象只能访问const成员函数,非const对象可以访问所有。原因:由于常成员函数不会修改被操作对象,由于常对象不能修改自身的数据成员,因此只能调用不会修改内容的常成员函数。
- 当一个对象调用成员函数时,编译器将对象地址赋给this指针,存取数据成员时隐含调度this指针(X * const this 不能被赋值)
- 只有常成员函数可以操纵常对象(其this指针为const A * const this),常成员函数只能访问成员变量,不能修改。原因:因为常成员函数声明自己不会修改被操作对象,而常对象不能被修改,因此常对象只能被常函数调用以确保安全性。
- 常成员函数中可以引入非常数据成员,但不能改变其值
- 对象的常引用(禁止更新),用于参数传递中减少拷贝构造函数
初始化常量的其他方法:
在外面初始化:const int Apple::apple_number=10;
直接写成static const int apple_number