美文网首页
Const 限定符

Const 限定符

作者: madao756 | 来源:发表于2021-09-26 10:04 被阅读0次

前言:认真学习一下 C++,感觉光会 Go 没啥用。读一读《C++ Primer》

基本知识

  1. const 对象一旦创建后其值就不能再改变,所以 const 对象必须初始化。一如既往,初始值可以是任意复杂的表达式。
  2. 默认情况下,const 对象仅在文件内有效。

针对第一点:

  1. 如果利用一个对象去初始化另外一个对象,则它们是不是 const 都无关紧要。
  2. const 只是一个限定符,保证当前的变量不对这个对象修改,但不保证原有的对象其他方式的修改。

针对第二点:

  1. 如何定义一次并可以在多个文件中使用同一个 const 变量?

解决办法是:对于 const 比纳凉不管是声明还是定义都添加 extern 关键字,这样只需要定义一次就可以了。

// file_1.cc 定义并初始化了一个常量,该常量能被其他文件访问
extern const int bufSize = fcn();
// file_1.h 头文件
extern const int bufsize; // 与 file_1.cc 中定义的 bufSize 是同一个

Const 的引用

首先我们来看一个例子:

double dval = 3.14;
const int &ri = dval;

这个是没有语法错误的。但是:

double dval = 3.14;
int &ri = dval;

这个是有错误的。

原因在于,上述类型转换的过程中,会产生临时变量。引用的是临时变量。由于前者只读所以引用临时变量没问题。但是后者可写,修改一个临时变量就毫无意义,所以语法上是错误的。

而且,我们还可以知道:

对 const 的引用可能引用一个并非 const 的对象

指针和 const

  1. 想要存放常量对象的地址,只能使用指向常量的指针
  1. 但是指向常量的指针,可以指向一个非常量的对象,而且我们不能通过这个指针修改原来的对象。例子如下:
double pi = 3.14;
const double *cptr = π

什么是顶层/底层 const

首先我们要知道这样一句话:

对于一个指针来说,它本身是不是常量以及它指向的对象是不是常量是两回事。所以顶层 const 表示指针本身是一个常量,底层 const 表示指针所指的对象是一个常量。比如:

const int* p1; // 底层 const,p1 指向的对象是一个常量,不能通过 p1 修改
int *const p2; // 顶层 const,p2 本身是一个常量,不能修改

当执行对象的拷贝操作时,常量是顶层 const 还是底层 const 区别明显:顶层 const 几乎不受什么影响,但是底层 const 不行。比如:

int t1 = 10;
const int* p1 = &t1;
int* p2 = p1; // 错误,p1 是一个指向 const int 的指针,底层 const

常量表达式和 constexpr

常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式。c++11 新标准规定,允许将变量声明为 constexpr 类型以便由编译器来验证变量的值是否是一个常量表达式。声明为 constexpr 的变量一定是一个常量,而且必须用常量表达式初始化

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

一般来说,如果你认定变量是一个常量表达式,那就把它声明成 constexpr 类型。

而且必须明确一点,在 constexpr 声明中如果定义了一个指针,限定符 constexpr 仅对指针有效,与指针所指的对象无关。(其实就是一个顶层 const)比如:

const int *p = nullptr;         // p 是一个指向整数常量的指针
constexpr int *q = nullptr; // q 是一个指向整数的常量指针

Const 对象类型判断

顺时针法则。再对 const 上又有些不一样。按具体例子来分析

const 是一个限定符,具体什么类型,要看后面比如:

const int 整数常量

  1. int const a

按照顺时针法则:

  • a 是一个常量
  • a 是一个 int 常量
  1. const int a

按照顺时针法则:

  • a 是一个整数
  • a 是一个常量 int

所以 const int 和 int const 一致

  1. int *const a

按照顺时针法则:

  • a 是一个常量
  • a 是一个指向 int 的常量指针
  1. const int* a
  • a 是一个指针
  • a 是一个指向常量 int 的指针

相关文章

  • const 限定符详解

    背景 const 限定符的使用经常出现混淆,所以在此总结。 const 限定符与初始化 const 对象const...

  • C++11新特性(4)- const, const expres

    const限定符 const可以用于定义变量,它的值不能被改变。 const int bufSize = 512;...

  • C++类型转换

    const_cast const_cast转换符是用来移除变量的const或volatile限定符。 上述转换也可...

  • 笔记07:C++中的const

    1,const 限定符 const int i = 0;,使用const可以将i变成一个常量,当试图对i的值进行修...

  • const限定符

    const限定符 const对象一旦创建就不可以改变,所以必须初始化,可以用复杂的表达式或者常量来初始化。 例: ...

  • const限定符

    1、解决神秘数字(魔数)的问题 写个数字,不知道代表什么意思。就叫神秘。定义一个变量的话容易被修改 ,定义成con...

  • Const 限定符

    前言:认真学习一下 C++,感觉光会 Go 没啥用。读一读《C++ Primer》 基本知识 const 对象一旦...

  • C++ const用法

    const限定符 在变量前面加上const,也可以创建一个常量。使用const创建常量的一般格式如下: 使用con...

  • C++笔记(2)

    这次学习的是const,C++是一种很坑爹的东西,连const都能玩出这么多的花样。 const 限定符 cons...

  • C++ const总结

    const限定符在C++中非常常见,有以下几种用途 const修饰一般变量 const修饰的变量必须初始化,原因是...

网友评论

      本文标题:Const 限定符

      本文链接:https://www.haomeiwen.com/subject/jfhqnltx.html