C++ 2.4 const限定符,指针常量-顶层 const,常量指针-底层 const


const 限定常量

eg.
const int con = 1024; 定义一个 int 型的常量
变量con的值,不可改变

赋值一个函数

const int con = func();

声明连续变量

const 声明连续变量时,都有效

const int con1=1, con2=2, con3=3;

con1、con2、con3 都是常量


const 与引用 const type &

指向常量的 常量引用,本身也必须是一个常量。
该引用变量不能被改变。

const int con1 = 1024;
const int &con2 = con1; //对常量的引用,简称常量引用,也必须是一个常量
const int &con3 = 1024; //常量引用,可以赋上一个字面值。而非常量引用是不行的
int cVal = 1;
const int &con4 = cVal; //常量引用,可以赋值一个非常量的变量

注意,con4,被赋值上一个非常量值。con4本身不能被改变,但指向的非常量值是可变的。修改非常量值:

cVal = 197;
cout << con4 << endl;   

会输出 197

指向常量的常量引用,本身也必须是一个常量
指向非常量的常量引用,非常量值改变,引用值也改变
不能通过自身去改变指向的值


const 与指针

常量指针: const type *

常量指针,本质上是一个指针。声明定义:先常量符const ,后跟类型指针。
指向常量的指针,本身也必须是一个常量。
但是,指针变量本身可以被重新赋值。

const int con1 = 1024;
const int *con2 = &con1; //指向常量的指针
int cVal = 1;
const int *con3 = &cVal;  //指向非常量的指针

int cVal2 = 197;
con2 = con3 = &cVal2;
cout << *con2 << endl;
cout << *con3 << endl;

如上,形如 const type * 定义的变量,无论指向的是一个常量,还是非常量。都可以重新指定指向的地址。
通过 指针解引用符来改变 指向的原始值,是不行的。 *con3 = 200;//error

指针常量: type *const

指针常量。本质是一个常量,该常量是一个指针类型。声明定义:先类型指针,后跟常量符const。
定义时,必须初始化。因该指针是一个常量,所以就无法被重新赋值,会一直指向初始值地址。

int con1 = 1024;
int *const con2 = &con1; //常量指针
int cVal = 1;
*con2 = 10;
con2 = &cVal;  //error

如上,con2的地址无法被改变,但地址指向的值是可变的。

指针本身不可变,且地址指向的值也不可变: const type *const

综合上面两种定义,

int con1 = 1024;
const int *const con2 = &con1;
int cVal = 1;
*con2 = 10; //error
con2 = &cVal; //error

如上, con2的地址无法被改变,且地址指向的值也不可变。


顶层 const 和 底层 const

顶层 const (top-level const) 表示本身是一个常量
底层 const (low-level const) 表示指向的是一个常量
通俗的讲,
顶层 const,即(指针或引用或其它类型)变量本身不可变;
底层 const,即(指针或引用或其它类型)变量所指向的对象值不可变。

对于指针来说:
type * const 是顶层的;
const type * 是底层的。
对于引用来说:
const type & 是底层的。(这个规定,让我也很诧异。明明可以指向常量和非常量,且通过常量引用变量,无法改变本身,也无法改变引用的对象值。只能说,这是一个死规定)

既是顶层也是底层 const:

const int *const ccp = &cv;//左边是 low const,右边是 top const;

cpp11: constexpr 常量表达式

cpp11 新增关键字constexpr,可用于声明常量,和常量函数。

constexpr int rv() {
    return 100;
}
constexpr int xd = 88;
constexpr int xxd = rv();

使编译器在编译期间验证,常量定义是否正确。
由于在编译期间要确定常量值,所以非基本类型不可用于 常量表达式。像是指针类型 就是不行的

发布了400 篇原创文章 · 获赞 364 · 访问量 162万+

猜你喜欢

转载自blog.csdn.net/jjwwmlp456/article/details/89608121