const常量
const常量:值无法被改变的变量
关于const的一些规则
//创建之后必须初始化
const int bufSize = 1024;
const int a = get_a();
const int b; //错误,没有初始化
bufSize = 1024; //错误,常量不能赋值
const的引用
- 与可变变量的引用不同的是,对常量的引用,不能用作修改其所绑定的常量。
- 初始化常量的引用时允许用表达式作为初始值,但左右两边类型相同,但变量不行
const int bufSize = 1024;
const int &a = 512; //错误,不能修改绑定的常量的值
const int &b = bufSize * 3; //正确
int &c = bufSize * 3; //错误,非常量引用必须为左值
至于最后一条语句:使用表达式对变量引用报错,解释如下:
试想如下语句:
double d = 3.14;
const int &rd = d;
对于这种引用,编译器工作如下:
double d = 3.14;
int temp = d;
const int &rd = temp;
rd只是绑定了一个临时变量temp,如果rd不是常量是变量呢?那么就允许对rd赋值,但是对rd赋值改变的是临时变量的值,之所以有变量引用,无非就是想通过引用改变绑定变量的值,如著名交换函数swap(),但是对于出现中间临时变量的这种情况,无法达到上述要求,那么引用也无任何意义,所以,编译器对于变量引用使用表达式初始化报错。
指针和const
与常量的引用类似,也存在指向常量的指针,同样也不能通过指针改变常量的值。
const int a = 4;
int *b = &a;
- const指针
与引用不同,指针是作为对象出现的,允许把指针作为常量,即常量指针。同样,常量指针必须初始化,一旦初始化成功,不能修改,指针常量的定义如下:
#include<iostream>
using namespace std;
int main() {
int bufSize = 1024;
int bufSize2 = 512;
//定义一个常量指针
int *const rbuf = &bufSize;
//rbuf = &bufSize2; //错误:表达式必须是可修改的左值
cout << *rbuf << endl;
bufSize = 2048;
cout << *rbuf << endl;
system("pause");
return 0;
}
//输出结果
1024
2048
关于常量的引用或者指向常量的指针,一直搞不明白有什么用,既然不能那个改变,为什么还可以引用或者使用指针呢?
constexpr和常量表达式
常量表达式指不会改变而且在编译过程中就能计算出结果的表达式
字面值属于常量表达式,用常量表达式初始化的常量也是常量表达式。
const int num = 20; //num是常量表达式
const int number = num + 1; //number也是常量表达式
int a = 3; //a不是常量表达式
const int size = size(); //size不是常量表达式
C++11新标准:
允许将变量声明为constexpr类型,编译器验证变量是否是一个常量表达式
constexpr int num = 20; //num是常量表达式
constexpr int number = num + 1; //number也是常量表达式
constxpr int size = size(); //size不一定常量表达式,size()是constexpr函数时,语句正确
同样的,constexpr对于指针同样有效,相当于声明了一个常量指针
const int *p = nullptr; //p是指向整型常量的指针
constexpr int *q = nullptr; //q是常量指针
网友评论