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 · 423 阅读 · 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 · 401 阅读 · 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 · 326 阅读 · 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 · 276 阅读 · 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 · 290 阅读 · 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 · 251 阅读 · 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 · 286 阅读 · 0 评论 -
条款 10:令 operator= 返回一个 reference to *this
条款 10:令 operator= 返回一个 reference to *this Have assignment operators return a reference to *this. 为了下列实现“连锁赋值”,需要令赋值操作符返回一个操作符左侧实参的引用 a = b = c = 15; Widget& operator=(const Widget& ths) { ...原创 2020-04-28 22:22:55 · 316 阅读 · 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 · 361 阅读 · 0 评论 -
条款 08:别让异常逃离析构函数
条款 08:别让异常逃离析构函数 Prevent exceptions from leaving destructors. 如果析构函数吐出异常,可能导致不明确行为,如下面 vector 销毁时会调用所有元素的析构函数,这会导致不明确行为 class A { ... ~A() {...} // 假设析构函数会吐出异常 }; void f() { std::vector...原创 2020-04-16 21:58:29 · 305 阅读 · 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 · 290 阅读 · 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 · 305 阅读 · 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 · 295 阅读 · 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 · 265 阅读 · 0 评论 -
条款 03:尽可能使用 const
条款 03:尽可能使用 const Use const whenever possible const 修饰指针和常量 char greeting[] = "Hello"; char* p = greeting; // non-const pointer, non-const data const char* p = greeting; // non-const pointer, ...原创 2020-04-14 22:25:21 · 256 阅读 · 0 评论 -
条款 02:尽量以 const,enum,inline 替换 #define
条款 02:尽量以 const,enum,inline 替换 #define Prefer consts,enums,and inlines to #defines. 宁可以编译器替换预处理器 #define ASPECT_RATIO 1.653 也许 ASPECT_RATIO 不会被编译器感知,即可能提前被预处理器移走了,导致 ASPECT_RATIO 可能没进入记号表(symbol ta...原创 2020-04-06 17:18:38 · 341 阅读 · 0 评论 -
条款 01:视 C++ 为一个语言联邦
条款01:视 C++ 为一个语言联邦 View C++ as a federation of languages. C++ 次语言组成部分 C Objectc-Oriented C++ Template C++ STL C++ 高效守则依情况变化,取决于使用哪一部分。如内置类型(C-like)pass-by-value 通常比 pass-by-reference 高效,而对于 Objec...原创 2020-04-06 17:16:37 · 419 阅读 · 0 评论
分享