const:
const对象必须初始化,const对象仅在文件内有效,否则加入extern,多文件共享
编译时就替换
对普通变量的修饰比较简单,暂不做描述;
1.指针
经典的指针常量与指向常量指针的区别:
const int *p
int const * p(底层const)
以上表示一个意思。指向常量的指针,对象的值不可改变,但指针可以更换指向的对象
int * const p,指针常量;(顶层const)
指针内所存的地址不可改变,指向的对象的值可以改变;
注意:
typedef char * A;
const A p; 表示什么呢?
有人会将其展开
const char * p; 认为是指向常量的指针。错误
const修饰的是A,A是指针,所以上句表示指针常量
2.引用,常量引用
int ci=12;
const int &a=ci;
引用本身性质决定绑定关系不可改变;
常量引用会使:不能修改所绑定的对象,不能用一个非常量引用指向常量对象,允许为其绑定非常量的对象(此时,该对象可以通过其他途径修改);
声明引用的都是底层const
拷贝操作,注意底层const的限制,比如要有相同的const资格,或两对象数据类型可以转换;顶层不受影响;
常量表达式:
受数据类型(有const)与初始值决定(编译而非运行时就有结果)
3.C++11 新限定符constexpr , 编译器验证是否是常量表达式
constexpr 声明指时,仅对指针有效
constexpr char * p;是一个指针常量;(置为顶层)
constexpr const char * p;是一个指针常量,同时指向常量对象;
4.类
4.1常对象:
常类对象必须初始化,且不可被更新,唯一的对外接口,常成员函数;
4.2常成员函数
无论是否常对象,常成员函数调用期间,目的对象都视为常对象
不可更新数据成员,不可调用非常成员函数
例:int func() const;(声明,定义都带上const)
const可以区分重载(非常对象调用时,选择非const函数)
4,3常数据成员
只能通过初始化列表获取初值
const 与#define,
用const可以像变量一样处理,可以在调试器中按名称引用,分配空间,具有类型.而#define是在编译前由预处理器处理,调试器不引用宏名,不分配空间,没有类型