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
关键字来实现无法修改类成员变量的功能了。
以下是一些注意事项:
- 常函数内无法调用普通函数,否则常函数的这个“常”字还有什么意义。
- 成员函数能写作常成员函数就尽量写作常成员函数,可以减少出错几率。
- 同名的常成员函数和普通成员函数是可以重载的,常量对象会优先调用常成员函数,普通对象会优先调用普通成员函数。这样可以提高效率。
常对象
常对象就是用const
修饰的对象,定义好之后就再也不需要更改成员变量的值了。常对象在大型程序中还是很有意义的。
const Test test();
以下是一些注意事项:
- 常对象不能调用普通函数,这一点之前其实已经讲过了。
- 常对象使用的常函数在大型程序中真的很重要,很多时候我们都需要创建好就不再改变的对象。
参考资料
- 飘零的落花 - 现代C++详解
- C++20高级编程