Const用法

来源:互联网 发布:上海兴安得力软件 编辑:程序博客网 时间:2024/06/07 23:20

关于const

编译器将在编译过程中把用到的该变量的地方都替换成对应的值(编译后const变量相当于一个字面值)

const int bufsize = 512;//编译后使用bufsize相当于直接使用512

因此const对象仅在当前文件内有效(在别的文件中访问不能得到它的初始值)要在别的文件中使用const必须用extern添加到声明和定义
引用和const

对于const的引用如果引用一个并非const的对象
如果该对象类型与引用类型不一致,改变对象的值,对const的引用的值不变(实际上此时引用的绑定的并非原本的对象,而是一个中间临时生成的对象)
如果该对象类型与引用类型的一致,则改变对象的值,对const的引用的值也改变(此时引用绑定的才是原来的对象)

double i = 42;const double &r1 = i;const int &r2 = i;cout << r1 << "," << r2 << endl;//输出:42,42i = 33;cout << r1 << "," << r2 << endl;//输出:33,    42

顶层const和底层const

对指针来说,顶层const是对指针本身的限制(常量指针)

int *const p = nullptr;
    底层const是对指针操作的限制(指向常量的指针)
const int * p = nullptr;
对于内置数据类型来说,只存在顶层const,顶层const可以表示任意对象是常量

const int j = 0;j = 1;//错误,表达式必须是可修改的左值int const k = 0;k = 1;//错误,表达式必须是可修改的左值

对于引用来说,只存在底层const用来声明引用的const都是底层const

int i = 0;const int &r1 = i;r1 = 1;//错误,表达式必须是可修改的左值int const& r2 = i;r2 = 1;//错误,表达式必须是可修改的左值

在拷贝时,对于指针,右值为底层const时,左值必须为const

当等号左右两边同时为指针或引用或内置数据类型时,顶层const不受影响

当等号右边为内置数据类型,左边为指针时,对于内置数据类型的顶层const不能忽视,对于引用和指针,因为在这里使用引用的地方相当于它绑定的对象,所以于内置数据类型相同。

              const int i = 0;

int j = 0;int *const p1 = &j;//此时p1不能绑定 iconst int *const p5 = &i;//正确const int *p2 = &j;int *p3 = nullptr;const int*p4 = j;//正确//int & r1 = i;//错误const int&r1 = i;//正确int &r2 = i;//错误int &r2 = j;//正确p2 = &r1;p3 = p1;//正确p4 = p1;//正确//p3 = p2;//错误p4 = p2;//正确p4 = p5;//正确

因为顶层const限制的是指针本身(前提是p1指向的是一个非const对象),因此p1值只能存放j的地址,而p3,p4指向p1指向的地址,并不影响p1本身对于j的指向所以正确;

虽然i是顶层const,但是p1不是顶层const,所以如果忽略顶层const的话p1就可以改变i的值,因此这里不能忽视顶层const;

而底层const限制的是p2的操作如果将p2拷贝给别的普通指针,通过这个指针可以改变j的值,会引起p2底层const机制的错误,因此要拷贝底层const必须对左值加以限制(声明为底层const);







原创粉丝点击