C++中 const限定符基本用法总结

来源:互联网 发布:mac菜单栏隐藏 编辑:程序博客网 时间:2024/06/14 12:39

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是在编译前由预处理器处理,调试器不引用宏名,不分配空间,没有类型


 



原创粉丝点击