const限定符_c++Primer

const对象必须初始化,因为const对象一旦创建后其值就不能改变。

默认情况下,const对象仅在文件内有效

在一个文件中定义const,在多个文件中声明并使用,解决办法:对于const变量不管是声明还是定义都添加extern关键字

把引用绑定到const对象上称为对常量的引用(reference to const),与普通引用不同的是,对常量的引用不能被用作修改他绑定的对象。

const int ci = 1024;
const int &r1 = c1;

r1 = 42;         // error
int &r2 = ci;    // error 不可以将将非常量引用指向一个常量对象

允许将const int &绑定到一个普通int对象上,即

int i = 1024;

int &r1 = i;
const int &r2 = i;

r1、r2同时绑定到普通int对象i上,可以通过i直接修改对象的值,也可以通过普通引用r1间接修改对象的值,但是不允许通过const引用r2修改i的值。

指向常量的指针也不能用于改变其所指对象的值。

const指针必须初始化,而且一旦初始化,它的值(也就是存储在指针中的那个地址)就不会改变了,也就是将一直指向此对象(即不变的是指针本身的值而不是指向的值)。

int errNumb = 0;
int *const curErr = &errNumb;

顶层const表示指针本身是一个常量,底层const表示指针所指对象是一个常量;靠右的const是顶层const,靠左的是底层const。

指针类型可以是顶层const也可以是底层const,所有引用都是底层const

int i = 0;
int *const p1 = &i;          // 不允许修改p1的值,即p1的指向,是顶层const
const int ci = 42;           // 不允许改变ci的值,是顶层const
const int *p2 = &ci;         // 允许改变p2的值,即p2的指向,不允许通过p2修改ci的值。是底层const
const int *const p3 = p2;    // 靠右的是顶层const,靠左的是底层const
const int &r = ci;           // 用于声明引用的const都是底层const

当执行对象拷贝操作时,常量是顶层const还是底层const有很大区别,顶层const没有什么影响,拷贝操作不会改变被拷贝对象的值,拷入和拷出的对象是否是常量都没有什么影响。

i = ci;
p2 = p3;

底层const在执行拷入拷出时必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。一般来说非常量可以转换成常量,反之不可以。

int *p = p3;          // error, p3具有底层const,即p3指向的值不可以修改,而p没有
p2 = p3;              // 正确,p2和p3都是底层const
p2 = &i;              // 正确,int*可以转成const int *
int &r = ci;          // error, 普通的int &不能绑定到int常量上。
const int &r2 = i;    // 正确,const int &可以绑定到普通int上。

**int const 和 const int 的区别

int a = 20;

int * const p1 = &a;

const int *p2 = &a;

p1表示一个指向int对象a的常量指针(类型为int *),p1的值不可以改变即无法指向其他的存储空间,但是其指向的存储空间的值可以通过*p1 = newvalue \ a = newvalue改变。

p2表示一个指向const int对象a的指针,p2所指向存储空间的数值不可以通过*p2 = newvalue*改变,但是可以通过a = newvalue改变,并且p2也可以指向其他的存储空间。

常量表达式:值不会改变并且在编译过程就能得到计算结果的表达式。

C++11新标准,允许将变量声明为constexpr类型以便编译器来验证变量值是否是常量表达式。声明为constexpr的变量一定是一个常量,并且必须用常量表达式初始化。

constexpr int mf = 20;
constexpr int limit = mf + 1;
constexpr int sz = size();		// 只有当size是一个constexpr函数时才是一个正确的语句

算术类型、引用和指针都属于字面类型。自定义类、IO库、string类则不属于字面值类型,也不能被定义为constexpr。尽管指针和引用可以定义为constexpr,但是初始值却收到严格限制。一个constexpr指针的初始值必须为nullptr或0,或者是存储于某个固定位置中的对象。定义于所有函数体之外的全局对象其地址固定不变,能用来初始化constexpr指针。

在constexpr声明中若定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。

posted @   Happinesspill  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示