![](https://img-blog.csdnimg.cn/20200406172208165.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Effective C++
Effective C++
哈士奇超帅
我变秃了 也变强了
展开
-
条款 17:以独立语句将 newed 对象置入智能指针
条款 17:以独立语句将 newed 对象置入智能指针Store newed objects in smart pointers in stanalone statements.processWidget(std::shared_ptr<Widget>(new Widget), priority());上述代码可能引起资源泄露,因为该行代码会执行三件事:调用 priority执行 new Widget调用 std::shared_ptr 构造函数编译器能够保证 new W原创 2020-05-20 22:43:40 · 288 阅读 · 0 评论 -
条款 16:成对使用 new 和 delete 是要采用相同形式
条款 16:成对使用 new 和 delete 是要采用相同形式Use the same form in corresponding uses of new and delete.std::string * stringArray = new std::string[100];delete stringArray;上面程序会产生未定义行为,至少后 99 个 string 的析构函数不会被调用,需要成对使用 new/delete 和 new []/delete []需要注意尽量减少下列 typ原创 2020-05-20 22:42:51 · 247 阅读 · 0 评论 -
条款 15:在资源管理类中提供对原始资源的访问
条款 15:在资源管理类中提供对原始资源的访问Provide access to raw resources in resource-managing classes.int dausHeld(const Invectment*);有些 API 会需要直接指涉资源,通常情况是参数为某对象指针,此时要求资源管理类能够返回原始资源的指针资源管理类提供原始资源的指针,通常是 get() 函数,如 shared_ptr 和 auto_ptr 实现一般对原始资源的转换由显示转换或者隐式转换来实现,一般原创 2020-05-20 22:40:33 · 206 阅读 · 0 评论 -
条款 14:在资源管理类中小心 copying 行为
条款 14:在资源管理类中小心 copying 行为Think carefully about copying behavior in resource-managing classes.class Lock{public: explict Lock(Mutex* pm) : _mutexPtr(pm) { lock(_mutexPtr); } ~Lock() { unlock(_mutexPtr); }private: Mutex* _mutexPtr;};Mu原创 2020-05-20 22:39:55 · 169 阅读 · 0 评论 -
条款 13:以对象管理资源
条款 13:以对象管理资源Use objects to manage resources.依赖人为的 delete 掉 new 出来的资源,基本是行不通的,忘记、过早 return、代码修改等都会引起资源没有被正确释放导致内存泄露以对象管理资源的两个关键想法:获得资源后立即放入对象,这个观念又被称为:资源取得时机便是初始化时机,即 RAII(Resource Acquisition Is Initialization)管理对象运用析构函数确保资源被释放void f(){ std原创 2020-05-20 22:39:08 · 152 阅读 · 0 评论 -
条款 12:复制对象时勿忘其每一个成分
条款 12:复制对象时勿忘其每一个成分Copy all parts of an object.当 class 添加新变量时,所有 copy、copy assignment 函数需要处理这些成员变量的复制存在继承关系时,derived class 的 copy 和 copy assignment 函数务必要调用父类的相关复制函数,确保所有成员变量被处理copy 函数与 copy ass...原创 2020-04-28 22:24:18 · 158 阅读 · 0 评论 -
条款 11:在 operator= 中处理“自我赋值”
条款 11:在 operator= 中处理“自我赋值”Handle assignment to self in operator=.什么是自我赋值“自我赋值”发生在对象赋值给自己时class Widget { ... };Widget w;...w = w; // 赋值给自己// 潜在的自我赋值a[i] = a[j];// 潜在的自我赋值*px = *py;// ...原创 2020-04-28 22:23:49 · 184 阅读 · 0 评论 -
条款 10:令 operator= 返回一个 reference to *this
条款 10:令 operator= 返回一个 reference to *thisHave assignment operators return a reference to *this.为了下列实现“连锁赋值”,需要令赋值操作符返回一个操作符左侧实参的引用a = b = c = 15;Widget& operator=(const Widget& ths){ ...原创 2020-04-28 22:22:55 · 190 阅读 · 0 评论 -
条款 09:绝不在构造和析构过程中调用 virtual 函数
条款 09:绝不在构造和析构过程中调用 virtual 函数Never call virtual functions during construction or destruction.假设子类各有不同的记录日志实现,有可能会出现下面这种代码class T {public: T(); virtual void Log() const = 0;};T::T() {...原创 2020-04-16 22:52:32 · 251 阅读 · 0 评论 -
条款 08:别让异常逃离析构函数
条款 08:别让异常逃离析构函数Prevent exceptions from leaving destructors.如果析构函数吐出异常,可能导致不明确行为,如下面 vector 销毁时会调用所有元素的析构函数,这会导致不明确行为class A { ... ~A() {...} // 假设析构函数会吐出异常};void f() { std::vector...原创 2020-04-16 21:58:29 · 180 阅读 · 0 评论 -
条款 07:为多态基类申明 virtual 析构函数
条款 07:为多态基类申明 virtual 析构函数Declare destructors virtual in polymorphic base classes.class TimeKeeper {public: TimeKeeper(); ~TimeKeeper(); ...};class AtomicClock : public TimeKeeper {...原创 2020-04-14 23:30:21 · 157 阅读 · 0 评论 -
条款 06:若不想使用编译器自动生成的函数,就该明确拒绝
条款 06:若不想使用编译器自动生成的函数,就该明确拒绝Explicitly disallowa the use of compiler-generated functions you do not want.如何阻止编译器自定生成 copy 构造函数和 copy assignment 函数?申明成员函数为 private 且不实现class A{public: ...p...原创 2020-04-14 22:33:08 · 178 阅读 · 0 评论 -
条款 05:了解 C++ 默默编写并调用了哪些函数
条款 05:了解 C++ 默默编写并调用了哪些函数Know what functions C++ silently writes and calls.C++ 编译器会自动创建哪些函数对于一个空类,编译器可能默默生成下面四个函数。class A {};class A {public: A() {...} A(const A& rhs) {...} ~...原创 2020-04-14 22:32:33 · 186 阅读 · 0 评论 -
条款 04:确定对象被使用前已被初始化
条款 04:确定对象被使用前已被初始化Make sure that objects are initialized before thre’re used.c++ 不保证下面语境初始化int x;class Point{ int x, y;};Point p;某些语境会被初始化为0,某些语境不能保证。一般的,如果是 C part of C++,而且初始化会招致运...原创 2020-04-14 22:31:57 · 155 阅读 · 0 评论 -
条款 03:尽可能使用 const
条款 03:尽可能使用 constUse const whenever possibleconst 修饰指针和常量char greeting[] = "Hello";char* p = greeting; // non-const pointer, non-const dataconst char* p = greeting; // non-const pointer, ...原创 2020-04-14 22:25:21 · 148 阅读 · 0 评论 -
条款 02:尽量以 const,enum,inline 替换 #define
条款 02:尽量以 const,enum,inline 替换 #definePrefer consts,enums,and inlines to #defines.宁可以编译器替换预处理器#define ASPECT_RATIO 1.653也许 ASPECT_RATIO 不会被编译器感知,即可能提前被预处理器移走了,导致 ASPECT_RATIO 可能没进入记号表(symbol ta...原创 2020-04-06 17:18:38 · 197 阅读 · 0 评论 -
条款 01:视 C++ 为一个语言联邦
条款01:视 C++ 为一个语言联邦View C++ as a federation of languages.C++ 次语言组成部分CObjectc-Oriented C++Template C++STLC++ 高效守则依情况变化,取决于使用哪一部分。如内置类型(C-like)pass-by-value 通常比 pass-by-reference 高效,而对于 Objec...原创 2020-04-06 17:16:37 · 268 阅读 · 0 评论