02 - this, 常成员函数与常对象

本文介绍了this关键字,以及为什么类编写中使用常成员函数和常对象是一个好习惯。

this关键字

编译器将this解释为指向函数所作用的对象的指针,即每个普通的方法调用都会传递一个指向对象的指针,这就是this指针。

例如,Test类中有个value成员,命名习惯不好的人写的 setValue() 方法如下:

void Test::setValue(double value)
{
    // 让人困惑
    value = value;
}    

有的编译器可以通过,而有的会给出警告或错误,为了避免歧义,可以这样写:

void Test::setValue(double value)
{
    // 让人困惑
    this->value = value;
}   

此问题的最终解法还是拥有一个好的命名习惯 ;p

当然,这么说并非完全准确,this是一个关键字,只是我们将它当做指针理解罢了。this有很多功能是单纯的指针无法满足的。比如每个类函数的参数根本没有名 叫this的指针。这不过是编译器赋予的功能罢了。

常成员函数与常对象

在大型程序的开发中,为成员函数和对象加上const关键字可以减少很多不必要的麻烦。记住多用 const,这是一个好习惯

以下内容在前面文章 《const 关键字》中也有提到,可以在那儿看到一些小细节。

常成员函数

常成员函数就是无法修改成员变量的函数。可以理解为将this指针指向对象用const修饰的函数。示例代码如下:

class Test
{
public:
    void output() const
    {
        // ......
	}
};

因为类的成员函数已经将this指针省略了,只能在函数后面加const关键字来实现无法修改类成员变量的功能了。

以下是一些注意事项:

  1. 常函数内无法调用普通函数,否则常函数的这个“常”字还有什么意义。
  2. 成员函数能写作常成员函数就尽量写作常成员函数,可以减少出错几率。
  3. 同名的常成员函数和普通成员函数是可以重载的,常量对象会优先调用常成员函数,普通对象会优先调用普通成员函数。这样可以提高效率。

常对象

常对象就是用const修饰的对象,定义好之后就再也不需要更改成员变量的值了。常对象在大型程序中还是很有意义的。

const Test test();

以下是一些注意事项:

  1. 常对象不能调用普通函数,这一点之前其实已经讲过了。
  2. 常对象使用的常函数在大型程序中真的很重要,很多时候我们都需要创建好就不再改变的对象。

参考资料

  • 飘零的落花 - 现代C++详解
  • C++20高级编程