
Effective C++
哲这这
微信:asd_zhe
展开
-
条款09:绝不在构造和析构过程中调用virtual函数
// 条款09: 绝不在构造和析构过程中调用virtual函数。#include #include using namespace std;// 1.例如一个对象在创建和销毁的时候必须要执行另一个行为。// 这样做的目的是base class 中的LogTransaction作为Virtual,子类中只需要重写这个函数,那么就能// 在每个子类创建对象的时候都能调用这个函数,因为原创 2017-08-07 22:59:35 · 314 阅读 · 0 评论 -
条款14:在资源管理类中小心copying行为
// 条款14: 在资源管理类中小心copy行为// 1.复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。// 2.普遍而常见的RAII class copying行为是:抑制copying、施行引用计数法(reference counting)。// 不过其他行为也都可能被实现。#include #include cl原创 2017-10-18 21:43:23 · 339 阅读 · 0 评论 -
条款15:在资源管理类中提供对原始资源的访问
// 条款15: 在资源管理类中提供对原始资源的访问// 这一条款的作用在于,前面的条款提到使用RAII管理类来管理对象,// 使得对象自动的释放内存,或者自动的加锁解锁等自动操作行为。// 但是原来的对象都被封装到管理类了,所以管理类需要提供对原始资源的访问渠道。// 1.APIs往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理之资源”的办法。// 2.原创 2017-10-18 21:44:22 · 288 阅读 · 0 评论 -
条款16:成对使用new和delete时要采取相同形式
// 条款16: 成对使用new和delete时要采用相同的形式// 1.如果在new表达式中使用[],必须在相应的delete表达式中使用[]。如果// 在new表达式中不使用[],一定不要再相应的delete表达式中使用[]。// 2.new一个对象会有两个行为,第一个是内存被分配出来,第二是针对此内存会有一个// 或多个构造函数被调用。// 3.delete一个对象也会有两个行为,原创 2017-10-18 21:45:31 · 314 阅读 · 0 评论 -
条款17:以独立语句将newed对象置入智能指针
// 条款17: 以独立的语句将newed对象置入智能指针。// 1.以独立语句将newed对象存储于智能指针内。如果不这样做,一旦异常被抛出,// 有可能导致难以察觉的资源泄漏。// 2.智慧名言:以对象管理资源。所以用智能指针管理Widget#include #include int GetPriority() { return 1;}class Widget17 {原创 2017-10-18 21:46:19 · 275 阅读 · 0 评论 -
条款18:让接口容易被正确使用,不易被误用
// 条款18: 让接口容易被正确使用,不易被误用// 1.好的接口很容易被使用,不容易被误用。应该在所有的接口中努力达成这些性质。// 2.“促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。// 3.“阻止误用”的办法包括建立新类型、限制类型上的操作,数据对象值,以及消除客户的资源管理责任。// 4.tr1::shared_ptr支持定制型删除器。这可防范DLL问题,可被原创 2017-10-18 21:47:13 · 308 阅读 · 0 评论 -
条款19:设计class犹如设计type
// 条款19: 设计class犹如设计type// 1.新type的对象应该如何被创建和销毁?// 2.对象的初始化和对象的赋值应该有什么样的长别?// 3.新type的对象如果被passed by value,意味这什么?// 4.什么是新type的“合法值”?// 5.你的新type需要配合某个继承图系吗?// 6.你的新type需要什么样的转换?// 7.什么样的操作符和函原创 2017-10-18 21:48:44 · 257 阅读 · 0 评论 -
条款20:宁以pass-by-reference-to-const替换pass-by-value
// 条款20: 宁以pass-by-reference-to-const替换pass-by-value// 1.尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,可避免切割问题。// 2.以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value往往比较恰当。#include #includ原创 2017-10-18 21:49:40 · 491 阅读 · 0 评论 -
条款21:必须返回对象时,别妄想返回其reference
// 条款21: 必须返回对象时,别妄想返回其reference// 绝不要返回pointer或reference指向一个local stack对象,会返回reference指向// 一个heap-allocated对象,或返回pointer或reference指向一个local static对象// 而有可能同时需要多个这样的对象。条款4已经为“在单线程环境中合理返回reference/原创 2017-10-19 22:08:08 · 272 阅读 · 0 评论 -
条款22:将成员变量声明为private
// 条款22: 将成员变量声明为private// 1. 切记将成员变量声明为private。这可赋予客户访问数据的一致性、可细微划分// 访问控制、允诺约束条件保证,并提供class坐着以充分的实现弹性。// 2.protected并不比public更具封装性。// 3.首先是语法的一致性,当客户访问成员变量时,不用考虑直接访问变量,还是通过函数来访问,// 在java中就有这样的原创 2017-10-19 22:09:13 · 345 阅读 · 0 评论 -
条款13:以对象管理资源
// 条款13: 以对象管理资源// 1.为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源.// 2.两个常被使用的RAII classes 分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,// 因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null.// 3.TR1(Technical R原创 2017-10-18 21:42:34 · 291 阅读 · 0 评论 -
条款12:复制对象时勿忘其每一个成分
// 条款12: 复制对象时勿忘记其每一个成分// 这里将copy构造函数和copy assignment操作符统称为copying函数。// 1.Copying函数应该确保复制“对象内的所有成员变量”及“所有base class成分”。// 2.不要尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,// 并由两个copying函数共同调用。cop原创 2017-10-18 21:41:16 · 282 阅读 · 0 评论 -
条款08:别让异常逃离析构函数
// 条款08: 别让异常逃离析构函数// 这个条款有歧义,并不是一定要在析构函数里面放异常,// 而是析构里面发生的异常不要抛出到析构外面去处理。#include #include using namespace std;// 1.析构函数吐出异常,程序可能过早结束或出现不明确行为。// 数据库连接类class DBConnection {public: static原创 2017-08-06 18:56:45 · 313 阅读 · 0 评论 -
条款10:令operator=返回一个refereglce to this
// 条款10: 令operator=返回一个reference to *this。// Have assignment operators return a reference to *this.// 这只是个良好的建议,这个建议被所有的内置类型和标准程序库提供的类型共同遵守。// 这个建议同样适用于+=,-=,*=等等。// 例如:class Widgets {public:原创 2017-08-07 23:01:34 · 270 阅读 · 0 评论 -
条款11:在operator=中处理“自我赋值
// 条款11: 在operator=中处理“自我赋值”// 1.确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。// 2.确保当对象自我赋值时operator=有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址、// 精心安排的语句顺序、以及copy-and-swap。// operator=自己给自己赋值的可能情景:// class Wi原创 2017-08-07 23:02:24 · 312 阅读 · 0 评论 -
条款01:视C++为一个语言联邦
// 条款01: 视C++为一个语言联邦// C++总共分为四块: C, Obgect-Oriented C++, Template C++, STL。// 这四块每块都有自己的规约,可能一种想法适用于一块但不适用于另一块。// 也就是说C++搞笑编程守则视状况而变化,取决于你使用C++的哪一部分;原创 2017-08-06 18:40:49 · 364 阅读 · 0 评论 -
条款02:尽量以consts,enum,inline替换#define
// 条款02: 尽量以const,enum,inline 替换#define// 尽可能的使用编译器而不是预处理器#include // 1. 定义class专属常量(用const代替define)// A. 不能用#define,因为define不重视作用域(scope)// B. 用const,static修饰。用const因为不能被改变,用static因为所有的对象共原创 2017-08-06 18:46:50 · 797 阅读 · 0 评论 -
条款03:尽可能使用const
// 条款03: 尽可能使用const#include #include #include // 1.用const 修饰函数的参数// 如果输入参数采用“指针传递”,那么加const修饰可以防止意外地改动该指针,起到保护作用。// 例如void StringCopy(char*strDestination, const char *strSource);// 如果输入参数采原创 2017-08-06 18:47:45 · 286 阅读 · 0 评论 -
条款04:确定对象被使用前已先被初始化
// 条款04: 确定对象被使用前已被初始化#include #include #include using std::string;using std::cout;using std::endl;using std::list;class Point04 {public: int a; int b;};// 1.不要混淆了赋值(assignment)和初始化(原创 2017-08-06 18:48:52 · 338 阅读 · 0 评论 -
条款05:了解C++默默编写并调用哪些函数
// 条款05: 了解C++默默编写并调用哪些函数// 编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符,以及析构函数// 唯有当这些函数被调用,它们才会被编译器创建出来#include #include using std::cout;using std::endl;using std::string;// 1.编原创 2017-08-06 18:50:06 · 290 阅读 · 0 评论 -
条款06:若不想使用编译器自动生成的函数,就该明确拒绝
// 条款06: 若不想使用编译器自动生成的函数,就该明确拒绝。#include // 防止编译器自动生成copy构造函数和copy assignment操作符的两种方法:// 1.将这两个函数声明为private,并且不实现它们。如果有人调用了它们在链接期会得到一个链接错误。// 2.专门设计一个阻止copying动作的base class,然后继承它。这样在编译期间就能发现错误。原创 2017-08-06 18:51:29 · 339 阅读 · 0 评论 -
条款07:为多态基类声明virtual析构函数
// 条款07: 为多态基类声明virtual析构函数// 1.C++明确指出,当子类对象经由一个基类指针删除,而该基类带着一个non-virtual析构函数,// 其结果未有定义。实际执行时通常发生的是对象的derived成分没有被销毁。也就是不光子类// 里面的成员变量可能没被销毁,而子类的析构函数也未能执行起来。而基类成分通常会被销毁,// 造成了一个诡异的“局部销毁”对象。/原创 2017-08-06 18:53:31 · 359 阅读 · 0 评论 -
条款23:宁以non-member、non-friend替换member函数
// 条款23: 宁以non-member、non-friend替换member函数。// 1.宁可拿non-member non-friend函数替换member函数。这样做可以增加封装性、// 包裹弹性和机能扩充性。class WebBrowser23 {public: void ClearCache(); void ClearHistory(); void RemoveCoo原创 2017-10-19 22:09:40 · 586 阅读 · 0 评论