c++之const详解

c++之const详解

关于const

首先我们要明确一个定义!const修饰的是变量!而不是类型!

const的关键字的含义是常量的,常数的,不变的意思

const int a = 0;
int const a = 0;
int cosnt a;//常量不进行初始化就会报错!

上面的两种写法都是一样的!因为const都时修饰变量a!int也是修饰变量a,所以它是一个int类型的恒常变量!恒常变量一开始就要初始化!因为本身就是无法修改的,一开始不在定义时候进行初始化的话,以后就都无法进行初始化

int const *a;
const int *a;

上面这种写法也是一样的,那么const修饰的是什么呢?我们可以怎么理解,a是一个指针变量*a 就是它指向的内容!那么const实际修饰的就是指针a指向的内容!它修饰的不是a本身,而是a指向的内容!a本身可以改变!但是a指向的内容可以改变

int* const a = 0; 

const int* b;
a = b//会报错

*那么这个也很容易的看出来,const修饰的是a本身,a的类型为int,所以是一个指针常量!(记得常量要一开始就是初始化)a本身是不可以改变的!但是a指向的内容是可以改变的!b无法赋值给a是因为b的类型为const int * **

const int* const a;

**第一个const修饰的是 *a 就是a指针指向的内容!第二个const修饰的是a本身!这样子a本身和a指向的内容都无法进行修改! **

再次强调一下,const修饰的是变量!不是类型!

const在typedef和宏中使用的差别!

#define int* INT
typedef int* int_ptr;

const INT a;
const int_ptr a;//这个会报错!
cosnt int_ptr* a;//这个可以编译通过!
cosnt int* a;

对于宏,宏本质就是一个替换,在预编译阶段就将宏定义的内容与宏进行替换!所以

const int* a 与 const INT a是相同的!

但是typedef不一样!typedef是一种严格的数据封装,只是将类型取一个别名而已!

也就是说 int_ptr此时是一个int* 类型的别名!

而类型里面的*是不会去和变量a结合的!

所以const真正修饰的是a!

typedef int* int_ptr;
const int_ptr a = 0;//这个的真正类型是int* const a!不是const int*a
const int_ptr *a;//这个修饰的就是*a 是a指向的内容!内容的类型是const int* 
关于typedef的补充!
typedef int myint;
unsigned myint a;//报错!

#define INT int
unsigned INT a;//通过

由于typedef是一种严格的数据封装,它只引入了类型而没有引入unsigned myint类型,也就是说,通过typedef的声明,编译器只能识别myint类型。而unsigned myint既不是基本类型也不是经过typedef声明过的类型,编译器就无法识别。

过typedef的声明,编译器只能识别myint类型。而unsigned myint既不是基本类型也不是经过typedef声明过的类型,编译器就无法识别。
unsigned是对int类型的扩展,而不是作用于变量!所以不像const一样可以使用!const修饰的是变量!

C语言中——关于typedef - 走看看 (zoukankan.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值