c++中private的用处

我知道我们可以用 public 中的值,把private中的数据给提出来,但是还是搞不懂private该怎么用,或者说在一个具体程序中,private有什么用。
public:
void setname(string x){
name =x;
}
string getname(){
return name;
}

private:
string name;

};

int main(){
fruits ob;
ob.setname("you are apples");
cout << ob.getname() <<endl;

system("pause");
return 0;
}
比如说这个编码,我就很不理解这样提取name出来到底有什么意思,有什么用。希望哪个大神编个程序用private的给我讲解下,他的用处到底在哪里,谢谢大家了 我困惑好久了额%>_<%

这是面向对象编程中的东西。首先你要有一个类的概念,如果没有类的概念,就不会知道为什么需要private、protected和public。类首先是一种抽象,是一个定义。比如说人类就是一个抽象的定义,具体到我们每个人就是这个类的对象。虽然你我都属于人类,但可能我们姓名不同,性别不同,年龄也不同,因此类需要有属性。除了属性,类还需要有方法,类的方法是这个类对外所提供的交互接口。例如人类可以对外提供走路、说话、吃饭等方法。类的属性通常会声明为private,也就是私有的,然后提供一个公有的方法来访问它。你不理解的其实就是这里,不知道为何要“多此一举”,直接将属性声明为public,直接访问不就可以了吗?其实,从程序编译的角度来讲这么做是没有问题的,只是,从面向对象的角度来讲,有三个重要的概念,分别是封装、继承和多态。如果将类的属性直接以public的形式对外暴露,实际上就丧失了封装性。什么是封装?封装就是让内部细节对外不可见。类的一个设计原则就是,不要把自己的内部实现细节对外暴露,只对外提供一个功能接口,也就是公有的方法,至于类这个方法里面具体是怎么实现的,外部不需要知道也不应该知道。就以你代码里setname这个方法为例,一个完整的名字应该包括姓和名。假如说你规定姓在前名在后,中间用一个空格来分割。那么如果使用setname方法,你就可以在setname时对外部输入的名字进行检查,看看中间是不是有个空格,如果没有的话可能需要返回一个设置失败。另外,类的内部,可能是使用一个string类型的变量name来直接保存姓和名,也可以定义2个string变量,一个用来保存姓一个用来保存名,可以在setname方法中将用户的输入以空格拆开,分别填到这2个变量里。可见,就一个简单的setname,其实你类的内部,可以用不同的方法来实现。但是这种实现的差异,对于类的使用者来说是不关系的,类的使用者只需要知道它可以调用setname来设置名字就可以了,而无需关心你这个类里面究竟是用一个string对象还是两个string对象来保存名字。这其实就是一个封装。如果你直接以public类型对外提供名字属性,你实际上就丧失了封装性,因为你把内部的实现细节暴露给了外部。

相信,你应该明白了很多。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-31
private:
int a,b,c;
也就是声明几个变量是我专有的,其他的类不可以直接修改,其他的类只能通过这个类定义的成员函数来访问它们,

但其实这只是一个相对的保护“隐私”机制,如果一个外部函数要修改这三个变量,管你有没有声明友元,照样可以直接修改它们的值,这就是C语言指针的危险之处,就算不用指针,内嵌汇编也可以修改,系统的API也可以修改....

private只是说是一个协议,让访问这个类变量成员的函数遵守它的隐私,但如何你不想遵守也可以
第2个回答  2013-08-31
简单来说就是编写大工程的时候有用,刚学c++的人会很迷惑,因为你用不到,而且还麻烦,不如公有的方便。
但是大工程上是避免出错的好方法。因为你写了一个软件,跟第三方合作开发,计算工资的部分你这里把关,可是第三方的人如果可以操作你内部数据,他直接修改了工资的值,你就亏了,所以你要把工资这个变量设为私有的,这样第三方的人就不能直接修改你的值了。
第3个回答  2013-08-31
从程序设计的角度,这叫封装
其实不管这些忽悠的东西,最实用的地方在于,可以在不修改其他代码的前提下,改变这个类的内部结构
比如你不喜欢name做变量了,改成mName,只要修改get/set函数,其他调用的地方不用修改
或者你想给你的name加个前缀后缀规则检查什么的,也只要修改get/set就成
第4个回答  2013-08-31
这样做可以保护类中自定义的变量不被类外访问,是一种规范而已。其实完全可以将类中所有成员都定义为public,但这么做就和结构体没什么区别了。

这个例子写得不好,提供get和set接口会破坏name成员的封装。
好的做法应该是:将需要访问私有变量的类声明为友元。追问

好的做法应该是:将需要访问私有变量的类声明为友元。 我想问是不是友元也是个函数,他是不是可以用来判定,是不是可以用private中的函数。 或者你帮我举个 友元和private的例子吧,求求你啦,大好人,我郁闷好久啦

相似回答