今天让指针常量,常量指针的说法搞糊涂了,原理明白,但是叫法上的区分糊涂呵呵!const是C特别是C++中经常遇到的东西,能灵活的运用可以体现你的CC++的水平。
- 常量和预编译
我们都知道在C中用到常量往往是通过预编译来实现,但是这样最大的缺点是不能够进行类型检查,使用const修饰变量就可以客服这样的缺点。
常量在定义时必须初始化,除非它是extern - const与指针(重点)
一般来讲我们可以定义5中类型的指针:
int *pdata1;
const int *pdata2;
int const pdata3;
const int * const pdata4;
int const * pdata5;
第一个和第四个比较简单:pdata1是普通的指针;pdata4是指向常量的指针常量:指向和指向的内容都不能改变。
对于1,3我们看const与的位置:
如果const在之前。那么就是常量指针,否则就是指针常量,
如:
char * const a = 0,b; 是指针常量,const只属于a不属于b
char const * a; 是常量指针
const char * a; 也是常量指针
我自己总结了这样的记忆方法:前固数,后固址!就是说const在前是固定数据,在后是固定地址。大家还可以看出 “数”正好在“址”的按照音序的前面,这样理解记忆就好了。
通过上面的讲解,我想大家见到以后肯定不会出错了。但是怎样区分这两种说法呢?“常量指针”“指针常量”类比是最好的方法我经常这样用:“函数指针”“数组指针”。“函数指针”是指向函数的指针,“数组指针”是指向数组的指针。那么,“常量指针”是指向常量的指针,也就是内容“数据”不能改变。指针常量就是另外的一种意思。
最后需要注意的是:指针常量在定义时必须初始化,因为后面再也不能修改。
3. 常量和函数
常量和函数的联姻还是出于效率的考虑。这也是const的最常用的用途之一。
3.1 const修饰函数的参数,参数传递时按值传递需要复制一份,当数据量很大时,是很昂贵的。用了指针把地址传过去就可以了。如果不想让函数改变参数的的值的话就用const修饰。
void fun(const int *p);
3.2 const修饰函数的返回值,还是出于效率的考虑当函数返回时,也是需要临时变量的,如果用指针(当最好是引用C++的新特性)就可以省去这样的开销。为了保证数据的安全性,返回的数据可能不想让用户随便改动,那么使用const : const char *getname();
3.3 在C++中修饰成员函数,防止改变对象的状态(成员变量): char *player :: Getname() const,const的成员函数不能够调用非const的函数。那么是不是const函数什么都不能改呢?不是。C++中提供了mutable 关键字来修饰变量,使得它可以在任何的函数中可以修改。