免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 864 | 回复: 0
打印 上一主题 下一主题

何时使用指向类成员的指针 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-31 15:17 |只看该作者 |倒序浏览
许多程序员都推荐你只要有可能就用引用来取代指针。例如,当函数通过引用(const或者非const型)来获取参数比实现用指针作为参数的同样功能的函数要简单许多。同样的还有读取函数——掌握它简单多了。

然而,当你开发非算符类(non-functor class)类时,相对于引用,你会更喜欢使用指针。当你面对使用引用成员变量还是指向成员变量的指针时,你一般选择指针。

如果你的类包含了一个或者一个以上引用,那么就无法为它实现一个默认构造函数。还有,编译器也无法实现默认的运算符“=”;如果你希望定义运算符“=”,你不得不采取某些技巧。由于你会经常碰到诸如“a=b”的情况,这就可能导致问题的出现。

请考虑下面的类:


structCTest
{
    int & m_n;
};

上面的代码不会编译成功,因为它不能产生默认的构造函数或者说初始化引用。我们把它修改成:

structCTest
{
    CTest( int & n)
        : m_n( n)
    {}
    int & m_n;
};

int main()
{
    inti;
    CTest a( i), b( i);
    //错误!由于*this,编译器不能产生默认运算符“=”,
    //你不能引用‘m_n’到
    //其它对象上
    a = b;
}
为了可以编译“a=b”,我们不得不再次修改代码:

#include <new>;

structCTest
{
    CTest( int & n)
        : m_n( n)
    {}
    CTest & operator=( const CTest & other)
    {
        CTest * pThis = this;
        pThis->;~CTest();
        new(pThis) CTest( other);
    }
    int & m_n;
};

int main()
{
    inti, j;
    CTest a( i), b( j);
    // 现在,下面一行代码可以正常工作了
    a = b;
}

Class CTest could be written much easier:

structCTest
{
    CTest( int & n)
        : m_pN( &n)
    {}
    CTest()
        : m_pN( NULL)
    {}
//   ……如果需要,你的代码还应该有:
//    void reset( int & n)
//    { m_pN = &amp; }
    int * m_pN;
};

int main()
{
    inti, j;
    CTest a( i), b;
    b = a;
}

你应该注意到上面的规则并不适合算符类。这是因为算符总是拷贝构造(copy-constructed);当然,也就不需要运算符“=”了。如果算符内部有引用的话,那么你就需要设计一个自定义构造函数来初始化引用,而且你不需要默认构造函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP