C++智能指针

umbrook 2008-09-02 09:50:49
各位好:
T& operator*() { assert(m_pI != NULL) ; return *m_pI ;}
T** operator&() { assert(m_pI == NULL) ; return &m_pI ;}
T* operator->() { assert(m_pI != NULL) ; return m_pI ;}
我知道这3句话是模板的操作符重载,
那为什么第一句话的T后面跟了一个&号呢?
第二句话的T后面跟了两个*号呢?
第三局话的T后面跟了一个*号呢?

和后面的成员指针变量有关系,或者说指针的操作符重载就是这种固定的格式?
有哪个高手能帮忙解答么?谢谢。分不多,尽量给。
...全文
315 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuwanglove 2008-09-20
  • 打赏
  • 举报
回复
T 近回T类型对象
T& 返回一个引用对象
T** 返回T的地址 //T要是一个指针
T* 返回T的值 //T要是一个指针
xgchaohao 2008-09-20
  • 打赏
  • 举报
回复
别老LZLZ的说好不好
要是会的话还用得着来这发贴吗
kusey 2008-09-12
  • 打赏
  • 举报
回复
复杂!
jieao111 2008-09-04
  • 打赏
  • 举报
回复
我感觉lz先把基础弄好,再看模板和stl
zhang_zhen12 2008-09-04
  • 打赏
  • 举报
回复
T& operator*() { assert(m_pI != NULL) ; return *m_pI ;}
T** operator&() { assert(m_pI == NULL) ; return &m_pI ;}
T* operator->() { assert(m_pI != NULL) ; return m_pI ;}
我知道这3句话是模板的操作符重载,
那为什么第一句话的T后面跟了一个&号呢?
第二句话的T后面跟了两个*号呢?
第三局话的T后面跟了一个*号呢?
我知道他们返回的值的含义,我问的是T后面为什么要跟&号,2个星号,1个星号。


因为返回值要作为一个左值使用 所以返回引用
因为是返回指针的地址
因为m_pi本身就是地址 所以返回值是T*
tsst 2008-09-02
  • 打赏
  • 举报
回复
前面的T&和T**,T*就是接收类型,应该跟return相对应,也就是说,return *m_PI,返回一个值,那接收者也应该是一个值或者引用,所以用T&,而return &m_PI,返回了一个指针的引用,类似于指针的指针,所以用T**接收,而最后一个就是返回一指针,所以用T*接收!

呵呵!
yuwei2589 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 umbrook 的回复:]
这么说的话,那我直接去掉后面的符号好了了。问题是编译肯定不通过。
我想弄明白后面为什么要加那些东西。
T operator*() { assert(m_pI != NULL) ; return *m_pI ;}
T operator&() { assert(m_pI == NULL) ; return &m_pI ;}
T operator->() { assert(m_pI != NULL) ; return m_pI ;}
[/Quote]

你要这样做,编译器也不会报错,只不过会把T(比如说m_pI为int指针)
<1>T解释为int
<2>T解释为int **
<3>T解释为int*
umbrook 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Kasmile 的回复:]
引用 3 楼 umbrook 的回复:
我知道他们返回的值的含义,我问的是T后面为什么要跟&号,2个星号,1个星号。


都知道返回值了。。。还问。。。= =
[/Quote]
这么说的话,那我直接去掉后面的符号好了了。问题是编译肯定不通过。
我想弄明白后面为什么要加那些东西。
T operator*() { assert(m_pI != NULL) ; return *m_pI ;}
T operator&() { assert(m_pI == NULL) ; return &m_pI ;}
T operator->() { assert(m_pI != NULL) ; return m_pI ;}
Kasmile 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 umbrook 的回复:]
我知道他们返回的值的含义,我问的是T后面为什么要跟&号,2个星号,1个星号。
[/Quote]

都知道返回值了。。。还问。。。= =
umbrook 2008-09-02
  • 打赏
  • 举报
回复
我知道他们返回的值的含义,我问的是T后面为什么要跟&号,2个星号,1个星号。
冷月清晖 2008-09-02
  • 打赏
  • 举报
回复
T& operator*() { assert(m_pI != NULL) ; return *m_pI ;} //返回指针指向的值
T** operator&() { assert(m_pI == NULL) ; return &m_pI ;} //指针的地址
T* operator->() { assert(m_pI != NULL) ; return m_pI ;} //指针的值
冷月清晖 2008-09-02
  • 打赏
  • 举报
回复
m_pI 是 指针
ysuliu 2008-09-02
  • 打赏
  • 举报
回复
T后面的&,**,*都是跟T连在一起理解的:

T& 就是返回指针指向的值
T** 就是返回一个指针的地址
T* 就是返回一个指针

都是指函数的返回值类型,你看那几个实现的return 也能看出来啊。
这个不能说是固定格式,只能说是一般情况下会这么用,特殊情况也会有特殊用法~~

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