箭头操作符及重载箭头操作符

文章详细阐述了C++中点运算符和箭头运算符的使用规则,包括点运算符只能用于类类型对象访问成员,箭头运算符的简写形式以及如何重载箭头运算符。通过示例展示了类层次结构中成员访问的动态绑定特性,强调了对virtual函数的理解和使用。
摘要由CSDN通过智能技术生成

1、点运算符只能用于类类型的对象,左侧运算对象必须是类类型的对象,右侧运算对象必须是该类型的一个成员名

LocalFrame* GetFrame() const { return frame_.Get(); }
Member<LocalFrame> frame_;

frame_.Get 调用的是Member的Get

2、ptr->mem等价于(*ptr).mem
为简化上述表达式,C++引入->,将解引用与成员访问结合在一起

3、重载箭头运算符
对于形如point->mem的表达式来说,point必须要么是指针(指向类对象),要么是对象(重载了operator->)。
根据point类型不同,point->mem等价于
a)(*point).mem;                  //point是一个类对象指针
b)point.opreator()->mem;   //point是类的一个对象

4、对于重载箭头运算符返回值的约束
必须返回类类型的指针或重载了operator->()的类类型对象
a)返回类型是指针,则内置箭头操作符可用于该指针,编译器对该指针解引用并且从结果对象获取指定成员。
若被指类型没有定义该成员,则编译器报错
b)返回类型是类类型的对象(或这种对象的引用),则递归应用该对象的operator->。
编译器检查返回对象所属类型是否重载了箭头操作符,若有,应用该操作符,直到返回一个指向带有指定成员的对象的指针,否则,编译器报错

class A {
public:
	void action() {
		cout << "Action in class A" << endl;
	}
};

class B {
public:
	A* operator->() {
		return &a;
	}
	void action() {
		cout << "Action in class B" << endl;
	}
private:
	A a;
};

class C {
public:
	B& operator->() {
		return b;
	}
	void action() {
		cout << "Action in class C" << endl;
	}
private:
	B b;
};

int main() {
	C c;
	C* pc = &c;
	c->action();  //Action in class A	
	pc->action(); //Action in class C
	return 0;
}


///
///

WebViewImpl* WebFrameWidgetImpl::View() const {
  return local_root_->ViewImpl();
}
Member<WebLocalFrameImpl> local_root_;
第一步 肯定是调用Member::operator->() 得到WebLocalFrameImpl*
第二步  就看这WebLocalFrameImpl::ViewImpl()是不是virtual了

Type* p; 
p->f();
首先要看下f是否是virtual 如果是non virtual 那就是Type::f
如果是virtual 你要看p实际的类型 ,他可能是Type的子类 也可能是Type本身
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值