笔者正在学习C++语言,啃书系列将会持续更新,希望可以同大家一起学习,一起进步。
系列文章:
啃书《C++ Primer Plus》之 C++ 函数指针
啃书《C++ Primer Plus》之 C++ 名称空间1
啃书《C++ Primer Plus》之 C++ 名称空间2
啃书《C++ Primer Plus》之 C++ 引用
const修饰符是C与C++语言中很常见也很常用的修饰符,但是他的用法很多很杂,在书上多次出现。由于这是一个非常重要的关键字,本文就来针对这个关键字进行总结:
const与变量
我们最先说起的 const 的用途是它最常见的,用于修饰一个变量。const 本意是"常量的",意味着一个被 const 修饰的变量是只读的,即在初始化之后便不能再修改它的值。因此,被 const 修饰的变量常被当做常量来使用。
在此,需要强调一个关键点:
const常量必须进行初始化!!
const常量必须进行初始化!!
const常量必须进行初始化!!
特别的,我们需要讨论下声明在全局的 const 常量。
const与宏定义
在C++的新标准中,声明在全局的 const 常量的连接性默认为内部的,也就是说一个声明在全局的 const 常量是自带 static 修饰的。(连接性为内部表明,这个变量的作用域为同一个文件中该变量的声明语句之后的全部区域,而其他文件则不能访问。有关进一步的内容,我们将在内存模型那一节谈到。)
这就使得 const全局变量起到了宏定义常量的作用,那么他们的区别有哪些呢?
- 二者的产生作用的方式与阶段不同。宏定义是在预处理阶段,并使用类似于搜索替换的方式。而 const 修饰的常量则是在程序编译阶段进行初始化的
- 另外,const 是有类型的,而宏定义是没有类型的,这在程序员使用常量方面的帮助很大,他能够有效的避免类型问题。
- 还有一点重要的是,const 修饰的变量是被当做特殊的变量看待的,他们具有连接性,更方便进行文件间常量的相互使用
const与类和对象
除了基本变量之外,类对象或是结构也是经常被 const 修饰的对象,而 const 在类与对象上的使用不仅限于修饰对象,也包括修饰类的成员变量以及类变量。
const修饰的类对象
同 const 修饰一般变量很相似的是,被 const 修饰的类对象也是在初始化后不能再发生改变,这里的改变主要指的是其中的成员变量,但是有一种关键字 mutable 可以修饰成员变量,使得即使对象是被 const 修饰的,也可以改变这个成员的值。
请看下面的例子:
#include<iostream>
using namespace std;
class A
{
public:
int k;
mutable int s;
A(int k,int a)
{
this->k = k;
this->s = s;
}
};
int main()
{
const A a