[cpp primer随笔] 13. 类的常量成员函数

本篇分享了C++中类的常量成员函数的知识点。为了讲清楚其作用原理,首先需要介绍this指针的概念,接着会阐述const成员函数的使用方法与效果,最后介绍了可变数据成员这种即便在常量成员函数中依旧能够改变值的方法。

一、this的概念

this指针是指向调用该函数的对象的一个指针,无需程序员主动传入即可使用。当然,在一个非静态成员函数体中,也可以直接访问或修改成员变量,此时相当于隐式的使用this指针。

struct A{
	int number = 0;
	void test();
}

void A::test(){
	cout << this->number;
	cout << number; // 二者等价,后者隐式使用this->number
}

A a;
a->test(); // a作为test的调用者,
           // 那么调用过程中的test,其this将指向a

this相当于非静态成员函数的一个隐式参数。

A::test(&a); // 这种不合法,仅用于理解this的存在
             // `&a`用于初始化`this`形参

这里提一下为什么是非静态函数:静态函数无关具体对象,因此没有this指针。如果在静态成员函数体内使用this,编译时会报错。

二、const成员函数

在上面的例子中,test成员函数内的this指针类型为A *。当我们不希望在某个成员函数中修改成员时,可以在成员函数参数列表与函数体之间使用const进行修饰,得到常量成员函数。上面的例子经过修改如下:

struct A{
	int number = 0;
	void test() const;
};

void A::test() const {// 定义和声明都要使用const修饰
	cout << this->number;
}

常量成员函数体中,this的类型,是类类型常量对象的指针。在上面的例子中,this的类型为const A*。正因如此,常量成员函数体中无法通过this显式或隐式的修改成员的值。

此外需要注意,const修饰符需要同时加在成员函数的声明与定义上才有效。否则编译器会报函数声明与类中声明不兼容的错误。

三、可变数据成员

如果有些对象确实可变,我们希望哪怕是在const成员函数中也能对其进行修改,那么可以通过mutable关键字将其声明为可变数据成员。
《C++ Primer》中举了一个很好的例子:假如我们现在需要统计一个对象中某个常量成员函数的调用次数,那么就可以借助可变数据成员来完成。

struct A{
	mutable int count = 0;
	void test() const;
};

void A::test() const {
	this=>count += 1;
	count += 1; // 对于可变数据成员来说,这二种都是合法的
}

你可能感兴趣的:(C++,1024程序员节,c++)