C++中的箭头

c++中“箭头(->)”和“点号(.)”操作符的区别 
****************************************************************


A *p则使用:p->play(); 左边是结构指针。
A p 则使用:p.paly(); 左边是结构变量。
总结:
箭头(->):左边必须为指针;
点号(.):左边必须为实体。






const 放在函数后表示的意思
*****************************************************


const 放在函数后表示这个函数是常成员函数, 常成员函数是不能改变成员变量值的函数。
const 限定符,它把一个对象转换成一个常量。
 说白一点就是不会改变对象中成员变量的数值。
### C++箭头运算符函数的定义和用法 箭头运算符(`->`)在 C++ 中用于访问指针所指向对象的成员。它也可以被重载以实现自定义行为,通常用于智能指针或代理类的设计。 #### 箭头运算符的基本用法 箭头运算符是减号(`-`)和大于符号(`>`)的组合,用于通过指针访问类、结构体或联合体的公共成员[^2]。例如: ```cpp struct Example { int value; }; int main() { Example* ptr = new Example(); ptr->value = 10; // 使用箭头运算符访问成员变量 delete ptr; return 0; } ``` #### 箭头运算符的重载 箭头运算符可以通过重载 `operator->()` 来实现自定义行为。当一个类重载了箭头运算符时,表达式 `obj->member` 的含义变为 `(obj.operator->())->member`[^4]。这意味着重载的箭头运算符必须返回一个指针,或者返回另一个重载了箭头运算符的对象。 以下是一个示例,展示如何重载箭头运算符: ```cpp #include <iostream> using namespace std; class B { public: void action() { cout << "Action in B" << endl; } }; class C { private: B* bPtr; public: C() : bPtr(new B()) {} ~C() { delete bPtr; } B* operator->() { return bPtr; // 返回指向 B 对象的指针 } }; int main() { C c; c->action(); // 调用 B 类的 action 方法 return 0; } ``` 在这个例子中,`C` 类重载了箭头运算符,返回一个指向 `B` 对象的指针。因此,`c->action()` 实际上等价于 `(c.operator->())->action()`[^3]。 #### 箭头运算符重载的递归调用 如果返回的对象本身也重载了箭头运算符,则会递归调用 `operator->()`,直到返回一个原始指针为止[^3]。例如: ```cpp class A { public: void action() { cout << "Action in A" << endl; } }; class B { private: A* aPtr; public: B() : aPtr(new A()) {} ~B() { delete aPtr; } A* operator->() { return aPtr; } }; class C { private: B* bPtr; public: C() : bPtr(new B()) {} ~C() { delete bPtr; } B* operator->() { return bPtr; } }; int main() { C c; c->action(); // 调用 A 类的 action 方法 return 0; } ``` 在这个例子中,`C` 的箭头运算符返回一个 `B` 对象的指针,而 `B` 的箭头运算符返回一个 `A` 对象的指针。最终,`c->action()` 调用了 `A` 类的 `action` 方法。 #### 注意事项 - 箭头运算符只能用于类类型,不能直接用于内置类型。 - 如果重载了箭头运算符,通常还需要重载解引用运算符(`operator*`),以便提供一致的行为。 - 在设计智能指针或代理类时,重载箭头运算符是一种常见的做法。 ### 示例代码 以下是一个完整的示例,展示了如何在智能指针中重载箭头运算符: ```cpp #include <iostream> using namespace std; class Resource { public: void useResource() { cout << "Using resource" << endl; } }; class SmartPointer { private: Resource* resource; public: SmartPointer() : resource(new Resource()) {} ~SmartPointer() { delete resource; } Resource* operator->() { return resource; // 返回资源指针 } }; int main() { SmartPointer sp; sp->useResource(); // 调用 Resource 的方法 return 0; } ``` 在这个例子中,`SmartPointer` 类重载了箭头运算符,使得可以通过智能指针访问 `Resource` 对象的方法。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值