《C++沉思录》学习笔记1
文章目录
- 前言
- 一、类
- 二、改进,实现关闭跟踪输出的功能
- 三、改进,实现跟踪输出到不同设备的功能
- 四、不用类来实现上述功能
- 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");
}
- C++的核心概念是类。如上所示,定义了一个Trace类,用来实现跟踪输出的功能。
- 但是,上述代码所示的类,起到的作用并不大,我直接
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");
}
- 在改进后的代码中,加入了私有成员
noisy
和void on()
、void off()
两个函数实现关闭和开启跟踪输出功能。 - 这个改进就有了很大的变化。如果我在程序中写了多次跟踪输出,遍布程序各个位置。当我不需要跟踪输出时,我可以使用
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");
}
- 在上面的改进中,我们实现了输出到不同设备的功能。
- 倘若我们没有使用类,而是直接使用的
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");
}
- 函数
trace()
不是内联的,使用它会有函数调用开销。 - 引入了四个全局变量trace、on、off、noisy。而使用类只产生一个全局变量。
- 很难实现将上述跟踪输出到不同的文件中。一个可能的实现方式是将trace增加一个参数,改成
void trace(FILE* ff,char* s)
。但是这样,如果以前前期没有考虑到,就需要更改大量的前期代码,或者写一个新函数trace_out()。
C++优秀的面向对象的核心本质
- C++使用类来存储辅助的状态信息,比如noisy,比如FILE。这方便后期的修改和维护。
- 对于C,倾向于不添加状态信息,而是在前期就规划好,这会造成后期维护苦难。
- C++将通过使用对象,将状态和动作进行绑定。所以就实现了具体到是谁做了什么动作,这个谁就具有自己的状态信息,根据状态信息完成不同的动作。
参考资料
[1]凯尼格. C++沉思录[M]. 北京 : 人民邮电出版社, 2002
《C++沉思录》学习笔记1相关推荐
- 软件管理沉思录读书笔记
第一部分 管理你的项目 质量之所以重要,是因为软件可能会使用十年.组织极少会弃用软件,而是通过提升和重新利用不断使用它.因此,对于软件质量的关注必须贯穿其整个生命周期. 第一章 交付高质量的产品 &q ...
- 设计模式沉思录 - 读书笔记(XMind)
注:后面会不定期,以XMind的方式发布一些读书笔记. 目标:书还要是越读越薄才行!
- 软件开发沉思录读书笔记
软件开发中推崇敏捷,自动化测试,减少了成本加快了速度,加快了沟通和版本之间的关系,用好的沟通来换好的软件.关于多语言开发,应该根据业务领域的不同,采用适合不同领域的编程语言,同时也要注意编程语言的跨平 ...
- 《C++ 沉思录》学习笔记——上篇
文章目录 1. 总结(31-32) 1.1 通过复杂性获取简单性(31) 1.1.1 类库和语言语义 1.1.2 抽象和接口 1.2 说了 Hello world 后再做什么(32) 2. 技术(27 ...
- 《C++沉思录》读书笔记
<C++沉思录>读书笔记 序幕 动机 第1章 为什么我用C++ 第2章 为什么用C++工作 第3章 生活在现实世界中 类与继承 第4章 类设计者的核查表 第5章 代理类 第6章 句柄:第一 ...
- Android学习笔记---22_访问通信录中的联系人和添加联系人,使用事物添加联系人...
Android学习笔记---22_访问通信录中的联系人和添加联系
- FFmpeg基础到工程-多路H265监控录放开发学习笔记
多路H265监控录放开发学习笔记 课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等.包括:音视频.流媒体.直播.Android.视频监控28181.等. 具体 ...
- 【小猫爪】AUTOSAR学习笔记00-目录
[小猫爪]AUTOSAR学习笔记00-目录 因为一个偶然的机会让我接触到了AUTOSAR,所以就花一点小小的时间来记录一下学习它的坎坷大道.这其中复制粘贴了很多,也包括了我的一些个人的小小见解和废 ...
- 读书笔记∣概率论沉思录 01
概率的解释基础分为两种,一是物理世界本身存在的随机性(客观概率),二是是我们由于信息不足而对事件发生可能性的度量(主观概率).基于此,形成了概率论的两大学派:频率论学派(传统数理统计学)和贝叶斯统计学 ...
最新文章
- requests+正则爬取猫眼电影前100
- mxnet优化器 SGD_GC
- java自动雨刷系统,安装雨量传感器实现自动大灯/自动雨刷(详细方法)多图!!
- hdoj5024【BFS/暴力】
- [转]浅谈浏览器插件检测 和自定义协议的支持
- java getstringarray_Java AnnotationAttributes.getStringArray方法代碼示例
- 【Android QR Code】开源项目:ZXing(一)导入项目
- mysql时间排序_mysql – 按日期和时间降序排序?
- 用于集成测试的Maven Cargo插件
- CCCC L1-002. 打印沙漏【图形打印】
- java继承原理内存角度_Java编程的逻辑 (17) - 继承实现的基本原理
- NodeJS+Express+MongoDB 简单实现数据录入及回显展示【Study笔记】
- 在Leangoo里怎么修改密码?
- android activity 的四种启动模式
- Java中的char占用几个字节
- 企业经常说绩效管理难,误区在哪?附绩效管理系统解决方案
- vue 点击文字input_Vue实现点击按钮复制文本内容
- Excel的复合条饼图制作
- 内存卡提示要格式化怎么办?
- Action大全和用法
热门文章
- 不属于计算机主机设备的是什么,不属于计算机硬件的是什么
- CCF 202206-4 光线追踪 python
- type-c速度测试软件,Type-C读写速度太慢 你真的使用了正确的方法了吗
- 【嵌入式Linux】开发环境搭建
- SMS短信的编码规则
- 学校食堂工作流程图流程图模板分享
- ERP实施设防三大雷区(转载)
- 逆水寒2021最新服务器,【图片】《逆水寒》2021年1月21日更新公告【逆水寒ol吧】_百度贴吧...
- 【元胞自动机】基于元胞自动机的人口疏散仿真matlab源码
- jquery banner广告图片左右切换,模仿实现支付宝广告效果