const在函数前与函数后的区别及一些基础

点击打开链接    

点击打开链接

两个链接已经讲得很清楚了。

一   const基础   
    
  如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:   
    
  int   b   =   500;   
  const   int*   a   =   &b;              [1]   
  int   const   *a   =   &b;              [2]   
  int*   const   a   =   &b;              [3]   
  const   int*   const   a   =   &b;   [4]   
    
  如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《effective   c++》item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的 右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操 作,如不能*a   =   3   ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常 量。   
  另外const   的一些强大的功能在于它在函数声明中的应用。在一个函数声明中,const   可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法:a&   operator=(const   a&   a);   
  void   fun0(const   a*   a   );   
  void   fun1(   )   const;   //   fun1(   )   为类成员函数   
  const   a   fun2(   );   
    重点:
  [思考1]:   以下的这种赋值方法正确吗?   
  const   a*   c=new   a();   
  a*   e   =   c;   
  [思考2]:   以下的这种赋值方法正确吗?   
  a*   const   c   =   new   a();   

  a*   b   =   c;   

思考1:不行 思考二:行。

为什么:(a代表是一种类型,如果说int)因为在思考一中,如果e=c,如果e指向的值改变,c指向的是值也会跟着改变,违背了const就是用来修饰指针所指向的变量,即指针指向为常量,所以不行。

const 成员函数:

class Stack
{
public:
void Push(int elem);
int Pop(void);
int GetCount(void) const; // const 成员函数
private:
int m_num;
int m_data[100];
};
int Stack::GetCount(void) const
{
++ m_num; // 编译错误,企图修改数据成员m_num
Pop(); // 编译错误,企图调用非const 函数
return m_num;
}
const 成员函数的声明看起来怪怪的:const 关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。
关于Const函数的几点规则:

a. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
b. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
c. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
e. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的

猜你喜欢

转载自blog.csdn.net/qq_39642794/article/details/80408586
今日推荐