1.常变量
const int i = 10;
int const i = 10;
两种表达方式没区别
2.指针与const
- 如果const位于
*
的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; - 如果const位于
*
的右侧,const就是修饰指针本身,即指针本身是常量。 - 利用英文从右边往左边读,并且以to为分界,to之前为描述指针的特性,to之后为描述目标的特性
指针常量: 指向常量的指针
const int *a;
int const *a;
1.对于指向常量的指针,不能通过指针来修改对象的值。
2.不能使用void*指针保存const对象的地址,必须使用const void*类型的指针保存const对象的地址。
3.允许把非const对象的地址赋值给const对象的指针,如果要修改指针所指向的对象值,必须通过其他方式修改,不能直接通过当前指针直接修改。
eg:
const int p = 10; //定义一个常量
const void * vp = &p;//将这个常量地址付给这指向常量的指针
int val = 3;
ptr = &val; // ok,指针可以改变自己的指向
*ptr=4;//error,不能通过指针来修改对象的值
常指针:const指针不能修改指向
int* const a;
eg:
int num=0, num1=1;
int * const ptr=# // const指针必须初始化!且const指针的指向不能修改
ptr = &num1; // error! const指针不能修改指向!
*ptr=1;//ok,const指针指向的值能修改
指向常量的常指针
const int* const a;
3.类函数中的const
const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
int Apple::add(int num) const
int Apple::add(int num)
- Apple对象可以访问add()和add() const;
- const Apple对象只能访问add() const;
在一个类中,任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改 数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性
类中常量
不能在类声明中初始化 const 数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道 SIZE 的值是什么。(c++11标准前)
class A
{
const int SIZE = 100; // 错误,企图在类声明中初始化 const 数据成员
int array[SIZE]; // 错误,未知的 SIZE
};
根本原因:const的生命周期在对象A创造之前是不存在的。
正确做法
class A
{
A(int size); // 构造函数
const int SIZE ;
};
A::A(int size) : SIZE(size) // 构造函数的定义
{
}
A a(100); // 对象 a 的 SIZE 值为 100
A b(200); // 对象 b 的 SIZE 值为 200
cosnt static 常量 可以解决生命周期的问题