首页 > 编程语言 > 详细

C++题目一道: 您真的懂成员访问运算符的重载吗?

时间:2014-04-03 08:39:28      阅读:560      评论:0      收藏:0      [点我收藏+]

原题目在这里: http://hi.baidu.com/shilyx/item/672736e14a14a90c64db003a

要求:

//给出类Test的定义和实现,使程序编译通过,

//并且main函数中的输出语句输出8个100。

bubuko.com,布布扣
#include <stdio.h>

class Test
{
};

int main()
{
        Test t(100);

        printf("%d\n", *t.nData);
        printf("%d\n", *t->nData);
        printf("%d\n", *(*t).nData);
        printf("%d\n", *(*t)->nData);
        printf("%d\n", *(**t).nData);
        printf("%d\n", *(**t)->nData);
        printf("%d\n", *(***t).nData);
        printf("%d\n", *(***t)->nData);

        return 0;
}
bubuko.com,布布扣

 

看第一个 *t.nData, 很容易知道, nData应该为plublic成员变量, 定义为 int* nData;

再看第二个, *t->nData; 咦, t不是指针却使用了->指针运算符, 说明->是一个被重载了的运算符. 所以要重载->.

哇, 重载->, 是不是你从来没有做过这样的事情? 嗯, 我也没做过, +-*/我都会重载, 这个还真不会. 于是Google了一下,

在 StackOverflow 上面找到了答案 (http://stackoverflow.com/questions/8777845/overloading-member-access-operators-c)

bubuko.com,布布扣

指针运算符的重载不是那么好理解, 作者也举例说明了,  我就不说了, 记录一下而已. 以不至于那么生疏...

回到第三个 *t->nData; 于是重载->:

        const Test* operator->() const {return this;}

第三个解决.

 

再来看第三个, 第四个, 从第三四个开始, 后面的都一样了:

第三个是  *(*t).nData; 和第一个差不多, 只是一个一个*解引用, 但结果依然是对象本身, 从小数点可以看出. 因为小数点操作符不可以被重载.

于是还有一个重载:

        const Test& operator*() const {return *this;}

 

好了, 结束, 整个代码如下:

bubuko.com,布布扣
#include <stdio.h>

class Test
{
    //给出类Test的定义和实现,使程序编译通过,
    //并且main函数中的输出语句输出8个100。
    // 
public:
    Test(int n):
        nData(&m_nData)
    {
        *nData = n;
    }

    int* nData;
    
    const Test* operator->() const {return this;}
    const Test& operator*() const {return *this;}

private:
    int m_nData;
};

int main()
{
    Test t(100);

    printf("%d\n", *t.nData);
    printf("%d\n", *t->nData);
    printf("%d\n", *(*t).nData);
    printf("%d\n", *(*t)->nData);
    printf("%d\n", *(**t).nData);
    printf("%d\n", *(**t)->nData);
    printf("%d\n", *(***t).nData);
    printf("%d\n", *(***t)->nData);

    return 0;
}
bubuko.com,布布扣

C++题目一道: 您真的懂成员访问运算符的重载吗?,布布扣,bubuko.com

C++题目一道: 您真的懂成员访问运算符的重载吗?

原文:http://www.cnblogs.com/memset/p/overloading_member_access_operators.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!