C++数据类型(四)const常量

2018-06-05  本文已影响0人  山羊歌的演唱会

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;
#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是常量指针
上一篇下一篇

猜你喜欢

热点阅读