深入理解C++的const限定符

Posted 脚本之家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解C++的const限定符相关的知识,希望对你有一定的参考价值。

 关注脚本之家,与百万开发者在一起

深入理解C++的const限定符

作者 |  Bobby

出品 | 脚本之家(ID:jb51net)
本文目录
  • const常量的定义及初始化

  • const的引用

  • const与指针

    • 指向常量的指针

    • 常量指针

  • 顶层const和底层const

  • 常量表达式结果

深入理解C++的const限定符

const常量的定义及初始化

当我们需要定义一种不能被改变的变量时,可以用关键词const对变量加以限定,将变量声明为常量。需要注意的是,const对象必须进行初始化操作,并且初始化后其值不能再改变。

const int a = 10;       //创建并初始化常量
const int b = get_size(); //正确,初始化操作可以为复杂的表达式
const int c;        //错误,常量未进行初始化

其次,在不改变const对象的前提下,利用一个对象去初始化另一个对象时,它们的const属性被忽略不计。

int a = 10;     //a不是常量
const int b = a;//正确,可以用非常量值初始化常量对象
int c = b;  //正确,可以用常量对象初始化非常量对象,const在此处被忽视


深入理解C++的const限定符

const的引用

可以定义常量引用(其实是对常量的引用),需要注意的是,常量引用不能用作修改其所绑定的对象的值,这点与普通引用不同。其次,如需要对常量进行引用,必须将其声明为常量引用。⚠️注意,引用本身并不是一个对象,只是被引用对象的一个别称!!!

const int a = 10;
const int &i = a;//对常量的引用
i = 20;    //错误,不能修改常量引用所绑定的值
int &j = a;   //错误,a为常量,需将j声明为常量引用

需要注意的是,声明为常量引用仅仅限定了引用可参与的操作,其绑定的对象并不一定非得是常量。但不管怎样都不允许通过常量引用修改其所绑定的对象的值!

int a = 10;
const int &i = a;//正确,常量引用所绑定的对象并非一定是常量
i = 20;    //错误,不允许修改常量引用绑定的对象的值


深入理解C++的const限定符

const的指针

指向常量的指针

const int a = 10;
int b = 20;
int *ptr1 = &a;         //错误,不能用普通指针存放常量对象的地址
const int *ptr2 = &a;   //正确,ptr2是指向常量的指针
*ptr2 = 20;             //错误,不能改变指向常量的指针所指向的对象的值
const int *ptr3 = &b;   //正确,指向常量的指针所指的对象也并非一定是一个常量

常量指针

与引用所不同的是,指针本身是一个对象,因此,指针可以本定义为常量指针,与其他常量对象一样,常量指针必须被初始化,并且一旦初始化后就不能再改变。⚠️注意,常量指针本身是一个常量对象!!!

int a = 10;
int b = 20;
int *const ptr1 = &a;//正确,定义常量指针并初始化
ptr1 = &b;           //错误,常量指针一旦被初始化就不允许改变
*ptr1 = 20;          //正确,可通过常量指针修改所指非常量对象的值

需要注意的是,常量指针的const含义仅仅指明自身是一个常量对象,自身的指一旦初始化后就不允许改变,但并不未规定不能通过常量指针修改其所指对象的值,能否修改常量指针所指对象的值完全取决于被指对象本身。下面,来看看这个例子:

const int b = 20;
const int *const ptr2 = &b;//正确,ptr2是指向常量对象的常量指针
*ptr2 = 30;                //错误,不可通过任何途径修改常量对象(b)的值


深入理解C++的const限定符

顶层const和底层const

顶层const表示指针(可以是其他任意对象)本身是一个常量 底层const 表示指针所指对象是一个常量

int a = 10;
int b = 20;
int *const ptr1 = &a;      //顶层const
ptr1 = &b;          //错误,不允许改变常量指针的值
const int c = 30;        //顶层const
const int *ptr2 = &c;      //底层const,允许改变ptr2的值
const int *const ptr3 = &c;//第一个const是底层const,第二个const是顶层const
const int &i = c;          //用于声明引用的const都是底层const!
⚠️注意,由于引用本身并不是一个对象,因此用于声明引用的const都是底层const!

深入理解C++的const限定符

常量表达式

常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式,一个表达式(对象)是不是常量表达式有它的数据类型初始值共同决定。

const int a = 10;      //a是常量表达式
const int b = a+10;      //b是常量表达式
int c = 30;        //c不是常量表达式,因为不是const
const int d = get_size();//d不是常量表达式,因为初始值要运行时才能获取到

可以用constexpr将变量声明为常量表达式。声明为constexpr的变量一定是常量,且必须用常量表达式初始化。

constexpr int a = 10;   //20是常量表达式
constexpr int b = a+10;   //a+10是常量表达式

参考文献:《C++ Primer 第五版》

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。

写的不错?赞赏一下

深入理解C++的const限定符

长按扫码赞赏我

深入理解C++的const限定符

● 深入理解C++的const限定符 

● 深入理解C++的const限定符 

●  

● 

 

以上是关于深入理解C++的const限定符的主要内容,如果未能解决你的问题,请参考以下文章

C++中的const关键字深入理解(关于引用指针顶层const)

C++杂谈const限定符与const指针

《挑战30天C++入门极限》入门教程:C++中的const限定修饰符

跟我一起学C++之从C到C++(const限定符)

C++ Boost - 序列化错误 - 将“const B”作为“this”参数传递会丢弃限定符

QT & C++:传递 'const QString' 丢弃限定符