大家来讨论下protect, private和public的用处吧

vipcxj 2014-01-10 11:57:51
我先来说一个,可以控制类继承时子类的访问权限。其他我还真不知道有什么意义~
声明为private,然后用getter和setter访问的好处都有啥?其实我觉得全部public貌似也没啥问题吧,C语言里只有struct,也没见出什么问题~
...全文
433 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2014-01-13
  • 打赏
  • 举报
回复
引用 10 楼 vipcxj 的回复:

struct RTPoint;

struct Point
{
   ...
}

struct XYPoint : Point
{
   double x, y;
   translate(const RTPoint &);
   ...
}

struct RTPoint : Point
{
   double r, t;
   translate(const XYPoint &);
   ...
}
暂时先不考虑哪些该public,哪些该private,所以先用struct 我认为硬是将两个不同坐标系凑在一起是没有必要滴~ 既然要用面向对象,干脆弄个基类Point,把他们联系起来就是了
首先,这个不是我想出来的,是某OO大牛为了举例信息隐藏而做的例子。 在他看来,不同的坐标系都是点的属性;所以结论是,不同的人就有不同的OO的理解。
max_min_ 2014-01-13
  • 打赏
  • 举报
回复
我记不太清楚 是 effective c++ 还是深入探讨c++对象模型里面有说的比较清楚了! 楼主翻翻吧!这两本书都比较好
derekrose 2014-01-11
  • 打赏
  • 举报
回复
ps 是个好问题 赞一个
derekrose 2014-01-11
  • 打赏
  • 举报
回复
是为了适应面向对象的需求,达到封装的目的。 对封装的理解需要大量的经验,gettet和setter里面可能包括更多被组建好的逻辑,大部分时候并不是一个return而已
Boki 2014-01-11
  • 打赏
  • 举报
回复
geter/seter不是简单的取值赋值,虽然通常都这么用. 比如复制前你要判断赋值是否符合要求,比如对应的是个int类的除数,set可以预检测是否为零,然后适当报错等等; 比如网络编程中获取一个从浏览器传来的数据,可以在get前转码成正确的格式,避免乱码; 至于private有什么好处嘛,我想说一个堪比超级计算机的大脑可以完全使用public来设计程序.为什么呢?因为他(或许应该用"它")清楚地知道他程序里的每一条语句,每一行代码,无穷小的时间内就知道修改一个变量会给程序造成怎样的后果或者联锁反应. 但是正常人需要private,因为人脑无法避免很多错误. 比如有些变量在某些步骤下不应该被改变,比如你调用了一个外部类,获取了路径,然后在本类需要用到这个路径前不小心改了,然后一调用,自然出错.有些细小的恶意赋值甚至复杂得找几天才找出来. 另外你的程序给别人用时,总不至于全部设置成public吧?如果你有从网上下控件或第三方类库的经历,会发现你只能用控件开发商提供的接口函数,因为有些控件处理的是处理高等函数的,你不可能知道他们所有的算法规则.但是如果你的程序不小心改变了这些高深的算式的参数(你不可能永远不出错),严重者程序奔溃.特别是这些类库用的函数/变量名很普遍的时候更易出错,比如name这个变量谁都可能用. 我想可以理解为,private是避免设计过程中出现的这类可怕错误而给出的修饰符,这是一个类似书签一样的东西,可以不用(真的可以,一个设计好了并检查得绝对无错的程序,甚至可以全部改成public),但是要知道,设计程序的是人自己!即使你不出错,你的程序使用者也会出错,盯上你的黑客也会有机可趁(想到类似"反射"这种技术就叫人不安). 想到一句编程领域的名言:"All input is evil". 唉,我真得睡觉了,就这些吧.
threenewbee 2014-01-11
  • 打赏
  • 举报
