文章目录

  • 前言
  • 一、类
  • 二、改进,实现关闭跟踪输出的功能
  • 三、改进,实现跟踪输出到不同设备的功能
  • 四、不用类来实现上述功能
  • C++优秀的面向对象的核心本质
  • 参考资料

前言

作为高级语言,C已经很强大了,能够处理许多问题。

但是为什么还需要C++,C++出现的理由是什么,C++相比于C强大的核心本质在哪里?

一、类

#include<stdio.h>
class Trace{public:void print(char*s){printf("%s",s);}
};
int main(){Trace t;t.print("begin main()\n");t.print("end main()\n");
}
  1. C++的核心概念是类。如上所示,定义了一个Trace类,用来实现跟踪输出的功能。
  2. 但是,上述代码所示的类,起到的作用并不大,我直接printf作用是相同的,甚至效率可能更好。

二、改进,实现关闭跟踪输出的功能

#include<stdio.h>
class Trace{public:Trace(){noisy=0;}void print(char*s){if(noisy)printf("%s",s);}void on(){noisy=1;}//开启输出void off(){noisy=0;}//关闭输出
private:int noisy;
};
int main(){Trace t;t.print("begin main()\n");t.print("end main()\n");
}
  1. 在改进后的代码中,加入了私有成员noisyvoid on()void off()两个函数实现关闭和开启跟踪输出功能。
  2. 这个改进就有了很大的变化。如果我在程序中写了多次跟踪输出,遍布程序各个位置。当我不需要跟踪输出时,我可以使用void off()函数来实现。倘若不是这样,而是在程序中直接使用printf()函数的话,我将要搜索程序,大面积更改程序内容。

三、改进,实现跟踪输出到不同设备的功能

#include<stdio.h>
class Trace{public:Trace(){noisy=0;f=stdout;}Trace(FILE* ff){noisy=0;f=ff;}//实现输出到不同设备,printf(args)与fprintf(stdout,atgs)等效void print(char*s){if(noisy){fprintf(f,"%s",s);}}void on(){noisy=1;}//开启输出void off(){noisy=0;}//关闭输出
private:int noisy;FILE* f;
};
int main(){Trace t(stderr);t.print("begin main()\n");t.print("end main()\n");
}
  1. 在上面的改进中,我们实现了输出到不同设备的功能。
  2. 倘若我们没有使用类,而是直接使用的fprintf(),那么就很难实现输出到不同设备的更改了。或许定义一个变量FILE* 然后要输出的不同设备时更改这个变量就行了,但是这样就很难实现不同代码段输出到不同设备的功能。而类只需要生成不同的类对象。

四、不用类来实现上述功能

#include<stdio.h>
static int noisy=1;
void trace(char*s){if(noisy){printf("%s",s);}
}
void on(){noisy=1;}//开启输出
void off(){noisy=0;}//关闭输出
int main(){trace("begin main()\n");trace("end main()\n");
}
  1. 函数trace()不是内联的,使用它会有函数调用开销。
  2. 引入了四个全局变量trace、on、off、noisy。而使用类只产生一个全局变量。
  3. 很难实现将上述跟踪输出到不同的文件中。一个可能的实现方式是将trace增加一个参数,改成void trace(FILE* ff,char* s)。但是这样,如果以前前期没有考虑到,就需要更改大量的前期代码,或者写一个新函数trace_out()。

C++优秀的面向对象的核心本质

  1. C++使用类来存储辅助的状态信息,比如noisy,比如FILE。这方便后期的修改和维护。
  2. 对于C,倾向于不添加状态信息,而是在前期就规划好,这会造成后期维护苦难。
  3. C++将通过使用对象,将状态和动作进行绑定。所以就实现了具体到是谁做了什么动作,这个谁就具有自己的状态信息,根据状态信息完成不同的动作。

参考资料

[1]凯尼格. C++沉思录[M]. 北京 : 人民邮电出版社, 2002

