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

来源:互联网 发布:淘宝网logo图标 编辑:程序博客网 时间:2024/05/07 22:09

C++语言中可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的优点。
1、const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意想不到的错误(边际效应)。
2、有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在c++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

const修饰指针

一般分为如下4种情况:

int b = 500;const int *a = &b //情况1int const *a = &b;//情况2int* const a = &b;//情况3const 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为指针本身和指向的内容均为常量。那么这个仓库管理员只能去特定的仓库,并且仓库里面的所有的货物他都没有权限改变。

0 0