c++ 重载->

本文解析了C++中通过指针与直接对象访问成员的区别。介绍了如何使用箭头操作符来调用成员函数,并解释了其在不同上下文中的含义。同时,通过实例说明了内置指针类型和类类型下操作符->的不同行为。

-> 平时是对指针对象的基本操作。

A* a = new A();

a->do_something();

直接就可以调用类内部函数。

而如果:

A a;//a直接为对象时

a->func();//这个又是怎样的呢

 

这是由 C++ 标准规定的,对于a->mem根据a类型的不同,操作符->的解释也不同:

  • 当a的类型是内置指针类型时,等价于(*a).mem

  • 当a的类型是类时,等价于a.operator->()->mem

而为啥A a;

这种时候需要用到a->呢,看看auto_ptr的源码你就明白啦。

 

C++ 中,重载箭头运算符 `->` 实际上是重载了 `*` 运算符和 `->` 运算符。其中 `*` 运算符返回一个指向对象的指针,而 `->` 运算符用于访问该指针所指向对象的成员。因此,我们可以通过重载 `*` 运算符来返回一个自定义的指针类型,并重载 `->` 运算符来访问该指针所指向对象的成员。 以下是一个示例代码: ```c++ class MyClass { public: void func() { cout << "Hello, world!" << endl; } }; class MyPointer { private: MyClass* ptr; public: MyPointer(MyClass* p = nullptr) : ptr(p) {} MyClass* operator->() { return ptr; } }; class MyClassWrapper { private: MyClass obj; public: MyPointer operator->() { return MyPointer(&obj); } }; int main() { MyClassWrapper wrapper; wrapper->func(); // 输出 "Hello, world!" return 0; } ``` 在上面的代码中,我们首先定义了一个 `MyClass` 类,其中有一个成员函数 `func()`。然后,我们定义了一个 `MyPointer` 类,它包装了一个指向 `MyClass` 对象的指针,并重载了 `->` 运算符。在 `operator->()` 函数中,我们返回了一个指向 `MyClass` 对象的指针。最后,我们定义了一个 `MyClassWrapper` 类,它包装了一个 `MyClass` 对象,并重载了 `->` 运算符,返回一个 `MyPointer` 对象。 在 `main()` 函数中,我们创建了一个 `MyClassWrapper` 对象 `wrapper`,并通过 `wrapper->func()` 调用了 `MyClass` 对象的成员函数。由于 `MyClassWrapper` 对象重载了 `->` 运算符,因此调用 `wrapper->` 实际上会调用 `MyPointer` 对象的 `operator->()` 函数,该函数返回一个指向 `MyClass` 对象的指针,然后我们就可以通过该指针访问 `MyClass` 对象的成员函数了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值