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 ...
随机推荐
- maccms代码审计
由于工作原因,分析了很多的cms也都写过文章,不过觉得好像没什么骚操作都是网上的基本操作,所以也就没发表在网站上,都保存在本地.最近突然发现自己博客中实战的东西太少了,决定将以前写的一些文章搬过来,由 ...
- stm32 ADC模数转换 ADC多通道 ADC DMA
通过调节电位器,改变AD转换值和电压值 STM32F1 ADC 配置步骤 1.使能GPIO时钟和ADC时钟 2.配置引脚模式为模拟输入 3.配置ADC的分频因子 4.初始化ADC参数,ADC_Init ...
- Ubuntu安装telnet
安装 # sudo apt-get install xinetd telnetd 配置 -> 加入以下选项 # sudo vi /etc/inetd.conf telnet stream tcp ...
- 11.ForkJoinPool 分支/合并框架 (工作窃取)
/*ForkJoinPool 分支/合并框架 (工作窃取)*/ Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork) 成若干个小任务(拆到给出的临界值为止),再将一个个的小 ...
- Win10删除或是不显示快速访问中最近使用文件记录
Win10删除或不显示快速访问中最近使用文件记录 安装win10系统后,在文件资源管理器的快速访问将默认记录使用和访问了电脑的一些文件,但是有些最近访问文件的历史纪录,并不想让别人看到,所以就想快速删 ...
- Linux学习笔记(十一)shell基础:管道符、通配符和其他特殊符号
一.多命令顺序执行 && || 相当于其他高级语言中的 ? : 二.管道符 [命令1] | [命令2] 命令1的正确输出作为命令2的操作对象 分屏显示结果 netstat -an 命令 ...
- winform中使用缓存
文章:Winform里面的缓存使用 另外一篇文章:缓存-MemoryCache Class
- Stepwise regression 学习笔记
之前在 SPSS 中的回归分析算法中发现,在它里面实现的算法有 Enter 和 Stepwise 两种.Enter 很容易理解,就是将所有选定的自变量一起放入模型中,直接去计算包含所有自变量的整个模型 ...
- rabbitmq 一些属性
消息属性 消息有14个属性,最常用的几种: deliveryMode:持久化属性 contentType:编码 replyTo:指定一个回调队列 correlationId:消息id mandator ...
- Lua 学习之基础篇三<Lua 字符串操作>
Lua字符串可以使用以下三种方式表示: 单引号间的一串字符. 双引号间的一串字符. [[和]]间的一串字符. string = [["Lua"]] print("字符串 ...