C++ 常量和const

文章概述

  1. C++中的常量
  2. const的说明
  3. const的机制(C++编译器)
  4. const和#define的区别

C++中常量

a. 常量: 其值在程序运行的过程中不会发生改变,但是定义常量的时候可以设置初始值。
C++中使用const关键字来定义一个常量。

//a是常量
const int a=10;
//下面的两种方式是一样的,都是定义一个常量
const int b =8;
int const c =9;

b. 对于常量,编译器会将其放在一个只读的内存区域,其值不能发生改变。
c. 使用常量的好处就在于灵活,程序中多次用到常量,修改其值时,只需要改变定义时候的常量值就可以。
d. 注意: 定义函数时,如果在函数体中不需要修改形式参数的值,建议将形式参数的值设为常量(const),以防用户不小心修改了这个值,会出现错误消息。


const的说明

a. const 修饰的变量成为常量,在程序执行的过程中其值不会发生改变。
b. const 对象定义的时候必须赋值,也就是说const对象必须初始化。
c. 对象的类型决定其操作, const对象能够执行的操作就是不会改变其值得操作。以const int a =10为例,分析const对象可以执行的操作常见的3种:

  • 参与算术运算
  • 可以转换为bool值
  • 初始化,如果利用一个对象初始化别的对象,不用管两边是不是const对象。
int a =10;
const int b = a;
int c =b;

d. 默认的情况下,const对象仅在初始化它的文件有效。为什么会出现这种情况 ? 首先我们分析下面的代码:

const int a=10;

编译器在编译的过程中会将用到变量a的地方替换成10。编译器必须能够找到const的初始值。如果程序包含多个文件,则每个使用了const对象的文件都必须让编译器访问到const对象的初始值才行。要做到这一点,必须在每一个用到变量的文件中都有对它的定义。为了支持这一用法,同时避免对同一个变量的重复定义,默认情况下,const对象被设定在仅在定义自己的文件内有效。也就是说,当多个文件里出现了同名的const变量时,等同于在不同的文件中定义了独立的变量。
(这一点和这一用法指的是: 每个使用const对象的文件编译器能够访问const对象的初始值)
e. 如果一个文件中定义了const对象,使得这个对象在其它文件中声明并且使用它,该如何做了?
解决办法: 对const变量不管是声明还是定义都添加extern关键字,这样const变量只需定义一次就可以了。

//StrH这个文件中定义const变量,extern表示这个变量可以被其它文件使用
extern const int b = 10;
//命名空间这个文件中声明const变量,extern表示这个变量不是这个文件独有,定义在别的地方
extern const int b; 

const的机制(C++编译器)

const int a=10;
//定义一个指针变量
int *p=NULL;
//对a取地址
p =(int*)&a;
*p=20;
cout<<a<<endl;
cout<<*p<<endl;

对于上面的代码分析, C++编译器遇到const,会将const值放到符号表(键值对的形式)。使用的时候直接拿出来对应的值(初始化的值), 但是遇到&的时候,C++编译器会给a分配内存空间, 指针p指向的是刚刚分配的这个内存空间。所以输出a的时候还是10,通过输出*p可以表现出C++编译器为a分配的这个内存空间。


C++编译器是在编译的时候会对const对象分配内存。通过下面的代码可以证明:

//C++编译器会在编译的时候对a,c分配内存空间。a,c地址也是连续的。
    int a;
    int c;
    cout <<"a的地址:" <<&a << endl;
    cout <<"c的地址:" <<&c << endl;

输出结果:
这里写图片描述
我们想,如果对于const类型的变量放在a,c之间。如果它们的地址也是连续的(1.C++编译器在编译的时候对变量分配内存; 2.C++编译器一起给它们3个变量分配了内存 ),那可以证明C++编译器在编译的时候对const变量分配内存。

    int a;
    const int b=1;
    int c;
    cout <<"a的地址:" <<&a << endl;
    cout <<"b的地址:" <<&b << endl;
    cout <<"c的地址:" <<&c << endl;

输出结果:
这里写图片描述
输出结果表示: C++编译器在编译的时候给const变量分配地址。


const和#define的区别

我们讨论const与#define的区别之前,通过下面的代码看看它们的相同之处:

#define a 10
const int b=10;

//a表示的是常量
int arr[a]={};
//b表示的是常量
int brr[b]={};
(const#define 都可以表示常量)

不同之处在于:
a. 宏定义: 由预处理处理,单纯的是纯文本替换。
b. const常量: 由C++编译器处理,提供类型检查和作用域检查。

#define a 10

void print()
{
    //表示宏定义无作用域检查,
    cout << a << endl;
    //这个语句不合法,表示的是const具有作用域检查
    //cout << b << endl;
}

int main()
{
    const int b = 10;
    //typedef不能用于a,表示的是a无类型只是单纯的文本替换
    //const变量具有类型
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值