C++面向对象核心思想引导--建议人人都看

先告知的秘密

关于这篇博客,我再三推敲要不要写出来,若写出来吧,感觉尽是废话,因为没有牵扯到C++的任何
知识点,若不写吧,感觉总是欠缺点什么,C++与C的区别在于它面向对象的能力,而面向对象思想
本身又是抽象的,不好概括,因为它本身抽象,因此又成为了C++的核心;我们学C++的目的是拿来
解决问题的,而不是应付考试的,对于解决问题方面,我们肯定先要有这个问题的模型,然后再通过
C++建模解决啊,鸿沟就出现在这里,实际问题模型如何通过C++特性映射成为解决问题的代码?

这样考虑的话,必然就牵扯出了C++核心思想是怎么样去描述问题模型的!这是程序员要考虑的问题,因此我们会毫不犹豫的问自己:C++为什么要这样设计?为什么会有类?为什么会有封装、继承、多态?它们又是如何解决问题的?带着这些疑问,我就有理由相信,我们不仅要学扎实C++的基础语法,更应该用简单通俗的抽象去描述C++的这些思想。

前段时间,我把C语言的一些基础小结了一下,感觉特别有用,现在开始准备小结一下C++,但在此时我犯难了:该如何总结C++?用什么样的思路总结最好?毕竟C语言是过程性语言,把细节语法弄明白了基本就不会有多大的问题,但C++不一样:应用C++时本身面向对象思想,是该向C语言那样总结?还是另找方法?现在我有两个思路:1.按照狄泰的知识点去总结;2.按照“C++编程思想”一书的顺序总结。这个问题还值得考究,不过不管是从那方面下手,我觉得核心思想引导都该先行,兵马未动,粮草先行!核心思想是方向标,也是我们所探索问题的指南针,一切问题按照这个中心出发,相信错不到哪里去。

下面,我把我这段时间在不同书籍上看到的文字,按照自己的抽象方式作为笔记呈现出来,方便大家参考,同时也方便我参悟,文字很轻松很废话,也很有意义,仁者见仁智者见智!

面向对象

1.所有的程序设计语言都提供抽象,人们能解决的问题的复杂性直接与抽象的东西以及抽象出来的质量有关; 汇编语言是对底层机器的小幅度抽象,如C语言等命令式语言都是对汇编语言的抽象。面向过程的语言比汇编语言有了很大的改进,但是它们的主要抽象仍然要求程序员按计算机的结构去思考, 而不是按要解决问题的结构去思考。

2.面向对象的方法为程序员提供了在问题空间中表示各种事物元素的工具,我们把问题空间中的事物和它们在解空间中的表示称为“对象”。(有些对象(比如线程)在问题空间中没有对应物);用面向对象的方式去理解世界,人类的大脑最喜欢听故事讲故事,用面向对象思维理解世界最省劲。

3.面向对象的代码会带来代码层级增加,如果站在编译器的角度,软件的复杂度
说不定还上升了,由于采用最被人类理解的组织结构,因此在人类大脑里反而
变得简单了。

面向对象程序设计的难题之一,是在问题空间中的元素和解空间的对象之间建立一对一的映射。

怎么样映射?面向对象通过三招,即:封装、继承、多态手段实现代码的拟人化和故事化。

封装

1.封装,它所做的是:将一些相互关联的因素装在一起,是面向对象的起始步骤。从单细胞到高等生物:一些基本数据,好比低等生物,它们有生命也没有灵性, 而一些数据已经进化到有灵性的高等生物,这就是对象。对象要成为有灵性的生命首先依靠的是封装。

2 .封装将若干数据和方法组合在一个叫“类”的身体里,数据是肉体,方法是让身体动起来的各种行为,方法存在的意义就是操作它对应的数据,换句话说就是各种行为 操作肉体怎么动。

3 .封装将这些数据和方法进行了等级森严的区分:public、protected、private.三种划分同时修饰着数据和方法。划分出这个类里谁是内脏,谁是外观,哪些是显性基因,哪些是隐性基因。

4.封装的理由:

1.为了防止客户程序员插手他们不应该接触的部分,这样使得他们容易看到哪些部分对于他们是重要的,哪些部分
  是可以忽略的,客户程序员只关心重要的地方.(public函数、方法、接口)
2.允许类库设计者去改变这个类的内部工作方式,而不必担心这样做会影响客户程序员。

public级别

1.public是最重要的等级,它直接体现一个类对外的表象,一个类长得是否漂亮,只取 决于public,因为只有它所修饰的才能被外界看到,public成员函数,也一定是类成员函数里最重要的,它直接体现了这个类有多少能力。

2.public方法堂堂正正,没有心机不设防,谁都可以用。它照顾自己,也照顾子孙,它能力子孙可以继承,属于显性基因。我认为,每个public方法正式发布后,都代表着一个小小 的承诺,既然是承诺,就不要轻易修改,因为很可能被外部引用,一旦修改就会引发一系列 的麻烦.

因此在决定成员函数名称和参数之前一定要想好!!

3.public数据不推荐定义,取而代之的是private数据配上对应的Get\Set函数。尽量暴露方法,不要暴露数据!数据好比是肉体,方法好比是盔甲;让肉体经受风吹雨打总不如让盔甲承受安全。

private级别

1.private是第二重要级别,就像水下的冰川,private才是存储数据的主流方式。

2.private成员函数应用场景大概分为三种:

场景1:抽象出来的一些小功能方法。

场景2:纯碎就是好几处相同或相似的代码为了缩减行数,硬把这几处代码替换为private函数。

