C++中类的常量成员函数

类的常量成员函数(const member function)是类的成员函数,其定义的方式是将const关键字放在成员函数参数列表之后。要说明常量成员函数的用途,首先从类成员的隐式参数this说起。

1 this参数

1.1 this参数介绍

struct A {
  int a;
  A(int param)
  {
     a=param;
  }
  int geta()
  {
     return a;
  }
};

以上代码自定义了类A,该结构包含了自定义的构造函数和geta()成员函数。

A ca(1);
int b = ca.geta();

以上代码定义了A的对象ca,并通过ca调用了A的成员函数geta()。需要注意的是,此时的geta()函数实际上是对象ca调用的,返回的a值实际上隐式地返回ca.a。

成员函数时通过一个名为this的隐式参数来访问调用它的那个对象,当通过某个对象调用成员函数时,实际上就是将该对象的地址赋值给隐式的this参数。所以,类A的geta()函数可以看成是如下定义

int geta(this)
{
   return this->a;
}

而通过ca调用geta()的代码实际上就是

A::geta(&ca);

1.2 this参数是常量指针

需要注意的是,this参数是指向对象地址的,因此其值不能被改变,因此,this参数本身是一个常量。

2 常量成员函数的引入

在“1.1 this参数介绍”中提到,this是指向类的对象的,这个对象是非常量的。当类的对象是常量时,就不能将其地址赋值给this。

const A cb(2);
int b = cb.geta();

此时,cb是常量,通过常量调用成员函数时,无法将cb的地址赋值给隐藏的this参数,报错信息是”error C2662: “int A::geta(void)”: 不能将“this”指针从“const A”转换为“A &””

此时,需要将this声明为指向const的指针,但是由于this是隐式参数,无法直接指定。所以就要使用常量成员函数,即在成员函数的参数列表之后添加const,将this声明为指向const的指针。

int geta() const
{
  return a;
}

此时,上面提到的代码就不会报错。

对于非常量的对象,也能调用常量成员函数。

A cc(3);
int c = cc.geta();

 

你可能感兴趣的:(C++基础,C++,类,常量成员函数,this,常量指针)