对于番外篇,我深刻能明白在大多数人眼里就和电视剧的广告一样,说实话,我也不喜欢这种感觉,因为这样会让人觉得是在欺骗消费者啊~~~阿西巴~~~但是我实在发现如果不在这里对面向对象来个入门级的介绍,后面的列表类包括树,图什么实在是太难构造,或者构造出来太垃圾,所以我觉得还是应该先介绍一下面向对象,其实大部分是对自己行个方便。万事都要从最简单的开始,所以我就从0开始了。

面向对象(object-oriented),这个单词我刚学C++的时候查了不下于十次,我实在是经常记不得oriented的意思,而且这个构造出来的词实在是拗口和很难理解,我经过多年稍微能理解对象的意思,但是至今我一直无法参透面向是什么含义。object,我觉得接近的一个口头语是“东西”。和对象相关联相对应的一个概念是“类”,对象和类是一个元素和集合的关系,可以这样看,车就是一个类,小轿车也是一个类,甲壳虫就是小轿车这个类的一个对象。在我最开始学习这个的时候,有人告诉我你可以把人看做一个类,而你就是人类这个对象,我觉得这个例子很好,所以我决定用这个思想来叙写我的面向对象入门系列。

好了,我们现在要用人类作为面向对象的载体了,既然有了类这个概念,那么就要有相应的语言上的实现,就像int表示整数,float表示浮点数一样,C++既然是一种面向对象的语言,那么自然要发明创造出一种能表示这个的关键词,C++使用的是class,从这个词上也可以看出类是一种集合的概念。那我们开始定义一个“人”类了,C++的语法是class Person{}; class 是关键词,Person是要定义的类的名字,最后还有一个分号,别小看这个分号,绝对有30%的人会在编写越来越长的类中忘记这个分号,然后导致很诡异的错误半天查不出来。一个类中可以声明各种函数和变量,当声明了一个类之后,你就可以声明(定义)出这个类的对象了,有没有一种造人的感觉?哈哈,比如你想声明一个坏人,只要在main函数中写Person badman; 就像你定义int i;一样。在我的main中,我定义了一个Person的对象和一个char的独享,断点调试你可以看到下面的内容,可以看到就和局部变量c一样,同样有局部变量badman,如果你愿意,可以使用&查看这个变量的地址。

这个过程看似很简单,声明一个空类,实际上编译器做了太多的工作,这个放到后面点再说。现在先来介绍几个特殊的概念:

一、构造函数:既然是函数,那么一定是长的一个函数样,但是构造函数是一个特殊的函数,在一个类中,他没有返回类型,名字必须和类名一致,可以有参数也可以没有参数,目的是在定义对象时完成一些对象的初始化,你可以理解为准备工作。比如我们想在我们造一个人的时候都输出一句话”I am created by you“,那么我只要在class Person{};的{}里面加上public:Person(){cout<<"I am created by you."<<endl;},至于这个public什么意思,稍后面就会说明,然后运行一下:

     目前的程序代码暂时是这个样子的:

V0.01

 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 class Person
 7 {
 8 public:
 9     Person(){cout<<"I am created by you."<<endl;}
10 };//dont't forget
11
12
13 void main()
14 {
15   Person badman;
16
17    char c;
18    cin>>c;
19 }

可以看到在我们声明一个badman的时候,会输出一行字,而这一行字正是构造函数输出的,所以你可以把构造函数是为了声明一个对象的准备工作,如果需要什么准备工作的话可以在这里进行。

二、析构函数:自然也是长的一个函数样,但是人家有名字,肯定是有特别的地方,析构函数的模式是“~”符号加上类的名字,不能有参数,为什么不能有参数,原理比较复杂,你可以思考,但是这个肯定要到介绍的差不多的时候才能写。比如Person类的析构函数是~Person(){};他的作用是当你这个对象脱离作用域的时候(比如主函数结束)的时候做一些清理工作,怎么来看到他的效果呢?我们也在函数体中输出一句话“I am destoryed.” 执行一下,输入一个字符退出,咦,似乎有什么闪了一下,怎么查看效果呢?我们在main的最后一个花括号后面设置一个断点,点击执行,输入一个字符退出,好,现在程序到了断点的地方,再按一下F10,不是分开按F和10,再打开输出窗口,会看到下面的输出结果:

又输出了一句话,我第一次看到这个的时候真心感到神奇,为什么会输出这样一句话,程序离理论上说已经结束了,cin后面没有语句了,这就是构造函数的作用,可以理解为在结束的时候帮你擦屁股的人,唉真是伟大啊,所以在这里你可以做任何清理工作,比如回收内存等等。

除了这两个特殊的函数,还有三个特殊的关键字,public,protected,private,这三个关键字是C++类的访问控制符,为了达到安全和封装两个目的,封装也是C++之一,就像一个人一样,你的名字在大多数情况下是公开的,你的私人小金库是秘密的,你的银行卡密码是受保护的,所谓受保护的就是在外面别人是不知道的,但是某些和你有特殊关系的人是可以知道的,比如你的老婆。对于一个类,什么叫公开呢?所谓的公开就是在外部声明的对象可以访问这些东西,无论是函数还是变量,比如我想声明一个公开的变量Name,一个受保护的变量bankPassword和一个私密的变量privateMoney,然后利用badman这个对象去尝试访问这三个变量,在C++中采用的"."或者"->"(这个符号是用在声明了一个指向对象的指针上)来访问类中定义的变量,现在的代码如下所示:

