More Effective C++
35个改善编程与设计的有效方法
娱乐界祖师爷
这个作者很懒,什么都没留下…
展开
-
More Effective C++ 条款13:以引用方式捕获异常
写一个catch子句时,你必须指明异常对象如何被传递到这个子句来。可以选择通过指针、值、引用方式。指针效率最高,因为抛出指针是唯一在搬移“异常相关信息”时不需要复制对象的一种做法。void someFunction(){ static exception ex; ... throw &ex; ...}void doSomething(){ try{ someFunction(); } catch(except原创 2022-03-20 16:21:12 · 745 阅读 · 0 评论 -
More Effective C++ 条款12:了解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”之间的差异
相同点:函数参数和异常的传递方式有3种:传值、传引用、传指针。不同点,试看以下函数,不但传递一个widget作为参数,也抛出一个Widget exception://此函数从一个stream中读取一个Widgetistream operator>>(istream& s, Widget& w);void passAndThrowWidget(){ Widget localWidget; cin >> localWidget; //将原创 2022-03-20 02:44:46 · 107 阅读 · 0 评论 -
More Effective C++ 条款11:禁止异常流出析构之外
两种情况下析构会被调用。第一种是当对象在状态下被销毁,也就是离开它的生存空间或是被明确删除;第二种情况是当对象被异常处理机制——也就是异常传播过程中的stack-unwinding(栈展开)机制——销毁。在运行时期间从函数调用栈中删除函数实体,称为栈展开。栈展开通常用于异常处理。在C++中,如果一个异常发生了,会线性的搜索函数调用栈,来寻找异常处理者,并且带有异常处理的函数之前的所有实体,都会从函数调用栈中删除。所以,如果异常没有在抛出它的函数中被处理,则会激活栈展开。参考下面程序:#in原创 2022-03-18 00:39:09 · 155 阅读 · 0 评论 -
More Effective C++ 条款10:在构造内阻止资源泄漏
当在构造函数中抛出异常的时候,由于对象尚未构造完全,因此并不会调用其析构函数,问题是此时如果对象已经被部分构造,那么我们应当保证被部分构造的内容适当地析构。考虑这样一个类class A{public: A(const int& number,const string&a,const string& b):num(number),ptr_a(0),ptr_b(0){ if (a != "") ptr_a = new strin原创 2022-03-16 21:31:56 · 1020 阅读 · 0 评论 -
More Effective C++ 条款09:利用析构函数避免资源泄漏
class ALA{public: virtual void processAdoption() = 0;};class Puppy : public ALA{public: virtual void processAdoption();};class Kitten: public ALA{public: virtual void processAdoption();};//核心函数void processAdoptions(istream&.原创 2022-03-14 23:36:42 · 918 阅读 · 0 评论 -
More Effective C++ 条款08:了解各种不同意义的new和delete
当你写string *ps = new string(“Hands up!”)时,你所使用的new是所谓的new operator,它其实干了两件事:一、分配足够的内存(实际大小是大于所创建的对象大小)二、调用对象构造函数,为刚才分配的内存对象设定初值。new operator永远干这两件事,无论如何你不能改变其行为。上面的那段代码大约反映以下的行为:void *mem = operator new(sizeof(string));call string::string(“Hands原创 2022-03-14 00:21:19 · 268 阅读 · 0 评论 -
More Effective C++ 条款07:千万不要重载&&,||和,操作符
C++对于“真假表达式”采用所谓的骤死式评估方式。意思是一单该表达式的真假值确定,即使表达式中还有部分尚未检验,整个评估工作仍高结束。举例:char *p;...if((p != 0) && (strlen(p) > 10))你无需担心调用strlen时p是否为null指针,因为如果"p是否为0"的测试结果是否定的,strlen就绝不会被调用。同样道理,以下代码:int rangeCheck(int index){ if((index < lower原创 2022-03-12 23:33:37 · 987 阅读 · 0 评论 -
More Effective C++ 条款06:区别自增/自减操作符的前置和后置形式
重载方式:class UPInt{public: UPInt& operator++(); //前置式++ const UPInt operator++(int); //后置式++ UPInt& operator--(); //前置式-- const UPInt operator--(int); //后置式-- UPInt& operator+=(int); //+=操作符,结合UPInts和ints};UPInt i原创 2022-03-10 23:30:00 · 1416 阅读 · 0 评论 -
More Effective C++ 条款05:对定制的类型转换函数保持警觉
C++的类型转换,两种函数允许编译器执行这样的操作:单参数构造和隐式类型转换操作符。单参数构造指可能声明单一参数,有可能拥有多个参数,并且除了第一参数之外都有默认值:class Name{public: Name(const string& s); //可以把string转换为name ...};class Rational{public: Rational(int numerator = 0, int denominator = 1); //可以把原创 2022-03-09 23:26:13 · 674 阅读 · 0 评论 -
More Effective C++ 条款04:非必要不提供默认构造函数
所谓默认构造函数,就是不给任何变量,就可以给调用(无参或参数为默认值)。基本准则:凡可以“合理地从无到有生成对象”的类,都应该包含默认构造函数,而“必须有某些外来信息才能生成对象”的类,则不必拥有默认构造函数。但如果类缺乏一个默认构造函数,当你使用这个类时便会有某些限制。考虑下面这个针对公司仪器而设计的class,在其中,仪器识别码是一定得有的一个构造参数:class EquipmentPiece{public: EquipmentPiece(int ID); ...原创 2022-03-09 00:24:40 · 371 阅读 · 0 评论 -
More Effective C++ 条款03:绝对不要以多态方式处理数组
class BST {...};class BalancedBST : public BST{ ...};现在考虑有个函数,用来打印BSTs数组中的每一个BSTs数组中的每一个BST的内容:void printBSTArray(ostream& s, const BST array[], int numElements){ for(int i = 0; i < numElements; ++i){ s << array[i]; .原创 2022-03-06 22:46:54 · 465 阅读 · 0 评论 -
More Effective C++ 条款02:最好使用C++转型操作符
四个转型操作符static_cast:基本上拥有与C旧式转型相同的威力与意义,以及相同的限制。const_cast:用来改变表达式中的常量性或易变性(将某个对象的常量性去除掉)。dynamic_cast:用来执行继承体系中“安全的向下转型或跨系转型动作”。也就是可以利用dynamic_cast,将"指向base class object的pointers或references"转型为"指向derived class objects的pointers或references",并得知转型是否成功。如果转型原创 2021-03-11 14:38:26 · 139 阅读 · 0 评论 -
More Effective C++ 条款01:仔细区别pointers和references
仔细区别pointers(指针)和references(引用).首先,必须认识一点,没有所谓的null reference。一个reference必须总代表某个对象。所以如果你有一个变量,其目的是用来指向另一个对象,但是也有可能它不指向(代表)任何对象,那么就应该使用pointer,因为可以将pointer设置为null.如果一个变量总是必须代表一个对象,如果设计不允许这个变量为null,那么你应该使用reference。reference必须有初值。指针没有这样的限制。pointers可以被重新原创 2021-03-11 13:25:44 · 166 阅读 · 0 评论