积极答复者
关于C++类成员的一些疑惑

问题
-
现在我有一个类P,P中有属性a,b,c,我希望a,b,c对于其他类外的成员是可读的,但不是可写的。那么我的a,b,c应当是声明为PUBLIC还是PRIVATE?首先,声明为PUBLIC是否会失去了类的封装性?而且这样似乎不大安全,因为,其他成员可以修改P的实例的属性值。其次,声明为PRIVATE,我必须再写一个公共的函数例如P::getA(){return a;},以使得其他成员可以间接访问此属性,达到只读的目的。不知道这样写有什么不妥?其实,我想知道的是,一个类中的属性和方法,声明为公共、私有或保护的,有什么原则吗?(平时写代码,我是很随意的声明的。)还有,声明友元的坏处很大吗?是否应当尽量避免?谢谢。
努力学习C++
答案
-
对,如楼上所言,一个类的成员你要想让外部只读访问,最好把它设成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
-
你的问题其实是“访问器”的概念。正确的做法是这样的:
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
-
再补充一下,
对于获得只读的成员方法最好以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
-
你好!
关于一个类中的属性和方法,声明为公共、私有或保护类型的区别,我建议你找本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
全部回复
-
你的问题其实是“访问器”的概念。正确的做法是这样的:
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
-
对,如楼上所言,一个类的成员你要想让外部只读访问,最好把它设成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
-
再补充一下,
对于获得只读的成员方法最好以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
-
你好!
关于一个类中的属性和方法,声明为公共、私有或保护类型的区别,我建议你找本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