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