《C++沉思录》学习笔记1相关推荐

  1. 软件管理沉思录读书笔记

    第一部分 管理你的项目 质量之所以重要,是因为软件可能会使用十年.组织极少会弃用软件,而是通过提升和重新利用不断使用它.因此,对于软件质量的关注必须贯穿其整个生命周期. 第一章 交付高质量的产品 &q ...

  2. 设计模式沉思录 - 读书笔记(XMind)

    注:后面会不定期,以XMind的方式发布一些读书笔记. 目标:书还要是越读越薄才行!

  3. 软件开发沉思录读书笔记

    软件开发中推崇敏捷,自动化测试,减少了成本加快了速度,加快了沟通和版本之间的关系,用好的沟通来换好的软件.关于多语言开发,应该根据业务领域的不同,采用适合不同领域的编程语言,同时也要注意编程语言的跨平 ...

  4. 《C++ 沉思录》学习笔记——上篇

    文章目录 1. 总结(31-32) 1.1 通过复杂性获取简单性(31) 1.1.1 类库和语言语义 1.1.2 抽象和接口 1.2 说了 Hello world 后再做什么(32) 2. 技术(27 ...

  5. 《C++沉思录》读书笔记

    <C++沉思录>读书笔记 序幕 动机 第1章 为什么我用C++ 第2章 为什么用C++工作 第3章 生活在现实世界中 类与继承 第4章 类设计者的核查表 第5章 代理类 第6章 句柄:第一 ...

  6. Android学习笔记---22_访问通信录中的联系人和添加联系人,使用事物添加联系人...

    Android学习笔记---22_访问通信录中的联系人和添加联系

  7. FFmpeg基础到工程-多路H265监控录放开发学习笔记

    多路H265监控录放开发学习笔记 课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等.包括:音视频.流媒体.直播.Android.视频监控28181.等. 具体 ...

  8. 【小猫爪】AUTOSAR学习笔记00-目录

    [小猫爪]AUTOSAR学习笔记00-目录   因为一个偶然的机会让我接触到了AUTOSAR,所以就花一点小小的时间来记录一下学习它的坎坷大道.这其中复制粘贴了很多,也包括了我的一些个人的小小见解和废 ...

  9. 读书笔记∣概率论沉思录 01

    概率的解释基础分为两种,一是物理世界本身存在的随机性(客观概率),二是是我们由于信息不足而对事件发生可能性的度量(主观概率).基于此,形成了概率论的两大学派:频率论学派(传统数理统计学)和贝叶斯统计学 ...

最新文章

  1. requests+正则爬取猫眼电影前100
  2. mxnet优化器 SGD_GC
  3. java自动雨刷系统,安装雨量传感器实现自动大灯/自动雨刷(详细方法)多图!!
  4. hdoj5024【BFS/暴力】
  5. [转]浅谈浏览器插件检测 和自定义协议的支持
  6. java getstringarray_Java AnnotationAttributes.getStringArray方法代碼示例
  7. 【Android QR Code】开源项目:ZXing(一)导入项目
  8. mysql时间排序_mysql – 按日期和时间降序排序?
  9. 用于集成测试的Maven Cargo插件
  10. CCCC L1-002. 打印沙漏【图形打印】
  11. java继承原理内存角度_Java编程的逻辑 (17) - 继承实现的基本原理
  12. NodeJS+Express+MongoDB 简单实现数据录入及回显展示【Study笔记】
  13. 在Leangoo里怎么修改密码?
  14. android activity 的四种启动模式
  15. Java中的char占用几个字节
  16. 企业经常说绩效管理难,误区在哪?附绩效管理系统解决方案
  17. vue 点击文字input_Vue实现点击按钮复制文本内容
  18. Excel的复合条饼图制作
  19. 内存卡提示要格式化怎么办?
  20. Action大全和用法

热门文章

  1. 不属于计算机主机设备的是什么,不属于计算机硬件的是什么
  2. CCF 202206-4 光线追踪 python
  3. type-c速度测试软件,Type-C读写速度太慢 你真的使用了正确的方法了吗
  4. 【嵌入式Linux】开发环境搭建
  5. SMS短信的编码规则
  6. 学校食堂工作流程图流程图模板分享
  7. ERP实施设防三大雷区(转载)
  8. 逆水寒2021最新服务器,【图片】《逆水寒》2021年1月21日更新公告【逆水寒ol吧】_百度贴吧...
  9. 【元胞自动机】基于元胞自动机的人口疏散仿真matlab源码
  10. jquery banner广告图片左右切换,模仿实现支付宝广告效果