关于const的笔记

     今天让指针常量,常量指针的说法搞糊涂了,原理明白,但是叫法上的区分糊涂呵呵!const是C特别是C++中经常遇到的东西,能灵活的运用可以体现你的CC++的水平。

1. 常量和预编译
     我们都知道在C中用到常量往往是通过预编译来实现,但是这样最大的缺点是不能够进行类型检查,使用const修饰变量就可以客服这样的缺点。
     常量在定义时必须初始化,除非它是extern
2. 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 关键字来修饰变量,使得它可以在任何的函数中可以修改。

你可能感兴趣的:(C++,c,fun)