抛砖引玉:

 c++中private的用处
我知道我们可以用 public 中的值,把private中的数据给提出来,但是还是搞不懂private该怎么用,或者说在一个具体程序中,private有什么用。
class fun{
public:
void setname(string x)
{
name =x;
}
string getname()
{
return name;
}
private:
string name;
};
/*主函数*/
int main()
{
fun ob;
ob.setname("you are apples");
cout << ob.getname() <<endl; system("pause");
return ;
}

作用说明:

【way 1】

这是面向对象编程中的东西。

首先你要有一个类的概念,如果没有类的概念,就不会知道为什么需要private、protected和public。

类首先是一种抽象,是一个定义。比如说人类就是一个抽象的定义,具体到我们每个人就是这个类的对象。虽然你我都属于人类,但可能我们姓名不同,性别不同,年龄也不同,因此类需要有属性。除了属性,类还需要有方法,类的方法是这个类对外所提供的交互接口。例如人类可以对外提供走路、说话、吃饭等方法。类的属性通常会声明为private,也就是私有的,然后提供一个公有的方法来访问它。你不理解的其实就是这里,不知道为何要“多此一举”,直接将属性声明为public,直接访问不就可以了吗?

其实,从程序编译的角度来讲这么做是没有问题的,只是,从面向对象的角度来讲,有三个重要的概念,分别是封装、继承和多态。如果将类的属性直接以public的形式对外暴露,实际上就丧失了封装性。什么是封装?封装就是让内部细节对外不可见。类的一个设计原则就是,不要把自己的内部实现细节对外暴露,只对外提供一个功能接口,也就是公有的方法,至于类这个方法里面具体是怎么实现的,外部不需要知道也不应该知道。就以你代码里setname这个方法为例,一个完整的名字应该包括姓和名。假如说你规定姓在前名在后,中间用一个空格来分割。那么如果使用setname方法,你就可以在setname时对外部输入的名字进行检查,看看中间是不是有个空格,如果没有的话可能需要返回一个设置失败

。另外,类的内部,可能是使用一个string类型的变量name来直接保存姓和名,也可以定义2个string变量,一个用来保存姓一个用来保存名,可以在setname方法中将用户的输入以空格拆开,分别填到这2个变量里。可见,就一个简单的setname,其实你类的内部,可以用不同的方法来实现。但是这种实现的差异,对于类的使用者来说是不关系的,类的使用者只需要知道它可以调用setname来设置名字就可以了,而无需关心你这个类里面究竟是用一个string对象还是两个string对象来保存名字。这其实就是一个封装。如果你直接以public类型对外提供名字属性,你实际上就丧失了封装性,因为你把内部的实现细节暴露给了外部。

相信,你应该明白了很多。

【way 2】

简单来说就是编写大工程的时候有用,刚学c++的人会很迷惑,因为你用不到,而且还麻烦,不如公有的方便。
但是大工程上是避免出错的好方法。因为你写了一个软件,跟第三方合作开发,计算工资的部分你这里把关,可是第三方的人如果可以操作你内部数据,他直接修改了工资的值,你就亏了,所以你要把工资这个变量设为私有的,这样第三方的人就不能直接修改你的值了。

举例分析private的作用【c/c++学习】的更多相关文章

  1. AJAX练习(一):制作可以自动校验的表单(从原理上分析ajax的作用)

    继上文(AJAX(一)AJAX的简介和基础)作为联系. 传统网页在注册时检测用户名是否被占用,传统的校验显然缓慢笨拙. 当ajax出现后,这种体验有了很大的改观,因为在用户填写表单时,签名的表单项已经 ...

  2. Java学习笔记——SequenceInputStream类合并文件的综合举例分析

    SequenceInputStream 介绍 SequenceInputStream 类表示其他输入流的逻辑串联,即文件的合并. 它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾, ...

  3. Spring 框架的架包分析、功能作用、优点,及jar架包简介

    Spring 框架的架包详解    Spring的作用     Spring的优势  由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或 ...

  4. Spring MVC 框架的架包分析,功能作用,优点

    由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...

  5. 《Linux内核分析》课程第八周学习总结

    姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  6. 《Linux内核分析》课程第七周学习总结

    姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  7. 《Linux内核分析》课程第三周学习总结

    姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  8. 《Linux内核分析》课程第五周学习总结

    姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  9. JTS空间分析工具包(GIS开源)学习 JAVA

    JST空间分析工具包是一套JAVA API,提供一系列的空间数据分析操作.最近开发项目刚好需要用到,上网搜资料也少,就自己写下来记录一下.C++版本的拓扑分析开源工具叫:geos:.NET版本的拓扑分 ...

随机推荐

  1. SpringBoot学习笔记(八):SpringBoot启动端口+访问路、SpringBoot配置文件yml、SpringBoot多环境区分、SpringBoot打包发布

    SpringBoot启动端口+访问路径 配置文件: server.port=9090 server.context-path=/springboot 现在只能用http://127.0.0.1:909 ...

  2. 11_数据降维PCA

    1.sklearn降维API:sklearn. decomposition 2.PCA是什么:主成分分析 本质:PCA是一种分析.简化数据集的技术. 目的:是数据维数压缩,尽可能降低原数据的维数(复杂 ...

  3. 08-5-switch

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Install- Linux必学的60个命令

    1.作用 install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户. 2.格式 (1)install [选项]... 来源 目的地 (2)install [选项]... 来源... ...

  5. 打开springboot的run dashboard

    默认情况下,idea的run dashboard是关闭的,当检测到你有多个springboot项目时会弹出提示框,询问是否打开. 如果我们想要自己打开,需要修改配置. 在你的idea的项目目录中,有一 ...

  6. NFS和mount常用参数详解 本文目录

    NFS和mount常用参数详解   本文目录 NFS权限参数配置 mount挂载参数 原始驱动程序的挂载选项. 新驱动程序的挂载选项. 怎样改变已经挂载的NTFS卷的权限? 怎样自动挂载一个NTFS卷 ...

  7. JSOI 2016 扭动的字符串

    JSOI 2016 扭动的字符串 题面描述 给出两个长度为\(n\)的字符串\(A,B\) \(S(i,j,k)\)表示把\(A\)中的\([i,j]\)和\(B\)中的\([j,k]\)拼接起来的字 ...

  8. centos Python2.6 升级到2.7

    需求: centos 6.x 系统默认Python 版本都是2.6,实际生产环境中需要用到Python 2.7.x Python 2.7 下载地址 [root@ansible package]# wg ...

  9. Vue实例属性/方法/生命周期

    一 实例属性 var app = new Vue(); app.$el ===>返回当前挂在DOM对象. app.$data ===>返回当前实例data里面的数据 app.$option ...

  10. python时间处理,datetime中的strftime/strptime

    python中datetime模块非常好用,提供了日期格式和字符串格式相互转化的函数strftime/strptime 1.由日期格式转化为字符串格式的函数为: datetime.datetime.s ...