C++的精髓——代码复用、接口复用
C++的精髓——代码复用、接口复用
封装:信息隐藏
继承:代码复用
多态:面向对象
C++并不是面向对象,它包容多种编程思想,如面向过程,面向对象,泛型编程等。
笔者还在学校的时候理解C++最终精髓是两点:代码复用、接口复用。到现在隔的时间挺长了,今天不防把它记录下来,希望不会引起各位高手的嘲笑吧。
C++的特点:封装、继承、和多态。现在我们分别从这些所谓的C++的特点上来讨论它的本质吧。
封装:封装的含意就是对一个空间下的成员变量进行保护,这可能也是class和struct的唯一区别了吧。当然不是说struct不能保护,只是一个 默认值而已。但C就没有这些支持吗?答案是肯定的。比如在一个文件的全变量声明成static,那么这个全局变量就是对该文件内部是可见的,对外部是隐藏 的。因此从这一点上来看,封装不能算C++特有的东西。只不过是文件和声明的struct内部而已。好,下面对继承再进行分析。
继承:继承就 是子类具体父类可继承的方法的属性,那么它本质做了哪些事呢?实际说白了很简单,只是复用了你类的代码,甚至我们可以认为是父类可继承的代码原样照抄一 遍。这能算C++特有的吗?C封装的那么多的lib库不同样可以完成这些事吗?因此继承我认为同样不是C++的特性。好了,被人们传颂的C++三大属性在 不知觉间被我砍了俩了,可能要被许多C++爱好者猛批一把了。但是下面我还要把第三个所谓的它的特点给否认掉:)
多态:多态是什么呢?即一个 抽象事物对于不同的具体事物可以有不同的动作和处理事件,这就是多态。那么多态究竟做了哪些事呢?难道C就没有这样的特性了吗?实际上如果对C有一定深度 理解的话,那么如下就不难理解了。声明一个函数指针,放在一个struct内部,在不同时刻对其赋不同的函数指针值,这样就可调用不同函数,这是不是叫多 态呢?从本质上讲,这就是所谓的C++的多态,而且也是这么实现的。哈哈,到这儿可以看到神奇的C++竟再也没有可被提及的自已的特点了。
是 不是C++真的就没有所谓的特点和特质了呢?答案是当然存在,而且文章题目也很醒目:代码复用、接口复用。现在我们给其抛开那些好听的继承名子,以复用取 而代之。复用C库即是,但C++则采用了另外一种复用形式,重要的不是于表象,而在于对事物的抽象理解的复用。如果从这个角度去再解C++的复用,那么你 才能真正去理解C++的一点点内涵吧。它可以将宏观世界的物可以很形象的用语言的形式对外再现。把是什么,归属这种性质以符号的形式进行加工进而实现复 用。这便是C++的第一个精髓点吧。因此看你对继承这个词的理解程度了,不要人云亦云。
下面再进行接口复用进行更进一步的论述。刚才论讨了 C++的继承即是代码复用的特性,下面将说明多态就是接口复用的性质。的确,在C里面使用指针完成可以做所谓C++的所有这些特性。实际C++的胜过C的 点并不在于所谓的多态,仍旧在于对编程思想的理解。比如使用C++可以帮助理解这样的事物,同一类动物,对于不同的具体实际,可能做出不同的动作,使用 C++可以更加简单形象的描述而已。因此多从更高层次上去理解C++,就可以帮助我们理解具体事物的特性在哪。接口复用即同一个接口,对于不同的使用者可 以使用同样的接口调用方式可以得到不同的调用结果,这样方便了代码和系统的统一。
因此,如果读到这儿,所有事情就都很清晰了。所谓的封装、继承、多态要完全抛开了,而应该从另外一个更高的层次去理解它。当你理解到这个层次,C、C++只不过是一个工具,功能没有什么差别。就不再会有C++实现的系统使用C难以实现的困惑了。
笔者愚见。
C++的精髓——代码复用、接口复用的更多相关文章
- Linux中的IO复用接口简介(文件监视?)
I/O复用是Linux中的I/O模型之一.所谓I/O复用,指的是进程预先告诉内核,使得内核一旦发现进程指定的一个或多个I/O条件就绪,就通知进程进行处理,从而不会在单个I/O上导致阻塞. 在Linux ...
- [改善Java代码]在接口中不要存在实现代码
第3章 类.对象及方法 书读得多而不思考,你会觉得自己知道的很多. 书读得多而思考,你会觉得自己不懂的越来越多. —伏尔泰 在面向对象编程(Object-Oriented Programming,O ...
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
- java代码List接口和Arraylist类
总结: package clientFrame; import java.util.*; //集合类 List是一个接口.ArrayList是一个类 public class ArraylitTest ...
- 基于webrtc的媒体库測试代码以及接口介绍
经过一段时间的项目验证,第一版接口能够定版了.满足一般的项目需求是没有问题了,接口非常清晰,凝视也写的非常清晰,大家有须要的就拿去測试吧,android版本号还在验证中.假设有什么问题或者须要源码.能 ...
- 接口测试-Java代码实现接口请求并封装
前言:在接口测试和Java开发中对接口请求方法进行封装都非常有必要,无论是在我们接口测试的时候还是在开发自测,以及调用某些第三方接口时,都能为我们调用和调试接口提供便捷: Java实现对http请求的 ...
- java 后台代码调用接口
import com.jiuqu.jollykeys.common.util.JsonUtil;import java.io.UnsupportedEncodingException;import j ...
- python装饰器精髓代码
#!/usr/bin/env python #-*- coding:utf-8 -*- import time def foo(func): def inner(): print('fs...') f ...
- tep完整教程帮你突破pytest
持续维护的教程 tep教程会随着版本更新或经验积累,持续维护在电子书中,最新的最全的内容请锁定这篇文章[最新]tep完整教程帮你突破pytest: https://dongfanger.gitee.i ...
随机推荐
- Oracle中select 1和select *的区别
转自:https://www.linuxidc.com/Linux/2010-05/26202.htm 创建myt表并插入数据,如下: create table myt(name varchar2,c ...
- h5常见
Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面//一.HTML页面结构<meta name="viewport" content="widt ...
- NORDIC ble RSSI
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { ret_code_t err_code; sw ...
- 2.Vue调试工具vue-devtools的安装步骤和使用
1.安装步骤: 打开谷歌浏览器设置 -->扩展程序 -->勾选开发者模式 --->加载已解压的扩展程序 --->选择“chrome扩展”文件夹即可:
- 使用raw input 代替全局键盘钩子
//关于raw input 请查看msdn https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536%28v=vs.85%29 ...
- 大数据之路week04--day03(网络编程)
哎,怎么感觉自己变得懒了起来,更新博客的频率变得慢了起来,可能是因为最近得知识开始变得杂变得难了起来,之前在上课的时候,也没有好好听这一方面的知识,所以,现在可以说是在学的新的知识,要先去把新的知识思 ...
- Height、clientHeight、scrollHeight、offsetHeight 、scrollTop、offsetTop
Height 返回当前文档中的<body>元素的高度 clientHeight 对于没有定义CSS或者内联布局盒子的元素为0,否则,它是元素内部的高度(单位像素),包含内边距,但不包括水平 ...
- 删除集合元素Collection ,remove()
package seday11;/*** @author xingsir*/public class coordinate { private int x; private int y; /* * 右 ...
- 对Ajax的一些理解
前言 在学习js的过程,我个人对于Ajax这项技术有着很深的印象,大概是因为它在我们网页开发过程中常见的交互里所发挥的作用太过于关键了吧,所以我想在这里好好地谈一些自己对它的理解. 概念理解 Ajax ...
- [Google Guava] 1.3-常见Object方法
原文链接 译者: 沈义扬 equals 当一个对象中的字段可以为null时,实现Object.equals方法会很痛苦,因为不得不分别对它们进行null检查.使用Objects.equal帮助你执行n ...