C++类与对象3(下)

目录

1const修饰的成员函数

2.取地址及const取地址操作符重载

本篇讲述以上内容

const修饰的成员函数

首先,我们看一下下面这个类

class A
{
public:
	A(int a = 1,double b = 0.1)
	{
		_a = a;
		_b = b;
	}
	void print()
	{
		cout<<"print()"<<end;
		cout<<_a<<" "<<_b<<endl;
	}
	void print() const
	{
		cout<<"print() const"<<end;
		cout<<_a<<" "<<_b<<endl;
	}
private:
	int _a;
	double _b;
}
int main()
{
	A A1(2,1.5);
	const A A2(2,1.5);
	A1.print();
	A2.print();
}

我们执行一下这个代码会看出,这两个对象调用了不同的打印函数,这是因为,A1这个对象,没有被const修饰,即A1这个对象有可读可写权限,则会调用第一个打印函数,而A2这个对象有const修饰,只有可读权限,因此,则会调用第二个打印函数。
const修饰的成员函数:在成员函数后+const
即void print() // 等价于 print(A* const this)
void print() const //等价于 print(const A* const this)
const成员函数中的const修饰的为第一个参数,即this指针
const成员函数内部补能修改成员变量的值

总结:
1.非const修饰的对象,可以调用非const成员函数以及const修饰的成员函数,因为其读写权限只有缩小。
2.const修饰的对象,只能调用const修饰的成员函数,不能调用非const修饰的而成员函数,因为其只有读权限,不能放大其权限

取地址及const取地址操作符重载

有了上面对const修饰的成员函数调用的理解后,我们来看最后两个默认函数:
普通对象默认取地址重载,const修饰的对象取地址重载。
首先我们先看这这个类

class A
{
public:
	A(int a = 1,double b = 0.1)
	{
		_a = a;
		_b = b;
	}
private:
	int _a;
	double _b;
}
int main()
{
	A A1(2,1.5);
	const A A2(2,1.5);
}

依旧const修饰A2这个对象如果我们想要定义一个A类型的指针分别取A1和A2两个对象的地址,则我们要写成如下

int main()
{
	A A1(2,1.5);
	const A A2(2,1.5);
	A* pA1 = &A1;//取A1地址
 	const A* pA2 = &A2;//取A2地址
}

这里的**&**,就是取地址重载函数,它也是编译器为我们自动生成的,如果显式定义,则如下

class A
{
public:
	A(int a = 1,double b = 0.1)
	{
		_a = a;
		_b = b;
	}
	A* operator&()
	{
		return this;
	}
	const A* operator&() const
	{
		return this;
	}
private:
	int _a;
	double _b;
}
int main()
{
	A A1(2,1.5);
	const A A2(2,1.5);
	A* pA1 = &A1;//等价于A1.operator&()
 	const A* pA2 = &A2;//等价于A2.operator&() const
}

通常,这两个函数我们不显式定义,因为返回的地址是可以自己改的,如果随意修改返回的地址,则可能会有不可预计的后果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章