none
关于C++类成员的一些疑惑 RRS feed

  • 问题

  • 现在我有一个类P,P中有属性a,b,c,我希望a,b,c对于其他类外的成员是可读的,但不是可写的。
    那么我的a,b,c应当是声明为PUBLIC还是PRIVATE?
    首先,声明为PUBLIC是否会失去了类的封装性?而且这样似乎不大安全,因为,其他成员可以修改P的实例的属性值。
    其次,声明为PRIVATE,我必须再写一个公共的函数例如P::getA(){return a;},以使得其他成员可以间接访问此属性,达到只读的目的。不知道这样写有什么不妥?

    其实,我想知道的是,一个类中的属性和方法,声明为公共、私有或保护的,有什么原则吗?(平时写代码,我是很随意的声明的。)还有,声明友元的坏处很大吗?是否应当尽量避免?谢谢。

    努力学习C++
    2010年2月9日 8:22

答案

  • 对,如楼上所言,一个类的成员你要想让外部只读访问,最好把它设成private类型,然后建立一个函数返回它。

    补充一点
    类似于
    class XXXX
    {
    public:
        char* GetOutput(){return m_szOutput;}
        const char* GetOutputC(){return m_szOutput;}

    private:
        char m_szOutput[0x10];
    }

    如果你要是用GetOutput获取的指针还是可以修改m_szOutput的,但是GetOutputC就不会了:)


    0xBAADF00D
    • 已标记为答案 Nancy Shao 2010年2月16日 2:26
    2010年2月9日 12:32
    版主
  • 你的问题其实是“访问器”的概念。正确的做法是这样的:
    class P
    {
    private:
        int a;
        int b;
        int c;
    // 访问器声明
    public:
        int GetAValue(void){return a;}
        int GetBValue(void){return b;}
        int GetCValue(void){return c;}
    }

    严格的说,类的数据成员都应该声明为私有的。外界访问数据应通过Accessor (访问器) 来实现。也就是上面代码中GetxxxValue, 如果需要改写数据成员,应给对应的私有数据成员添加一个SetxxxValue 方法。GetValue 和 SetValue 都是访问器, 一些纯面向对象的高级语言,如Java C# 都是通过访问器对私有数据成员进行封装的。




    • 已标记为答案 Nancy Shao 2010年2月16日 2:26
    2010年2月9日 8:31
    版主
  • 再补充一下,
    对于获得只读的成员方法最好以const来修饰。以保证不会修改成员变量。
    借用Michael Lee2的代码
    class P
    {
    private:
        int a;
        int b;
        int c;
    // 访问器声明
    public:
        int GetAValue(void) const {return a;}
        int GetBValue(void) const {return b;}
        int GetCValue(void) const {return c;}
    }


    麻烦把正确答案设为解答。
    • 已标记为答案 Nancy Shao 2010年2月16日 2:26
    2010年2月10日 1:12
    版主
  • 你好!

    关于一个类中的属性和方法,声明为公共、私有或保护类型的区别,我建议你找本C++的书看一下,上面有很详细的说明。在这里简要的概括如下:

    pubulic:所有任何外部函数都可以访问公有数据成员和函数成员;

    private:只允许本类的成员函数可以访问,而类外部的任何函数都不能访问。

    protected:和private 类似,但是在派生类中能访问。

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 Nancy Shao 2010年2月16日 2:26
    2010年2月10日 9:43

全部回复

  • 你的问题其实是“访问器”的概念。正确的做法是这样的:
    class P
    {
    private:
        int a;
        int b;
        int c;
    // 访问器声明
    public:
        int GetAValue(void){return a;}
        int GetBValue(void){return b;}
        int GetCValue(void){return c;}
    }

    严格的说,类的数据成员都应该声明为私有的。外界访问数据应通过Accessor (访问器) 来实现。也就是上面代码中GetxxxValue, 如果需要改写数据成员,应给对应的私有数据成员添加一个SetxxxValue 方法。GetValue 和 SetValue 都是访问器, 一些纯面向对象的高级语言,如Java C# 都是通过访问器对私有数据成员进行封装的。




    • 已标记为答案 Nancy Shao 2010年2月16日 2:26
    2010年2月9日 8:31
    版主
  • 对,如楼上所言,一个类的成员你要想让外部只读访问,最好把它设成private类型,然后建立一个函数返回它。

    补充一点
    类似于
    class XXXX
    {
    public:
        char* GetOutput(){return m_szOutput;}
        const char* GetOutputC(){return m_szOutput;}

    private:
        char m_szOutput[0x10];
    }

    如果你要是用GetOutput获取的指针还是可以修改m_szOutput的,但是GetOutputC就不会了:)


    0xBAADF00D
    • 已标记为答案 Nancy Shao 2010年2月16日 2:26
    2010年2月9日 12:32
    版主
  • 呵呵, 我忘了说到const 的事情了。
    2010年2月9日 12:50
    版主
  • 再补充一下,
    对于获得只读的成员方法最好以const来修饰。以保证不会修改成员变量。
    借用Michael Lee2的代码
    class P
    {
    private:
        int a;
        int b;
        int c;
    // 访问器声明
    public:
        int GetAValue(void) const {return a;}
        int GetBValue(void) const {return b;}
        int GetCValue(void) const {return c;}
    }


    麻烦把正确答案设为解答。
    • 已标记为答案 Nancy Shao 2010年2月16日 2:26
    2010年2月10日 1:12
    版主
  • 你好!

    关于一个类中的属性和方法,声明为公共、私有或保护类型的区别,我建议你找本C++的书看一下,上面有很详细的说明。在这里简要的概括如下:

    pubulic:所有任何外部函数都可以访问公有数据成员和函数成员;

    private:只允许本类的成员函数可以访问,而类外部的任何函数都不能访问。

    protected:和private 类似,但是在派生类中能访问。

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 Nancy Shao 2010年2月16日 2:26
    2010年2月10日 9:43