【温故而知新】C和C++10:关于const限定符

简介: const关键字来源自constant,即是“常数、常量”的含义。在C/C++中,用于限定一个不能改变其值的变量。const类型的对象必须在定义的时候进行初始化(可以在编译时或者在运行时),并且一旦初始化完成后,这个值就不能再被改变。

const关键字来源自constant,即是“常数、常量”的含义。在C/C++中,用于限定一个不能改变其值的变量。const类型的对象必须在定义的时候进行初始化(可以在编译时或者在运行时),并且一旦初始化完成后,这个值就不能再被改变。通常情况下,const对象的有效范围是当前文件;如果多个文件中出现了同名的const变量,则认为是每个文件中都定义了不同的变量。如果希望在多个文件中共享这个对象,则在声明和定义的时候添加extern关键字,指明该对象并非本文件独有,可能被其他文件使用。


const引用:

对于一个const变量,也一样可以对其定义一个引用。我们知道,C++不允许随意改变某个引用所绑定的对象,因此一个对const对象引用不论是引用对应对象还是这个对象的值都不能改变,所以对于const对象的引用也可以称之为“常量引用”。由此带来的一个要求就是,指向该const对象的引用也必须是const类型,如:

const int ci = 1024;
const int &r1 = ci;//正确,const引用对应const对象
int &r2 = ci;//错误,如r2不是const类型

定义一个const引用可以绑定一个非const的值,但是不允许通过该引用修改这个值,如:

int a = 10;
const int &r1 = a;
r1 = 15;//错误,不允许通过const引用修改对象的值
a = 15;//正确

const和指针:

const与指针的关系相对于引用要复杂一些,因为涉及到指向常量的指针和自身是常量的指针两种关系。两者的区别如下:

int errNum = 0;
int *const pNum = &errNum;//指针变量本身是常量
const double pi = 3.14159;
const double *pPi1 = Π//指针指向的目标可变,但是必须是const对象
const double *const pPi2 = Π//常量指针,指向常量对象
double *const pPi3 = Π//错误,指向常量的指针必须前置const修饰

如何区别呢?简单地看,最前面的const表示指针所指向的是一个const对象,而*后面的const表示指针不能指向其他的对象,也就是指针本身是const类型的。 这两者也分别被称作底层const和顶层const。如果某个对象是const型,那指向这个对象的指针也必须以const定义在最前面。


目录
相关文章
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
|
C++
C++中的const指针与const引用
C++中的const指针与const引用
589 2
|
编译器 C++
C++中的内联函数与const限定词的使用
C++中的内联函数与const限定词的使用
243 1
|
编译器 C语言 C++
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)(下)
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)
141 1
|
编译器 C++
【C++】类与对象(运算符重载、const成员、取地址重载)
【C++】类与对象(运算符重载、const成员、取地址重载)
262 2
|
编译器 C++
【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 )
本文探讨了C++中类的成员函数,特别是取地址及const取地址操作符重载,通常无需重载,但展示了如何自定义以适应特定需求。接着讨论了构造函数的重要性,尤其是使用初始化列表来高效地初始化类的成员,包括对象成员、引用和const成员。初始化列表确保在对象创建时正确赋值,并遵循特定的执行顺序。
|
编译器 C++
【C++】:const成员,取地址及const取地址操作符重载
【C++】:const成员,取地址及const取地址操作符重载
336 0
|
存储 安全 编译器
C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)
C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)
290 0
|
编译器 C语言 C++
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)(中)
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)
211 0
|
编译器 C语言 C++
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)(上)
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)
164 0