V0.02

 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 class Person
 7 {
 8 protected:
 9    string bankPassowrd;
10 private:
11    int priavteMoney;
12 public:
13     string Name;
14     Person(){cout<<"I am created by you."<<endl;}
15     ~Person(){cout<<"I am destroyed."<<endl;}
16 };//dont't forget
17
18
19 void main()
20 {
21    Person badman;
22    badman.Name;
23    badman.bankPassowrd;
24    badman.priavteMoney;
25    char c;
26    cin>

这三个的排列顺序是无所谓的,我们执行一下会发现报错:

报错提示有两个变量无法访问,原因就是他们的控制符不是公开的,再说一下,"公开"什么的都是相对外部来说的,如果在一个类的内部是没有这些限制的,所有的都能自由访问,这些控制符使得类的设计者可以自由灵活的控制外部使用人员可以使用什么和不可以使用什么,这样在类的使用者看起来类就像一个黑盒子,也可以让类的使用者不用去关心这一切都是怎么实现的。就像一个电视机遥控器,你只管按数字,不用管里面的电路板,这就是封装的概念。

那么如果我们申明一个类的时候不加控制符直接声明一个变量或者函数会怎么样呢?你可以先猜猜再试试。

转载于:https://www.cnblogs.com/ZXYloveFR/archive/2012/11/22/2782939.html

你所能用到的数据结构之番外篇---逆袭的面向对象(一)相关推荐

  1. 数据结构杂谈番外篇——搞懂递归的小文章

    文章目录 1 难题 2 递归 2.1 n的阶层 2.2 斐波那契数列的第n项 2.3 逆序打印数组 3 反转链表 4 回顾递归 1 难题 如果不想听我谈学习的过程而注重怎么学习,可以直接跳到第二小节 ...

  2. 数据结构杂谈番外篇——时间复杂度计算

    我们先给出推导的方法,然后下面一步一步来推导. 推导大O阶 用常数1取代运行时间中的所有加法常数 在修改后的运行次数函数中,只保留最高阶项 如果最高阶存在且不是1,则去除这个项相乘的常数 所得结果即为 ...

  3. PostCSS自学笔记(二)【番外篇二】

    图解PostCSS的插件执行顺序 文章其实是一系列的早就写完了. 才发现忘了发在SegmentFault上面, 最早发布于https://gitee.com/janking/Inf... 这次我继续研 ...

  4. IO多路复用(番外篇)、poll、epoll三者的区别

    Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本 ...

  5. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    转载自:https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程:给深度学习入门者的Python快速教程 - 基础篇 给深度学习入门者的Python快速教程 - ...

  6. 笔记:计算机视觉与深度学习-简单的实现一个网络-番外篇

    写在开头 1.课程来源及所有代码来源,后面不再每一步中标明了:pytorch官方网站的Tutorials.和Docs. 2.笔记目的:个人学习+增强记忆+方便回顾 3.时间:2021年4月19日 4. ...

  7. [zt]数学之美番外篇:平凡而又神奇的贝叶斯方法

    数学之美番外篇:平凡而又神奇的贝叶斯方法 Tags: 数学, 机器学习与人工智能, 计算机科学 save it69 saved tags: 贝叶斯 math bayesian algorithm 数学 ...

  8. 『中级篇』docker之wordpress容器SSL(番外篇)(78)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之wordpress容器SSL(番外篇)(78) 搞了2天终于搞定了,现在分享给大家. apache2 ...

  9. 『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81) 之前一直用的原生的centos7的源镜像安装虚拟机,然 ...

最新文章

  1. asp.net过滤HTML标签的几个函数
  2. Docker桌面不再对企业用户免费,每月订阅费最高21美元,用户直接炸锅了
  3. mybatis 思维导图,让 mybatis 不再难懂(二)
  4. C#部署安装,将用户安装路径记录下写入注册表,并启动
  5. 获取指定个数指定范围的随机数
  6. 当你的技术债务到期时,LinkedIn的故事 | IDCF
  7. Microsoft Azure Remoteapp使用自定义镜像创建桌面服务
  8. Ripple_vJZ
  9. 使用Docker搭建hadoop集群
  10. xmlhttp的状态码收集
  11. Redis的C++ client表、Json的C++ client表|汇总|大全
  12. java中for 的几种常见用法
  13. java treeset_Java TreeSet
  14. Houdini技术体系大纲
  15. 炼数成金数据分析课程---18、降维技术(后面要重点看)
  16. 7-39 抽卡游戏 (30分) 本题的灵感来源于一个古典的概率模型。 AliceAliceAlice 在一个卡池里抽卡,里面有 xxx 张 sss 卡和 yyy 张 aaa 卡。 AliceAlice
  17. Wifi密码破解实战
  18. 忍者必须死3突然服务器维修,《忍者必须死3》3月25日停服维护公告
  19. 【超详细教程】Mac如何用QuickTime录屏soundflower录制屏内外声音(附视频演示教程)
  20. 软银集团计划针对日本国内散户发行45亿美元债券

热门文章

  1. 也来学学插件式开发续-利用MEF
  2. CSS3 常用选择器
  3. (转)【重磅】无监督学习生成式对抗网络突破,OpenAI 5大项目落地
  4. ElasticSearch入门系列(一)是什么以及安装和运行
  5. 金蝶EAS BOS开发常用的代码说明及常见问题
  6. 阿里巴巴数据产品经理工作(总结篇)
  7. Firebird数据库的Select语句
  8. 箫 音之乐 生(声)之乐
  9. 三星电子首次公布李在镕薪酬 看起来一点儿也不高
  10. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】