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

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是常量指针
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容