关于std::shared_ptr同时使用->与.运算符的原理疑问
嗨,这个问题问得特别到位!其实你只要搞清楚std::shared_ptr的本质,这个困惑就迎刃而解啦——它不是原生指针,而是一个C++标准库提供的模板类实例对象!
咱们拆开来说两种运算符的用法:
- 用
.的时候:比如u.use_count(),这里的.是在调用shared_ptr这个类自己的成员函数。use_count()是shared_ptr内置的方法,专门用来返回当前它托管的对象被多少个智能指针共享(也就是引用计数),所以既然u是一个类对象,调用它自己的成员自然要用.运算符。 - 用
->的时候:比如u->data,这个->是shared_ptr类特意重载的运算符。它的作用是帮你拿到u内部托管的那个原生指针(也就是指向test对象的指针),然后用这个原生指针去访问test类的data成员。简单说,u->data等价于(*u).data——因为shared_ptr还重载了*运算符,解引用后就能得到它托管的test对象,再用.访问对象成员,而->就是这个操作的语法糖,让它用起来更像原生指针。
回到你的代码里,u是std::shared_ptr<test>类型的对象,所以它既有自己的成员函数(比如use_count()),又通过重载运算符模拟了原生指针的行为(支持->访问托管对象的成员),这就是同一个变量能同时用两种运算符的核心原因啦!
备注:内容来源于stack exchange,提问作者RaHuL
相关产品推荐
相关产品推荐

