Effective c++ 百日读书笔记

版权声明:请注明转载地址 https://blog.csdn.net/OCEANtroye https://blog.csdn.net/OCEANtroye/article/details/82832264

Effective c++ 百日读书笔记


读书笔记 c++

目录


这是什么?

  • 一篇个人读书笔记
  • 围绕c++的程序设计过程的读书笔记

写在前面

  • 该系列文章是本人在阅读effctive c++ 一书中就书中的观点进行及时的自我认识和总结,打算将本书的笔记分为5个部分。
  • 结合书中所讲述的思想加上自己的理解,完成本文。如有不当,劳烦指出!

本书介绍

豆瓣评分:9.5

《EffectiveC++:改善程序与设计的55个具体做法》(中文版)(第3版)一共组织55个准则,每一条准则描述一个编写出更好的C++的方式。每一个条款的背后都有具体范例支撑。第三版有一半以上的篇幅是崭新内容,包括讨论资源管理和模板(templates)运用的两个新章。为反映出现代设计考虑,对第二版论题做了广泛的修订,包括异常(exceptions)、设计模式(designpatterns)和多线程(multithreading)。《Effective C++》的重要特征包括:

  • 高效的 classes、functions、templates 和inheritance hierarchies(继承体系)方面的专家级指导。
  • 崭新的 TR1 标准程序库功能应用,以及与既有标准程序库组件的比较。
  • 洞察 C++和其他语言(例如Java、C#、C)之间的不同。此举有助于那些来自其他语言阵营的开发人员消化吸收 C++ 式的各种解法。

effective c++

以下是豆瓣读书下该书的精彩评价:

Effective C++
非常经典的C++书籍,基本上学C++的人没有不知道这本书的。书中介绍了55个准则,每一条准则描述一个编写出更好的C++的方式。

书是一年半以前买的,那时刚刚学了一个学期C++(再之前一个学期学了C),算是把基本语法学完了,封装继承多态等面向对象知识也都有所了解。不过那时买来这本书一读,还是觉得读起来太吃力了,就算勉强读完所能理解的也不多。所以看了1/5就束之高阁了。之后虽然几次想再拿出来读完,却都因为种种原因耽搁了。最近趁着寒假,终于把这么经典好书通读了一遍。
读完之后第一感觉就是:难!C++真难!以前的自己真是太浅薄了(虽然也从没认为自己多有内涵),对C++的理解真是太浅了(虽然也从没认为自己真的掌握好了C++)。书中很多观点都令我耳目一新:原来C++可以这么用的;而对C++的博大精深也有了更深刻了认识。

之前的一年基本上都在用C#这门语言,C++很少用到,有些生疏了。读书的时候也常常把书中提到的C++的一些用法和C#相比较。比较之后发现,C#不愧是C++的后辈,继承了C++的优良传统,而又新增了很多特性。而这些新增的特性如果想在C++中实现,很是要费一番功夫。
在C/C++中最令人痛苦/欣赏的就是指针了。用得好,代码简洁,程序执行效率高;用得不好,不仅容易出错,各种各样的用法也令人头痛不已。与指针相伴随的是资源管理的问题,一个new一个delete,就算是资深的程序员也不敢说自己的代码完全不会出问题。于是人们发明了智能指针,大大简化了这一方面的问题。而C#在这方面就进不了不少,垃圾回收机制解决了资源管理容易出错和内存泄漏等问题。程序员只管完成功能就行,麻烦的事情交给系统和语言机制来解决。当然事情都有两面性,系统提供的方案是普遍适用的,但在某些特殊领域,还是人工写代码来控制效率高一些。
有面向对象,必然有类的继承体系。C++
中不支持“接口”(Interface)这个东西,于是人们用“类”(Class)来模拟。在融入virtual关键字以及一些相对(和C#直接的Interface关键字相比)复杂的技术之后,终于用类基本实现了接口的特性。读到这里不禁赞叹前人的智慧。
书中还提到了TR1和BOOST等程序库,他们和STL一起,大大的扩展了C++语言。我觉得,函数库的增加,使C++一下子变得比C优越了很多。
另外书中还有很多很多的一下技巧和提示,虽然由于经验不足还是有很多不能完全理解(尤其是泛型那里),但读完之后还是觉得对C++的理解深刻了很多


Follow me

我是一名在校大二学生,每天都是在梦想的途中,只要能慢慢的进步就好。
Github:@oceanlvr
CSDN:https://blog.csdn.net/OCEANtroye


正文


条款1~4

条款1 View C++ as a federation of languages.

将C++视为一个语言的联邦

C++是一门多重范式的语言,它是支持

  • 多重范式编程语言
  • 支持过程形式
  • 支持面向对象
  • 函数形式
  • 泛型形式
  • 元编程形式
    一们语言的语言。在使用C++时候应当将C++视为多种语言的联邦才能更好的发挥各大部分的功效。
    语言组成的4个部分
  • 面向过程的C部分
  • 面向对象的C++部分
  • TMP模板泛型编程部分
  • STL

条款2 Prefer consts,enums,and inlines to #define.

宁可使用编译器而不使用预处理器

1.使用const的情况

在使用字面常量时候,我们常常会无法被编译器看到,因为使用#define处理的变量在进入编译器之前就被预处理器移除了,这样做的坏处:

  1. 对于一个常量,如果被#define到非头文件中追踪该变量将十分的麻烦。
  2. 无法使用记号式调试器(symbol table)对该变量进行追踪。
  3. 对于替换是是浮点数的情况会导致码量增加。
  4. 对于类中的成员变量,#define不能封装

对于使用const的两种特殊情况总结:

  1. 定义常量指针constant pointers 由于使用的常量常常被定义在头文件中,因此对于该类变量是十分有必要设置为const的。
    对于char *型的字符串常量,通常需要进行两次const:

    const char* const myName = "Adameta";
    

    注:如果这里有困惑,您可以跳转到条款3查看更加详细的解释。

    对于使用std::string的则为:

	const std::string myName = "Adameta";
  1. 对于class的专属变量。为了使得该变量的作用域限制在该class种,必须让它成为一个class的一个成员,而与此同时为了确保该变量只有一个,必须将其声明为static成员:
class GramePlayer {
private:
	static const int NumTurns = 5;//对于常量的声明式
	int scores[NumTurns];//使用常量声明式
	};

对于一个是class的专属变量又是一个static并且是整数类型的变量.
可以直接提供声明式而不提供定义式。
但是如果您的编译器无法通过一个没有定义式的变量(这种是不正确的)那么您需要在头文件中(类的外部)加上如下代码,并且不用提供初始值

	const int GamePlayer::NumTurns;//定义式,没有赋予初始值

由于在声明的时候已经获得了初始值,因此对于定义式不用再次提供初始值。

猜你喜欢

转载自blog.csdn.net/OCEANtroye/article/details/82832264
今日推荐