Get/Set函数和public成员变量
来源:互联网 发布:java soa esb 编辑:程序博客网 时间:2024/04/26 08:19
Get/Set函数和public成员变量
在我们设计类的时候,对于类的数据成员,我们可以有三种方法来让类外的函数或者其他类来访问,他们分别是:
- 把它设置成public数据成员
- 把要访问它的函数或者类设置为当前类的友元
- 创建一个set函数来修改该成员数据和一个get函数来读取这个成员。
三种方法各有优缺点。本文试图根据自己经验对三种方式进行分析。
公共数据成员
下面代码演示了一个公共的数据成员定义和使用的方法。
{
public:
int x;
};
void Bar()
{
CFoo foo;
foo.x = 1;
cout << foo.x << endl;
}
这种方法最大的好处是设计简单,你不需要做额外的工作,这个数据成员就可以直接被外部访问。
这种方法的缺点是,你无法控制其它函数或者类对它的访问。这种不可控的方法在一些特殊的情况下会导致问题。假定你设计如下一个圆类:
{
public:
double m_radius;//半径
double area(){return pi*m_radius * m_radius;};
};
在设计之初,你对圆类的要求非常低,因此上面的代码没有问题。但是后来在计算过程中,你发现计算面积的过程频繁的被调用,因此你打算在圆类内部记录它的面积,因此修改代码如下:
{
public:
double m_radius;
double m_area;
void SetRadius(double r){ m_radius =r; m_area = pi*r *r;}
};
考虑你是一个圆类的用户,你可能写出如下代码:
{
cout >> c.m_radiius;
}
当圆类被修改后,上面这段代码可能会忘记做合理的修改,这样,m_radius被修改了,而m_area没有被修改,这就导致了对象自身的数据错误。这种错误可能花你几个月的时间去找到原因。
2. Get/Set函数
为了解决上面的问题,我们可以考虑修改类定义,提供一对Get/Set函数来访问数据成员。修改的类可能如下:
private:
double m_radius;//半径
public:
double GetRadius()const{return m_radius;}; //注意这里的cost,因为Get函数一般不需要修改对象自身
void SetRadius(double r)
{
m_radius = r;
m_area = pi * r * r;
};
double GetArea()const{return m_area;};
CCircle(double r){SetRadius(r);};
};
注意除了Set和Get函数之外,我还增加了一个构造函数。这是因为当你把radius设置为private之后,实际上类外已经无法初始化他,因此需要加一个构造函数来初始化它。
当你想增加功能,统计所有实例中半径最大的圆的半径时,这样的设计就可以凸现出其好处。对于普通的CCircle类的客户而言,你不需要做任何修改。你要修改的只是SetRadius一个函数而已。
这种方法的缺点是你需要做更多的代码工作。当类的成员很多时,这种缺点有时还是很明显的。
友元函数
友元是上述两种方式的折中,通过增加一个友元函数,外部函数或者类可以直接访问所有的成员。这样做的好处是代码量小,你需要维护圆类和一小组访问圆类的函数。但是需要注意的是,你的友元类能访问你的类中的一切,包括有时你不想暴露给其他函数的成员。
- Get/Set函数和public成员变量
- Get/Set函数和public成员变量
- 类中使用get和set方法来控制成员变量,而不将成员变量的权限设为public的原因?
- c++宏实现成员变量的定义和Get,Set
- 成员变量的get,set好处
- Swift 成员变量的get/set
- 慎重使用Get/Set成员函数(二)Set函数和其他修改函数的替代办法
- c++ public, protected, private成员变量,成员函数继承和访问规则实例代码
- public protected private 成员函数和成员变量在public protected private 继承后访问权限问题
- public protected private 成员函数和成员变量在public protected private 继承后访问权限问题
- 仿照cocos2d-x制作的get&set成员变量开关函数
- python的 public 、private成员变量、成员函数总结
- OC语言学习 (三) 成员变量get/set方法和“.”语法,@proterty和@synthesize关键字
- OC语言学习 (三) 成员变量get/set方法和“.”语法,@proterty和@synthesize关键字
- 【Objective-C】04-OC对象成员变量的封装规范:get方法和set方法
- 黑马程序员--set get点语法 和 成员变量的作用域
- Android studio 成员变量的前缀带有m,get和set方法希望不带m
- OC 成员变量自动生成get set方法
- 美国Web2.0展会评出六大新网站
- Oracle10g 自动工作负载信息库
- 对话框 doModal 后自动执行某个任务
- 感受杭州湾跨海大桥
- asp.net如何取得纯客户端控件的值
- Get/Set函数和public成员变量
- Asterisk的配置文档
- Asterisk的配置文档
- 中国著名黑客你知道多少?
- PopUp特效
- Asterisk HOME IP PBX架設經驗分享談
- PHP是编程语言学习的第一个最佳选择吗 ?
- VC++MFC中的定时器使用方法
- struct 变量 实例转换成byte [] 类型