返回类型为T*与T&的区别:智能指针框架函数疑问
关于智能指针中
getPtr()和operator*()的疑问解答 你对Example 1的理解是准确的:getPtr()直接返回内部存储的原生指针ptr,调用方可以用另一个指针变量接收这个地址,以此直接操作底层的原生指针。
重点说Example 2的operator*():
- 你之前的误区在于,
*ptr不是“取出ptr指向的值”(这里的“取出”如果理解成拷贝值就错了)。*ptr本质上就是ptr指向的实际对象本身——比如你说的变量x,*ptr就是x,不是x的拷贝,也不是x的地址。 - 返回
T&(引用类型),就是返回这个实际对象的引用,相当于给x起了一个别名。这样调用方可以直接通过这个引用修改原对象,比如写*my_smart_ptr = 10;,就会直接把x的值改成10,和原生指针*raw_ptr = 10;的行为完全一致——这正是智能指针要模拟原生指针操作逻辑的设计目的。 - 举个直观的原生指针例子对照:
智能指针的int x = 5; int* raw_ptr = &x; int& ref = *raw_ptr; // *raw_ptr就是x本身,ref是x的引用 ref = 10; // 此时x的值会变成10operator*()做的就是上面第二行的事,返回的是指向对象的引用,既不是地址,也不是值拷贝。 - 如果改成返回
T(值类型),那调用*my_smart_ptr得到的是原对象的拷贝,修改这个拷贝不会影响原对象,这就违背了智能指针模拟原生指针的初衷。
内容的提问来源于stack exchange,提问作者Prakash GiBBs
相关产品推荐
相关产品推荐

