首页 > 技术文章 > const的使用

xyzaijing 2014-03-17 01:21 原文

1.怎样判断const把谁定义成了常量?

要看const吧谁定义为了常量,只需要看const右边的变量即可

int * const a;是把a定义为了常量,而*a是可以改变的

int const * a;是把*a定义成了常量,a是可以改变的

int const * const a;是把a和*a都定义成了常量,都不能被修改

 

2.const用在什么时候

--1如果不希望自己的变量呗修改,应该定义为const类型

例如写函数时为了确保变量*p不被修改可以写成

void test(const int *p){}

--2 const还可以替代宏定义

 

3.在使用const遇到#define和typedef时应注意的情况

例如下面的问题

下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?

typedef char * pStr;

char string[4] = "bbc";

const char *p1 = string; //1式

const pStr p2 = string; //2式

p1++;

p2++;

 

答案是p2++不对,为什么呢?

1)const使用的基本形式: const type m;限定m不可变。替换基本形式中的m为1式中的*p1,替换后const char *p1;限定*p1不可变,当然p1是可变的,因此问题中p1++是对的。

替换基本形式中的type为2式中的pStr,替换后const pStr m;限定m不可变,题中的pStr就是一种新类型,因此问题中p2不可变,p2++是错误的。

而如果将typedef换为#define就可以运行通过,为什么呢?

因为#define 是直接替换代码,所以p2跟p1一样

而typedef 是将char *作为一种新的类型,名字是pStr,是一个整体,不是类型+指针,所以按照typeDef,pStr是不能改变的,即p2不能被改变

 

P.S.  const和数据类型是可以互换位置的例如:

const int a;和int const a;是一样的

const int *a 和int const *a是一样的

 

4.const一些赋值问题

int const a = 8;

int *p = &a;//这句是报错的,因为a被const约束以后,不能把自己的地址赋给别的指针

同样的,如果

const int a = 10;

int &af = a;//这句也是报错的,因为const约束以后,不允许给a起别名(引用a)

 

5.const和引用混合使用的问题

首先引用必须跟要引用的变量类型相同

double d = 10.5;

int &a = d;//这句是会报错的,因为类型不匹配

const int &df = d;//这句是不会报错的,因为如果引用和const同时使用,并且类型不匹配的情况下,系统会拆分成两句执行

--1.int temp = 10.5;

--2.const int &df = temp;

此时df跟d没有关系(地址不同,此时df已经不是引用的d)

 

如果类型匹配 const double &df = d;

就是常规的思路,df还是引用d

 

 

推荐阅读