默认情况下,编译器为类的每个成员函数提供了一个隐式形参,该形参指向被调用的成员函数所在的对象。该隐式形参成为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