您的位置:首页 > 其它

const和#define的不同以及 const修饰指针的几种情况

2016-06-18 15:46 232 查看
C++语言中可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的优点。

1、const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意想不到的错误(边际效应)。

2、有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在c++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

const修饰指针

一般分为如下4种情况:

int b = 500;
const int *a = &b //情况1
int const *a = &b;//情况2
int* const a = &b;//情况3
const int* const a = &b;//情况4


如何区别呢?

1)先看情况1

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身就是常量。因此,1和2情况相同,都是指针指向的内容为常量(const放在变量声明符的位置无关),这种情况不允许对内容进行更改操作。

换句话来说,如果a是一名仓库管理员的话,他所进入的仓库,里面的货物(*a)是他没有权限动的,仓库里面的东西原来是什么就是什么;所以

int b = 500;
const int *a = &b;
*a = 600;//错误


但是也有别的方法改变*a的值,一是通过改变b的值:

int b = 500;
const int *a = &b;
b = 600;
cout<<*a<<endl;//得到600


还有一种方法就是a指向别处;

2)情况2和情况1相同。

3)情况3指针本身为常量,这种情况下不能对指针本身进行更改操作,而指针所指向的内容不是常量。

举例来说:如果a是一名仓库管理员的话,他只能进入指定的某仓库,而不能去别的仓库(所以a++是错误的)


;但这个仓库里面的货物(*a)是可以随便动的。(*a=600是正确的)。

###此外,对于情况3:定义试必须初始化。

int b = 500,c = 600;
int* const a;//错误,没有初始化
int* const a = &b;//正确,必须初始化
*a = 600;//正确,允许改值
cout<<a++<<endl;//错误


对于情况4为指针本身和指向的内容均为常量。那么这个仓库管理员只能去特定的仓库,并且仓库里面的所有的货物他都没有权限改变。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: