C++中箭头运算符重载的细节

文章讨论了C++中箭头运算符重载后的注意事项,重点是当重载对象返回另一个重载了operator->的对象时,可能会引发递归调用,直到获取到所需内容或出现错误。通过示例代码详细解释了这个过程。
摘要由CSDN通过智能技术生成

C++中箭头运算符重载的基本用法就不讲了,这里主要关注箭头运算符重载后,在使用时需要注意的细节问题。其中最重要的一个问题就是,如果我们在重载箭头运算符时返回了一个重载了箭头运算的对象,那么这个箭头指向运算将会一直进行下去,直到程序返回了所需的内容,或者是返回错误。

假设,point是一个指向类对象的指针或者是一个重载了 operator->的类的对象,则 point->mem的执行过程如下所示:

  1. 如果 point是指针,则应用内置的箭头运算符,表达式等价于 (*point).mem。也就是,首先解引用该指针,然后从所得的对象中获取指定的成员。如果 point所指的类型没有名为 mem的成员,则程序会发生错误。
  2. 如果 point是定义了 operator->的类的一个对象,则使用 point.operator->()的结果来获取 mem。若该结果是一个指针,则执行上述第 1步的流程;若该结果本身含有重载的 operator->(),则重复调用当前步骤。最终,当这一过程结束时程序或者返回了所需的内容,或者返回一些表示程序错误的信息。

为此,下面这个例子可以说明上述过程:

#include <iostream>

class D
{
public:
	void show(void) const { std::cout << "show D" << std::endl; }
};

class C
{
public:
	C() { obj = new D; }
	void show(void) { std::cout << "show C" << std::endl; }

	const D* operator->() const {
		return obj;
	}
private:
	D* obj;
};

class B
{
public:
	void show(void) { std::cout << "show B" << std::endl; }

	const C& operator->() const {
		return obj;
	}
private:
	C obj;
};

class A
{
public:
	void show(void) { std::cout << "show A" << std::endl; }

	const B& operator->() const {
		return obj;
	}
private:
	B obj;
};

int main(void)
{
	A a;
	a->show();

	return 0;
}

程序运行结果如下所示:

$ g++ -o main main.cpp 
$ ./main
show D

参考资料:

  1. C++ primer(第五版)中文版。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值