C++中的this指针和常量成员函数

默认情况下,编译器为类的每个成员函数提供了一个隐式形参,该形参指向被调用的成员函数所在的对象。该隐式形参成为this。常量成员函数是一个不会修改调用它的对象的函数。

1.this指针

  隐式对象形参的实际形参就是调用成员函数的对象的地址。因此在类的成员函数中也可以通过使用( *this )表达式来访问调用它的对象。此外,也可以通过同一个指针访问该对象的任何成员

  示例代码:

  void Example::setValue(int x)

  {

    this->x = x;   //或(*this).x = x; 注意要加括号

  }

2.常量成员函数

  通过引用或通过指针传递给函数的形参可能会被该函数修改。但是如果在形参中使用const关键字,则可以防止调用的函数修改它。例如:某个函数的声明如下:

  void fun(const string &str);

  该函数采用了一个字符串对象的引用作为形参,但是不能修改该对象。有一个类似的机制,可以用来保护隐含的形参*this,使它不会被成员函数修改。当定义成员函数时,可以在形参列表后面防止const关键字,这实际上就是告诉编译器,该成员函数未被允许修改其对象。如果成员函数定义在类的外面,则类内的声明和类外的定义都必须具有const,示例:

  class ConstExample

  {

    int x;

    public:

      ConstExample(int a) { x = a;}

      void setValue(int);

      int getValue() const;

  };

  getValue函数定义语句应如下:

  int ConstExample::getValue() const

  {   return x;   }

  具有常量参数x的函数无法转向,并将x作为非常量形参传递给另一个函数。换句话说,承诺不修改x的函数不能将x传递给另一个函数,除非第二个函数也承诺不修改x。这种情况下有时也可能会以不明显的方式发生。以下程序使用带有常量参数的函数来打印数组的第一个元素,但是它不会编译,因为它在const的使用方面不一致:

 

#include<iostream>

using namespace std;

class K
{
public :
  void output() //丢失了const
  {
  cout<<"Output of a K object"<<endl;
  }
};

void outputFirst(const K arr[])
{
  arr[0].output();
}

int main()
{
  K arr[] = { K() };
  outputFirst(arr);
  return 0;
}

运行显示错误:

该程序之所以不能编译,是因为编译器不能保证const数组的元素在作为隐含的this形参传递给output成员函数时,不会被修改。

要让该程序可以编译,则可以使output()成员函数变成一个const成员函数,以表示它有一个作为常量的this形参。

原文地址:https://www.cnblogs.com/ruigelwang/p/12618781.html