场景3:场景1与2的private成员函数就是public方法的小弟,甚至是佣人,public函数不想干的脏活累活,全扔
给private来干,场景3正好相反,可能一些public方法过于强大,业务上不想让外面知道这么多细节,
比如:
   假如一个提供核能的函数(具备造原子弹的能力)使用public方法就太危险了,此时可以把它屏蔽成private函数,
   我们再对外提供一个建造核发电站的public函数,里面调用的是提供核能的函数的子功能,这样就安全了。

 这种private方法才是幕后执行者。

protected级别

protected从某种意义上讲,充其量是一个特殊的private,是一个能被继承的private而已。

封装总结

封装能让一堆数据和方法有机的组合在一起,并为 后来的 继承 和 多态 提供基础。

继承

1.继承,就是快速进化,拥有祖先的能力,在面向对象的技术中,是承上启下的一个环节。我们
必须在封装的基础上才能实现继承;而只有实现了继承,才能进一步产生多态。

2.一般情况下,我们先写基类再写子类的情形,是最正统的场景。但有时,我们没有想的那么远,
当一个个子类构建后才发现有优化空间,而此时基类正是优化后的产物。还有一种情况是只有
基类,程序员可以先把世界的主要框架描述清楚,细枝末节慢慢来,这样的话,最先出现的是
基类或者抽象类。这就是对抽象编程。

3.继承仅仅是实现抽象编程的第一步,想让整个继承体系动起来,必须要依赖一项更重要的技术
,那就是多态!

继承的目的:

继承是一门承上启下的技术,它天然能做到节省公共代码的作用(代码复用),但这仅仅是次要作用,主要作用其实是为了实现多态!

多态

1.多态是建立在封装、继承基础之上的,如果没有封装和继承就不会产生多态,如果没有多态,继承
将少了一半的意义。在实现上,封装和继承是编译器支持的,和运行时没有关系;只有多态是 编译器和运行时的共同支持。

2.多态的实现套路:

多一层地址查询。
招数基本都是在编译期间构建一张张映射表,运行期去查询这些映射表,才能访问到真正的函数地址。

3.多态有多重要?绝大部分的设计模式都基于多态,然而,这是表象,多态如此重要的内在原因是
给程序员带来的最大价值:
让大家实现了梦寐以求的“面向抽象编程,面向接口编程”。
这句话的分量有多重,就能看出多态的价值有多大。

多态的价值显示:

它像一只看不见的手直接把基类和所有子类们动态联系起来。这就厉害了,表面上只是基类参加干事情(比如跑步),但实际上是所有的子类都准备参加,只是最终由谁上场先不 告诉你。如果没有多态,基类不能动态映射到子类,那将是死水一潭。没有了多态,面向对象这座大厦就像停了电梯,很多东西都将随之瘫痪。

面向对象整个抽象知识链条

在“封装+继承”的基础上,才能实现多态。
有了多态,才能真正意义上进行“面向抽象编程,面向接口编程”。

总结

今天的总结就到此结束,希望通过以上的总结能为大家带来思考,对“面向抽象编程,面向接口编程”
产生兴趣,然后去研究它,以上都是口水话,抽象的东西用口水话恰好能映射出其中的含义,通过这些含义在生活中再进行多多意会,这样面向对象思想会越加深刻,这种哲学性的东西是虚的,没有标准,没有最好,只有更好!星星之火----可以燎原…
给大家推荐几本书,以方便学C++:
1.狄泰的C++课程绝对值得我们反复学习,把基础打好(不要妄想一遍能学好,不现实的,一定反复,毕竟内容量大,很有深度;全程无废话,都是精华,这点绝对是我们反复学习的福音!)。
2.面向对象葵花宝典一书,这本书把面向对象讲的很不错,里面的案例值得反复推敲!这本书解决了面向对象思维的问题,也不厚,对我们的价值非常大。
3.C++编程思想一书,这本书的意义在于基础的应用行云流水般刻画出来,第一卷(也就4百多页)值得拜读。
我想通过这三大法宝来修炼我们C++面向对象编程已够折腾一段时间了,三大法宝,相互搭配,相互思考,威力无穷!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
本书运用现代工具对计算机科学进行传统的介绍。作为计算机领域的科学家,很幸运能够给学生介绍一种易于实践、使人满足并且需要不断深入才能掌握的活动,即编程。正如大多数计算机科学家一样,我相信编程始终是计算机科学的核心主题。因此,本课程的目的是教学生怎样编写程序。 虽然本书在形式上保持了传统风格,但也使用了许多新技术,主要表现在三个方面: ● 所用的编程语言是一个C++子集。虽然将C++作为一门完美的教学语言还相去甚远,但其本身是一门十分注重实效的语言。在软件界中,C++是应用十分广泛的编程语言。在所有主要平台上都有便于使用的C++编程环境。特别是,C++在介绍编程思想方面具有极大优势。本书通过使用标准C++语言的新特性,如引用参数、流库、string类以及vector模板,从而最大限度地避免使用易于出错的程序结构。指针也只主要应用在多态和链表的实现上。 ● 较早引入对象。本书分两个阶段介绍对象。从第2章开始,学生开始学习使用对象,特别是流对象、字符串对象、简单的Time和Employee类实例以及图形对象。本书按照传统方式逐步地介绍分支、循环、函数和过程,并在这一过程中使学生逐渐了解对象、调用成员函数等概念。然后,在第6章开始学习如何实现类和成员函数。 ● 可选图形编程。学生一般都喜欢图形编程,本书包括很多可视化信息的练习。为此,本书使用一个在许多流行平台上都可以得到的简单图形库。与传统的图形库不同,该库在对象使用上更加直接、有效。该简单图形库的使用同样是可选的。此外,在第18章中通过使用一个类似于Microsoft基本类库(MFC)的开放源代码工具包来介绍图形用户界面编程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值