more effective c++
文章平均质量分 81
ruan875417
这个作者很懒,什么都没留下…
展开
-
【more effective c++读书笔记】【第1章】基础议题(1)
条款1:仔细区别pointers和references1、pointers和references之间的区别是:a、没有所谓的null reference,一个reference必须总代表某个对象。pointer可以不指向任何对象。b、pointer可以被重新赋值,指向另一个对象,reference却总是指向它最初获得的那个对象。例子:#include#includeusin原创 2015-08-24 13:41:02 · 421 阅读 · 0 评论 -
【more effective c++读书笔记】【第6章】杂项讨论
条款32:在未来时态下发展程序未来式思维要加上一些额外的考虑:a、提供完整的类——即使某些部分目前用不到。当新的需求进来,你不太需要回头去修改哪些类。b、设计你的接口,使有利于共同的操作行为,阻止共同的错误。让类轻易地被正确运用,难以被错误运用。c、尽量使你的代码一般化,除非有不良的巨大后果。 “未来式思维”可增加代码重用性、加强其可维护性、健壮性,并促使在一个“改变实乃必然”原创 2015-09-11 19:30:47 · 338 阅读 · 0 评论 -
【more effective c++读书笔记】【第5章】技术(4)——Smart Pointers(智能指针)
一、类似C++标准程序库提供的auto_ptrtemplate的智能指针//Smart.h#ifndef SMART_H#define SMART_Htemplateclass SmartPtr{public: SmartPtr(T* realPtr = 0); //构造函数 ~SmartPtr();//析构函数 SmartPtr(SmartPtr& rhs); //拷贝构原创 2015-09-05 14:02:10 · 454 阅读 · 0 评论 -
【more effective c++读书笔记】【第5章】技术(7)——让函数根据一个以上的对象类型来决定如何虚化(2)
四、自行仿真虚函数表格(使用非成员函数的碰撞处理函数)//GameObject.h#ifndef GAMEOBJECT_H#define GAMEOBJECT_Hclass GameObject{ //抽象基类public: virtual ~GameObject() = 0;};class SpaceShip : public GameObject{ //宇宙飞船类pub原创 2015-09-10 16:42:15 · 374 阅读 · 0 评论 -
【more effective c++读书笔记】【第5章】技术(5)——Reference counting(引用计数)(1)
一、非引用计数实现的String类#ifndef STRING_H#define STRING_H#define _CRT_SECURE_NO_WARNINGS#includeclass String{public: String(const char* initValue = nullptr);//构造函数 String(const String& rhs);//拷贝构造函数原创 2015-09-06 11:13:07 · 868 阅读 · 0 评论 -
【more effective c++读书笔记】【第5章】技术(3)——要求(或禁止)对象产生于heap之中
一、要求对象产生于heap之中方法:让析构函数成为private,构造函数为public。然后导入一个伪的析构函数,来调用真正的析构函数。但是它也妨碍了继承和内含。例子://UPNumber.h#ifndef UPNUMBER_H#define UPNUMBER_H#includeclass UPNumber{public: UPNumber() :value(0) {原创 2015-09-04 14:47:51 · 392 阅读 · 0 评论 -
【more effective c++读书笔记】【第5章】技术(2)——限制某个class所能产生的对象数量
一、允许零个对象每当产生一个对象时会有一个构造函数被调用,因此阻止某个类产出对象的最简单方法就是将该类的构造函数声明为private。例子:class CantBeInstantiated{private: CantBeInstantiated(); CantBeInstantiated(const CantBeInstantiated&); ....};二、允许一个对原创 2015-09-03 14:43:58 · 450 阅读 · 0 评论 -
【more effective c++读书笔记】【第5章】技术(7)——让函数根据一个以上的对象类型来决定如何虚化(1)
一个虚函数调用动作称为一个消息分派,如果某个函数调用根据两个参数而虚化就称为双重分派,根据多个函数而虚化称为多重分派。C++不支持双重分派和多重分派,因此我们必须自己实现。有以下几种方法:一、虚函数 + RTTI(运行时期类型辨识)//GameObject.h#ifndef GAMEOBJECT_H#define GAMEOBJECT_Hclass GameObject{ //抽象原创 2015-09-09 18:29:55 · 402 阅读 · 0 评论 -
【more effective c++读书笔记】【第4章】效率(3)
条款22:考虑以操作符复合形式(op=)取代其独身形式(op)1、确保操作符的复合形式(如operator+=)和其独身形式 (如 operator+ )之间的自然关系能够存在,一个好方法就是以前者为基础实现后者。例子:#includeusing namespace std;class Rational{public: Rational(int n = 0, int d =原创 2015-09-01 14:17:48 · 354 阅读 · 0 评论 -
【more effective c++读书笔记】【第5章】技术(5)——Reference counting(引用计数)(2)
三、引用计数基类和智能指针实现的String类//RCObject.h#ifndef RCOBJECT_H#define RCOBJECT//引用计数基类class RCObject{public: void addReference();//增加引用计数 void removeReference();//减少引用计数,如果变为0,销毁对象 void markUnshareab原创 2015-09-07 16:37:13 · 825 阅读 · 0 评论 -
【more effective c++读书笔记】【第4章】效率(1)
条款16:谨记80-20法则80-20法则说:一个程序80%的资源用于20%的代码身上。80%的执行时间花在大约20%的代码上;80%的内存被大约20%的代码使用;80%的磁盘访问动作由20%的代码执行;80%的维护力气化在了20%的代码上。软件的整体性能几乎总是由其构成要素的一小部分决定。条款17:考虑使用lazyevaluation(缓式评估)lazy evaluati原创 2015-08-30 15:45:02 · 383 阅读 · 0 评论 -
【more effective c++读书笔记】【第5章】技术(1)——将constructor和non-member functions虚化
一、将constructor虚化1、例子:#include#include#includeusing namespace std;class NLComponent{public: NLComponent(){ cout << "NLComponent()" << endl; } NLComponent(const NLComponent&){ cout << "NLCom原创 2015-09-02 11:01:59 · 439 阅读 · 0 评论 -
【more effective c++读书笔记】【第4章】效率(2)
条款19:了解临时对象的来源1、C++真正的临时对象是不可见的,临时对象通常发生于两种情况:一是当隐式类型转换被施行起来使函数调用能够成功;二是当函数返回对象时。2、只有当对象通过传值方式传递对象或当对象被传递给一个常量引用参数时,才会发生类型转换。如果对象被传递一个非常量引用参数,并不会发生类型转换。例子:#include#include#includeusing name原创 2015-08-31 10:08:02 · 399 阅读 · 0 评论 -
【more effective c++读书笔记】【第3章】异常(2)
条款12:了解“抛出一个exception”与“传递一个参数”或“调用一个虚函数”之间的差异2、例子:istream operator>>(istream& s, Widget& w);void passAndThrowWidget(){ Widget localWidget; cin >> localWidget; throw localWidget;}当localWidge原创 2015-08-29 14:14:17 · 506 阅读 · 0 评论 -
【more effective c++读书笔记】【第3章】异常(1)
条款9:利用Destructor避免泄漏资源1、异常无法被忽略:如果一个函数利用“设定状态变量”的方式或是利用“返回错误码”的方式发出一个异常信号,无法保证此函数的调用者会检查那个变量或检验那个错误码。于是程序的执行可能会一直继续下去,远离错误发生地点。但是如果函数以抛出expcetions的方式发出异常信号,而该exception未被捕捉,程序的执行便会立刻中止。2、例子:原创 2015-08-28 09:43:06 · 328 阅读 · 0 评论 -
【more effective c++读书笔记】【第2章】操作符(2)
条款7:千万不要重载&&,|| 和, 操作符1、C++对于“真假值表达式”采用“骤死式”评估方式:一旦表达式的真假值确定,即使表达式中还有部分尚未检验,整个评估工作仍告结束。例子:char* p;...if ((p != 0) && (strlen(p) > 10))...不用担心调用strlen时p是否为null指针,因为如果p != 0是否定的,strlen就绝原创 2015-08-27 14:38:57 · 358 阅读 · 0 评论 -
【more effective c++读书笔记】【第2章】操作符(1)
条款5:对定制的“类型转换函数”保持警觉1、两种函数允许编译器执行隐式转换:单自变量constructor 和隐式类型转换操作符。单自变量constructor是指能够以单一自变量成功调用的constructor,这样的constructor可能声明拥有单一参数,也可能拥有多个参数,并且除了第一参数之外都有默认值。隐式类型转换操作符,是一个拥有奇怪名称的member function:关键词o原创 2015-08-26 09:44:27 · 469 阅读 · 0 评论 -
【more effective c++读书笔记】【第1章】基础议题(2)
条款3:绝对不要以多态方式处理数组1、继承的最重要性质之一就是,你可以通过指向基类的指针或者引用来操作派生类对象。但是如果你通过基类指针或者引用来操作派生类所形成的数组,它几乎绝不会按你预期般地运作。例子:#includeusing namespace std;class Base{public: Base(int i=1){ ib = i; } friend ostrea原创 2015-08-25 14:38:09 · 389 阅读 · 0 评论 -
【more effective c++读书笔记】【第5章】技术(6)——Proxy classes(代理类)
“用来代表其他对象”的对象被称为proxy objects,用来表现proxy objects者,称为proxy classes(代理类)。一、实现二维数组//Array2D.h#ifndef ARRAY2D_H#define ARRAY2D_H//代理类templateclass Array1D{public: Array1D(int d) :dim(d),data1d(n原创 2015-09-08 16:02:58 · 443 阅读 · 0 评论