zoukankan      html  css  js  c++  java
  • C++题目一道: 重载`->': 您真的懂成员访问运算符的重载吗?

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

    要求:

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

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

    #include <stdio.h>
    
    class Test
    {
    };
    
    int main()
    {
            Test t(100);
    
            printf("%d
    ", *t.nData);
            printf("%d
    ", *t->nData);
            printf("%d
    ", *(*t).nData);
            printf("%d
    ", *(*t)->nData);
            printf("%d
    ", *(**t).nData);
            printf("%d
    ", *(**t)->nData);
            printf("%d
    ", *(***t).nData);
            printf("%d
    ", *(***t)->nData);
    
            return 0;
    }

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

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

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

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

    成员访问运算符重载

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

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

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

    第三个解决.

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

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

    于是还有一个重载:

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

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

    #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
    ", *t.nData);
        printf("%d
    ", *t->nData);
        printf("%d
    ", *(*t).nData);
        printf("%d
    ", *(*t)->nData);
        printf("%d
    ", *(**t).nData);
        printf("%d
    ", *(**t)->nData);
        printf("%d
    ", *(***t).nData);
        printf("%d
    ", *(***t)->nData);
    
        return 0;
    }
  • 相关阅读:
    Spring Boot(三):SpringBoot多模块(module)项目搭建
    Spring Boot(二):数据库操作
    Spring Boot(一):入门篇+前端访问后端
    Maven详解之仓库------本地仓库、远程仓库
    单例模式
    Spring常用注解
    初识Spring Bean
    SpringMVC常用注解
    Spring注解与否
    Maven入门
  • 原文地址:https://www.cnblogs.com/memset/p/overloading_member_access_operators.html
Copyright © 2011-2022 走看看