回复
引用 4 楼 vipcxj 的回复:
[quote=引用 3 楼 caozhy 的回复:] [quote=引用 2 楼 vipcxj 的回复:] 那既然private了就干脆不让访问,但大多数做法是既提高getter,又提高setter,这和直接public有何区别?
定义成getter和setter,可以在不改动接口的前提下修改其内部实现,比如说前置/后置的检查,比如允许在线程安全的情况下并发访问字段,比如将getter变成懒惰加载模式。还是我说的,当你遇到团队协作开发的时候,你才能体会到这样做的意义。[/quote] 貌似有点道理,不过我也听说各种面向对象语言的内置实现getter和setter炒得蛮火热的,如果真内置实现了,不是和你说的冲突了,内置实现的getter和setter可不具备你说的那些功能。而且这不怕getter和setter被滥用吗?[/quote] 什么冲突? 比如C#支持属性,允许你像定义字段那样写属性访问器,这和你的理解不同,它并不是代替你写getter/setter方法,只是将它们的写法简化。
vipcxj 2014-01-11
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
[quote=引用 2 楼 vipcxj 的回复:] 那既然private了就干脆不让访问,但大多数做法是既提高getter,又提高setter,这和直接public有何区别?
定义成getter和setter,可以在不改动接口的前提下修改其内部实现,比如说前置/后置的检查,比如允许在线程安全的情况下并发访问字段,比如将getter变成懒惰加载模式。还是我说的,当你遇到团队协作开发的时候,你才能体会到这样做的意义。[/quote] 貌似有点道理,不过我也听说各种面向对象语言的内置实现getter和setter炒得蛮火热的,如果真内置实现了,不是和你说的冲突了,内置实现的getter和setter可不具备你说的那些功能。而且这不怕getter和setter被滥用吗?
threenewbee 2014-01-11
  • 打赏
  • 举报
回复
引用 2 楼 vipcxj 的回复:
那既然private了就干脆不让访问,但大多数做法是既提高getter,又提高setter,这和直接public有何区别?
定义成getter和setter,可以在不改动接口的前提下修改其内部实现,比如说前置/后置的检查,比如允许在线程安全的情况下并发访问字段,比如将getter变成懒惰加载模式。还是我说的,当你遇到团队协作开发的时候,你才能体会到这样做的意义。
vipcxj 2014-01-11
  • 打赏
  • 举报
回复
那既然private了就干脆不让访问,但大多数做法是既提高getter,又提高setter,这和直接public有何区别?
threenewbee 2014-01-11
  • 打赏
  • 举报
回复
要想理解这个问题,你得有一个项目,这个项目有不只你一个开发者。只要有这样的经历,就能理解了。 当你的项目的代码不全是你写的时候,你面对别人的代码,你希望它的接口越简单越好。好比你买一个电脑,你希望买来的电脑是一块裸露的电路板,上面有无数的跳线和开关,它们有的有特殊的功能,有的还很危险,操作不当就会引发事故么。
vipcxj 2014-01-11
  • 打赏
  • 举报
回复
引用 9 楼 ForestDB 的回复:
举个例子: 二维平面中的一个点既可以用笛卡尔坐标系(x, y)来表示,也可以用极坐标系(r, theta)来表示。 作为一个好的Point的OO的封装,使用者是不应该知道内部的数据细节(private部分),而是只知道接口(public部分): double getX(); double getY(); double getR(); double getTheta(); double setXAndY(double x, double y); double setRAndTheta(double r, double theta); 如果是LZ,如何来设计这个Point类?

struct RTPoint;

struct Point
{
   ...
}

struct XYPoint : Point
{
   double x, y;
   translate(const RTPoint &);
   ...
}

struct RTPoint : Point
{
   double r, t;
   translate(const XYPoint &);
   ...
}
暂时先不考虑哪些该public,哪些该private,所以先用struct 我认为硬是将两个不同坐标系凑在一起是没有必要滴~ 既然要用面向对象,干脆弄个基类Point,把他们联系起来就是了
ForestDB 2014-01-11
  • 打赏
  • 举报
回复
举个例子: 二维平面中的一个点既可以用笛卡尔坐标系(x, y)来表示,也可以用极坐标系(r, theta)来表示。 作为一个好的Point的OO的封装,使用者是不应该知道内部的数据细节(private部分),而是只知道接口(public部分): double getX(); double getY(); double getR(); double getTheta(); double setXAndY(double x, double y); double setRAndTheta(double r, double theta); 如果是LZ,如何来设计这个Point类?

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