![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Effective C++学习笔记
文章平均质量分 62
郭衍清
这个作者很懒,什么都没留下…
展开
-
第一部分:习惯C++(条款1-4)
这里是effective C++第一部分条款1:对C++的整体认识。它包括 1. C部分。C++以C语言为基础发展而来。2.面向对象部分。3.C++泛型编程部分也叫template C++. 4.STL条款2:用const,enum,inline对define替换 1.#define RATIO 3.14 改为const double Ratio =原创 2012-07-07 22:29:22 · 1004 阅读 · 0 评论 -
条款28:避免使用handles指向对象内部成分
看下面的问题:class Point{ public: Point(int x,int y); ... void SetX(int newVal); void SetY(int newVal); ...};struct RectData{ Point ulhc; Point lrhc;}原创 2012-07-09 15:30:10 · 8807 阅读 · 0 评论 -
第六部分 继承与面向对象设计 条款32:确定你的public继承是is-a关系
以C++进行面向对象编程,有一个重要的规则,public继承意味着是is-a关系,所谓is-a就是一种 的意思。比如我们用Person为基类,Student为派生类实现public继承。每个Student都是Person,但是每个Person不一定都是Student。在继承体系中,任何函数如果愿意接受一个Person的实参,那么也愿意接受一个Student的对象。如:void eat(cons原创 2012-07-10 09:43:39 · 492 阅读 · 0 评论 -
第四部分 设计与声明(1)(条款19-22)
条款18:让接口容易被正确使用,不易被误用我们以日期函数为例来讨论class Date{ public: Date(int month,int day,int year); .....};这个类客户容易犯错: Date d(30,3,1995); //应该是Date d(3,30,1995);Date(2,30,1995) //2月没有30为了原创 2012-07-09 10:04:13 · 76 阅读 · 0 评论 -
第四部分 设计与声明(1)(条款18-22)
条款18:让接口容易被正确使用,不易被误用我们以日期函数为例来讨论class Date{ public: Date(int month,int day,int year); .....};这个类客户容易犯错: Date d(30,3,1995); //应该是Date d(3,30,1995);Date(2,30,1995) //2月没有30为了原创 2012-07-09 15:01:35 · 304 阅读 · 0 评论 -
条款33:避免遮掩继承而来的名称
这里主要说的是继承体系中的作用域class B{ private: int x;public: virtual void mf1()=0; virtual void mf2(); void mf3();...};class D:public B{ public: virtual void mf1(); void mf4();原创 2012-07-10 10:39:19 · 451 阅读 · 0 评论 -
条款34:区分接口继承与实现继承
public继承经过仔细的检查后发现主要有两部分组成:函数接口继承和函数实现继承,他们的区别就相当于声明与定义的区别。作为类的设计者你有可能希望继承接口,有可能继承实现或者两者都需要。、 class Sharp{ public: virtual void draw() cosnt = 0; virtual void error(const std::string&原创 2012-07-10 13:25:46 · 285 阅读 · 0 评论 -
条款35:考虑virtual函数以外的其他选择
假如你正在写一个视频游戏软件,你想计算不同人物的健康指数,那么平常的方法肯定是这样实现:class GameCharacter{ public: virtual int healthValue() const; ........};healthValue被声明为virtual,说明会提供缺省方法。但是从某个角度来讲这里存在弱点。这里考虑一些其他替代方法:原创 2012-07-11 10:23:50 · 1172 阅读 · 1 评论 -
条款36-37绝不重新定义继承而来的non-virtual函数与缺省参数
条款36:绝对重新定义继承而来的non-virtual函数条款37:绝不重新定义继承而来的缺省参数这两个条款说的绝不没有说不可以,意思是最好是这么做。个人觉得这两个条款没有太多可说的。这里讲下缺省参数的问题。在C++面向对象的技术中,virtual函数的类型是动态的,但是参数是静态的。具体可以参考《C++ primer》以下的代码是糟糕的:class Sharp{原创 2012-07-11 16:01:23 · 550 阅读 · 0 评论 -
第四部分(4)(条款25:考虑写出一个不抛出异常的swap函数)
条款25:考虑写出一个不抛出异常的swap函数所谓swap两个对象,就是将两个对象的值彼此赋予对方。标准库可能是这样实现的:namespace std{ template void swap(T& a,T&b) { T temp(a); a = b; b = temp; }}原创 2012-07-09 15:19:23 · 390 阅读 · 0 评论 -
第四部分 设计与声明(2)(条款23:宁以non-member、non-friend替代member函数)
条款23: 宁以non-member、non-friend替代member函数思考下面的问题:一个网页浏览器类class WebBrowser{ public: ... void clearCache();//清除Cache void clearHistory();//清除History void removeCo原创 2012-07-09 14:43:34 · 300 阅读 · 0 评论 -
第三部分 资源管理(条款13-17)
条款13 以对象管理资源class Investment{.........};假设有个工产函数: Investment* createInvestment();现在:void f(){ Investment* pInv = createInvestment(); .... delete pInv;}这个函数看起来是没有什么问题的,但是如果在...部分原创 2012-07-08 12:59:30 · 57 阅读 · 0 评论 -
第二部分 构造、析构与赋值运算(条款5-12)
这里是第二部分 条款 5:C++默默编写并调用哪些函数 如果你没有写构造函数、析构函数、copy构造函数和赋值操作符,C++会自己为你编写默认的函数。如果你自己编写了,C++不再合成 如果你打算在一个内含 reference成员的class内支持赋值操作,你必须自己定义赋值操作符,面对const成员,编译器的反应也是一样的。如果某个基类的copy 操作符是一个private,那原创 2012-07-08 10:41:18 · 1401 阅读 · 0 评论 -
第三部分 资源管理(条款13-17)
条款13 以对象管理资源class Investment{.........};假设有个工产函数: Investment* createInvestment();现在:void f(){ Investment* pInv = createInvestment(); .... delete pInv;}这个函数看起来是没有什么问题的,但是如果在...部分原创 2012-07-08 13:17:04 · 333 阅读 · 0 评论 -
第四部分(3)(条款24:若所有参数皆需要数据转型,请为此采用non-member函数)
条款24:若所有参数皆需要数据转型,请为此采用non-member函数假设有以下类(有理数类): class Rational{ public: Rational(int numerator=0, // constructor刻意不为explicit,允许int-to-Rational int denominator=1)原创 2012-07-09 15:18:18 · 279 阅读 · 0 评论 -
第五部分 实现之条款26:尽可能延后变量定义式的出现时间
条款26:尽可能延后变量定义式的出现时间在C++中只要你定义了一个类型且带有构造函数和析构函数,那么他就有成本开销。所以变量不应该过早地定义,看下面的case: std::string encryptyPassword(const std::string& password) { using namespace std; string en原创 2012-07-09 15:27:38 · 317 阅读 · 0 评论 -
条款27:尽量少做转型动作
与C语言比,C++提供四种新式转型动作:1.const_cast (expression) 除去对象的常量性2.dynamic_cast (expression) 主要执行“安全向下转型”。这种无法由旧式语言执行。成本耗费最大。 成本花费高,为什么还需要这种转型?通常是因为你想在一个你认定的derived class对象身上执行derived class原创 2012-07-09 15:28:45 · 346 阅读 · 0 评论 -
条款29-30:为“异常安全”而努力是值得的与inlining的里里外外
条款29:异常安全 假设有个class用来表现夹带背景图案的GUI菜单。这个class希望用于多线程环境,所以它有个互斥器作为并发控制用:class PrettyMenu{ public: ... void changeBackgroud(std::istream& imgSrc); ... private: Mutex原创 2012-07-09 15:31:22 · 318 阅读 · 0 评论 -
条款31:将文件间的编译依存关系降至最低
我们还是从一个例子开始出发:class Person{ public: Person(const std::string& name,const Date& birthday,const Address& addr); std::string name() const; std::string birthDate() const原创 2012-07-09 15:32:06 · 396 阅读 · 0 评论 -
条款38-40:通过复合塑模出has-a或"根据某物实现出"与private继承、多继承
条款38:通过复合塑模出has-a或"根据某物实现出"复合是类型之间的一种关系,当某种类型的对象内包含其他类型的对象,我们说这是一种复合。public继承是is-a关系,表示是一种的意思。复合意味着has-a关系,表示有一个或者is-implemented-in-terms-of(根据某物实现出)。现在假设你需要一个template制造出一组classes表示不重复的对象组成的sets原创 2012-07-11 16:47:36 · 511 阅读 · 0 评论