![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Effective C++ 学习笔记
文章平均质量分 80
LuxiZheng_
这个作者很懒,什么都没留下…
展开
-
《Effective C++》学习笔记(条款53:不要轻忽编译器的警告)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!许多程序员习惯性的忽略编译器的警告。他们认为,如果问题很严重,那么编译器应该给一个错误而不是警告。这种想法在C++是不可取的,以一个例子来说明:class B{public: virtual void f() const;};class D: public B{public: virtual void f();};这里希望 D::f()重新定义 虚函数原创 2021-11-27 16:29:11 · 341 阅读 · 0 评论 -
《Effective C++》学习笔记(条款51:编写 new 和 delete 时需固守常规)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!条款50 讨论了什么时候需要自定义 operator new 和 operator delete,现在本条款来讨论在自定义时需要遵守的规则。从operator new开始:实现一致性 operator new 必须返回正确的值内存不足时必须调用 new-handling 函数(见条款49)必须有对付零内存需求的准备避免不慎掩盖正常形式的 new这比较偏近 class原创 2021-11-24 22:37:08 · 862 阅读 · 0 评论 -
《Effective C++》学习笔记(条款52:写了placement new 也要写 placement delete)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!placement new 和 placement delete 在C++中并不常见,如果你不熟悉它们,也不用担心。当你写一个 new 表达式时:Widget* pw = new Widget;共有两个函数被调用:一个是以分配内存的 operator new,一个是 Widget 的默认构造函数。假如第一个函数调用成功,但第二个函数却抛出异常,这时需要释放第一步分配得到的内存,原创 2021-11-24 22:35:54 · 955 阅读 · 0 评论 -
《Effective C++》学习笔记(条款49:了解new-handler的行为)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!当 operator new 无法满足某一内存分配时,就会抛出异常。以前它会返回NULL指针,某些旧式编译器目前也还这么做。在operator new抛出异常以前,会先调用一个客户指定的错误处理函数:new-handler。(这其实并非全部事实,operator new 真正做的事更复杂,见条款51)。为了指定这个“用以处理内存不足”的函数,客户必须调用 set_new_handle原创 2021-11-23 22:44:38 · 676 阅读 · 0 评论 -
《Effective C++》学习笔记(条款50:了解new和delete的合理替换时机)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!有人会想要替换掉编译器提供的 operator new 或 operator delete,有三个理由:用来检测运用上的错误。如果将“new 所得内存” delete 掉却失败,会导致内存泄漏。如果在“new 所得内存”身上多次 delete 会导致不确定行为。使用编译器提供的operator new和operator delete不能检测上述行为。如果 operator new原创 2021-11-23 22:42:40 · 435 阅读 · 0 评论 -
《Effective C++》学习笔记(条款46:需要类型转换时请为模板定义非成员函数)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!条款24提到过为什么 非成员函数 才有能力“在所有实参身上实施隐式类型转换”,本条款接着那个Rational例子来讲,把 Rational和 operator*模板化:template<typename T>class Rational {public: Rational(const T& numerator = 0,const T& deno原创 2021-11-22 23:00:17 · 460 阅读 · 0 评论 -
《Effective C++》学习笔记(条款47:请使用traits class表现类型信息)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!STL主要由“用以表现容器、迭代器和算法”的 模板 构成,也包括若干工具性质的 模板 ,其中有一个 advance 用来将迭代器移动某个给定距离:template<typename IterT, typename DistT>void advance(IterT& iter, DistT d); //d大于零,迭代器向前移动d单位,小于零则向后移动一般来原创 2021-11-22 22:58:47 · 399 阅读 · 0 评论 -
《Effective C++》学习笔记(条款48:认识 template 元编程)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!模板元编程(template metaprogramming,TMP)是编写 template-base C++ 程序并执行于编译期的过程。即用C++写的模板程序,编译器编译具现化的过程。一旦TMP程序结束执行,从 templates 具体化出来C++源码,也会一如往常地被编译。TMP的好处:第一,它让某些事情更容易;第二,由于 模板元编程 执行于C++编译期,因此可将工作从运行期转原创 2021-11-22 22:57:26 · 652 阅读 · 0 评论 -
《Effective C++》学习笔记(条款43:学习处理模板化基类内的名称)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!假设我们有一个程序,它能够传送信息到若干不同的公司去。信息要么被加密,要么就是未加密。如果在编译期间我们拥有足够的信息来决定哪一个信息传至哪家公司,就可以采用基于 template 的方法:class CompanyA {public: ... void sendCleartext(const std::string& msg); void send原创 2021-11-21 22:35:07 · 690 阅读 · 0 评论 -
《Effective C++》学习笔记(条款44:将与参数无关的代码抽离 templates)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!模板是节省时间和避免代码重复的好方法:类模板:只需要实现一个类模板,编译器会具现化类模板里的 成员函数(类模板里的 成员函数只有在被使用时才暗中具现化,所以只有类模板里的 成员函数都被使用,你才能获得类模板里的全部 成员函数)函数模板:只需要一个函数模板,编译器就能实现许多不同 template参数 的函数但使用 模板 会导致代码膨胀:其二进制码带着重复的代码、数据、或两者都原创 2021-11-21 22:29:53 · 527 阅读 · 0 评论 -
《Effective C++》学习笔记(条款45:运用成员函数模板接受所有兼容类型)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!智能指针是”行为像指针“的对象,并提供指针没有的机能。真实指针做得很好得一件事是:支持隐式转换。如派生类指针隐式转换为基类指针,”指向 非常量对象“的指针可以转换为”指向 常量对象“的指针等到。如:class Top { ... };class Middle: public Top { ... };class Bottom: public Middle { ... };原创 2021-11-21 22:28:18 · 410 阅读 · 0 评论 -
《Effective C++》学习笔记(条款41:了解隐式接口和编译期多态)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!1 显式接口 和 运行期多态面向对象编程的世界总是以显示接口和运行期多态解决问题。举个例子,class Widget { //给个无意义的类public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize();原创 2021-11-20 22:45:44 · 474 阅读 · 0 评论 -
《Effective C++》学习笔记(条款42:了解 typename 的双重定义)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!声明 template 类型参数,class 和 typename 的意义完全相同,如:template<class T> class Widget; //使用 classtemplate<typename T> class Widget; //使用typename然而,C++并不总是把 class 和 typename 视为等价。有时候你一定得使用原创 2021-11-20 22:44:05 · 469 阅读 · 1 评论 -
《Effective C++》学习笔记(条款36:绝不重新定义继承而来的non-virtual函数)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!如果在基类中有一个 public 函数 mf,创建一个派生类对象 x ,然后创建一个基类指针指向 x 调用这个函数,创建一个派生类指针指向 x 调用这个函数,两者调用的函数相同,那么结果应该是一样的吗?一般来说会是一样的,但如果 mf 是个普通函数且派生类重新定义 mf 函数,将会遮掩基类的相应函数,通过派生类调用该函数,永远是派生类的版本,而非基类的版本。class B {pu原创 2021-11-14 21:50:15 · 277 阅读 · 0 评论 -
《Effective C++》学习笔记(条款37:绝不重新定义继承而来的默认参数值)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!我们可以将本条款的讨论局限于“继承一个带有默认参数的 虚函数”,而本条款成立的理由非常简单:虚函数 是动态绑定(又名后期绑定),而默认参数值却是静态绑定(又名前期绑定)。对象的所谓静态类型,就是它在程序中被声明使所采用的类型。看下面的 class 继承体系:class Shape {//用于描述几何形状的类public: enum ShapeColor { Red, G原创 2021-11-14 21:48:21 · 670 阅读 · 0 评论 -
《Effective C++》学习笔记(条款38:通过组合构造出has-a 或 “根据某物实现出”)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!组合(composition)是类型之间的一种关系,当某种类型的对象内含其它类型的对象,便是这种关系。如:class Address { ... };class PhoneNumber { ... };class Person { //Person对象由string、Address、PhoneNumber构成public: ...private: std::s原创 2021-11-14 21:47:01 · 435 阅读 · 0 评论 -
《Effective C++》学习笔记(条款39:谨慎使用 private继承)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!1 private继承 不是 is-a 关系条款32曾说过 public继承 是 is-a 关系,在那个例子中 Student 以 public 形式继承 Person 。我们现在使用那个例子的一部分,并以 private继承 替换 public继承:class Person { ... };class Student: private Person { ... }; //改用p原创 2021-11-14 21:45:51 · 490 阅读 · 0 评论 -
《Effective C++》学习笔记(条款40:谨慎使用 多重继承)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!一旦提到 多重继承(multiple inheritance,MI),C++社群便会分成两个基本阵营:如果 单一继承(single inheritance,SI)是好的,多重继承 一定更好单一继承 是好的,但 多重继承 不值得使用本条款的目的是让大家了解 多重继承 的两个观点,而不是比较哪个比较好。首先需要认清一件事:使用 多重继承 ,程序有可能充一个以上的 基类 继承相同原创 2021-11-14 21:43:17 · 627 阅读 · 0 评论 -
《Effective C++》学习笔记(条款32:确定你的public继承塑模出is-a关系)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!1 public 继承是一种 is-a 的关系以C++进行面向对象编程,最重要的一个规则是:public inheritance(公开继承)意味"is-a"的关系。如果你令 class D(派生类)以 public 形式继承 class B(基类),你便是告诉C++编译器(亦或是看你代码的人),每一个类型为D的对象同时也是一个类型为B的对象,反之则不成立。看以下例子:class原创 2021-11-13 22:47:26 · 393 阅读 · 0 评论 -
《Effective C++》学习笔记(条款33:避免遮掩继承而来的名称)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!1 同名变量分别在全局作用域和函数作用域这个题材和继承无关,而是和作用域(scope)有关,我们都知道在下面的代码中:int x; // global变量void someFunc(){ double x; // local变量 std::cin>>x; // 读一个值,赋给local变量}这个读取数据的语句指涉的原创 2021-11-13 22:45:49 · 359 阅读 · 0 评论 -
《Effective C++》学习笔记(条款34:区分接口继承和实现继承)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!public 继承是由两部分组成:函数接口继承函数实现继承当我们设计一个类时,有时候会希望 派生类 只继承成员函数的接口(就是声明),有时候又希望派生类同时继承函数的接口和实现,但又能控制是否可以 覆写(override)所继承的实现。我们看一个展现绘图程序各种几何形状的类继承体系:class Shape {//Shape是个抽象类,因为draw()是纯虚函数publ原创 2021-11-13 22:36:33 · 365 阅读 · 0 评论 -
《Effective C++》学习笔记(条款35:考虑虚函数以外的其他选择)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!假设你在制作一款游戏,游戏内的人物都有自己的生命值,而不同的人物会有不同的方式来计算它们健康指数,所以,需要将成员函数 healthValue() 设置为虚函数是非常正确的:class GameCharacter {public: virtual int healthValue() const; ...};healthValue() 并未被声明为纯虚函数,原创 2021-11-13 22:35:12 · 884 阅读 · 0 评论 -
《Effective C++》学习笔记(条款30:透彻了解 inlining 的内内外外)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!内联函数,它们看起来像函数,动作像函数,比宏好的多,可以调用它们又不需蒙受函数调用所招致的额外开销;编译器最优化机制通常被设计用来浓缩那些“不含函数调用”的代码,所以当你 inline 某个函数,或许编译器就因此有能力对它执行语境相关最优化。然而天下没有白吃的午餐,内联函数实质是将“对此函数的每一个调用”都以函数本体替换它,这样做可能会增加你的目标代码的大小,在一台内存有限的机器上,原创 2021-11-12 22:15:34 · 377 阅读 · 0 评论 -
《Effective C++》学习笔记(条款31:将文件间的编译依存关系降到最低)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!1 文件间的编译依存性假设你对 C++ 程序的某个 class 的实现文件做了些轻微的修改。注意,这里修改的并不是 class 接口,而是实现,而且只改 private 成分,然后重新 build 这个程序,你会发现所有的东西都需要重新编译和连接。这个问题的出现是因为C++并没有把"将接口从实现中分离"做的很好。Class 的定义式却不仅仅只有接口,还有实现细目(这里指实现接口需要原创 2021-11-12 22:14:20 · 350 阅读 · 0 评论 -
《Effective C++》学习笔记(条款28:避免返回handles指向对象内部成分)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!假如我们写一个表示矩形的类Rectangle,这个矩形由左上角和右下角的顶点坐标表示。为了表示这两个点,我们写一个表示点的类:class Point{ public: Point(int x, int y); void setX(int newVal); void setY(int newVal); ... };为了矩形类尽可能小,把两个点放原创 2021-11-11 21:43:45 · 166 阅读 · 0 评论 -
《Effective C++》学习笔记(条款29:为“异常安全”而努力是值得的)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!假如我们在给一个GUI写一个可更换背景的菜单类。这个类用于多线程环境,所以它有个互斥锁(mutex)作为并发控制之用:class PrettyMenu{public: ... void changeBackground(std::istream& imgSrc);private: Mutex mutex; //互斥锁 Image* bgIm原创 2021-11-11 21:42:36 · 3355 阅读 · 0 评论 -
《Effective C++》学习笔记(条款24:若所有参数皆需类型转换,请使用非成员函数)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!导读中提过令类支持隐式类型转换是不好的。但是这也是有例外的,最常见的例外就是在建立数值类型时,比如用一个类代表有理数,支持int的隐式转换为有理数是合理的。此外C++自己的内置类型也支持多种隐式转换,例如从int到double,那么我们也可以这样写这个有理数类:class Rational{public: Rational(int numerator = 0, int de原创 2021-11-10 21:55:37 · 286 阅读 · 0 评论 -
《Effective C++》学习笔记(条款25:考虑写出一个不抛异常的swap函数)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!swap函数是一个非常经典又有用的函数,除了它本身用来交换两个对象数值的功能,还可以用来实现异常安全的赋值,避免自赋值(见条款11)等等用途。在std标准库里,swap函数就是这样实现的:namespace std{ template<typename T> void swap(T& a, T& b) { T temp原创 2021-11-10 21:53:29 · 385 阅读 · 0 评论 -
《Effective C++》学习笔记(条款26:尽可能推迟变量定义)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!每当定义一个变量时,就会带来构造和析构的运行成本。因为代码运行到定义时会调用对象的构造函数,当离开作用域时便会调用析构函数。即使我们不使用这个变量,仍需耗费这些成本。或许我们会认为,我们不可能定义一个不使用的变量,但这还是有可能发生的,看下面的例子:string encryptPassword(const string& password){ using namesp原创 2021-11-10 21:51:10 · 402 阅读 · 0 评论 -
《Effective C++》学习笔记(条款27:尽量少做类型转换)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!C++的语法是被设计成类型安全的。如果你的程序通过了编译并没有发出警告信息,就表示它并不企图在任何对象身上执行任何不安全、无意义、愚蠢荒谬的操作。但类型转换(cast)破坏了类型系统的安全性,C++中的类型转换不像C、Java或C#中的类型转换风险低,所以我们需要小心谨慎使用类型转换。C++中的类型转换有三种不同的方式:(T)expression; //将express原创 2021-11-10 21:49:26 · 615 阅读 · 0 评论 -
《Effective C++》学习笔记(条款19:设计class犹如设计type)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!新type的对象应该如何被创建和销毁?这决定了你如何实现构造函数和析构函数,包括要使用什么方式分配内存和释放内存,即new还是new[],delete还是delete[]。(见条款16)对象的初始化和对象的赋值该有什么样的差别?这决定你如何实现构造函数和赋值操作符的行为以及其间的差异。重要的是别混淆了”初始化“和”赋值“,因为它们对应于不同函数的调用(见条款4)。新原创 2021-11-10 00:08:17 · 302 阅读 · 0 评论 -
《Effective C++》学习笔记(条款20:宁以 pass-by-reference-to-const 替换 pass-by-value)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!通常情况下,C++是以值传递(pass-by-value)的方式传递对象至函数,除非你另外指定,否在函数参数都是以实参的复件为初值,而调用函数返回的对象也是函数返回值的一个复件。这些复件是由对象的拷贝构造函数产出的,这使得值传递的成本很高(费时)。class Person{public: Person(); virtual ~Person(); //见条款7为什么原创 2021-11-09 23:34:46 · 141 阅读 · 0 评论 -
《Effective C++》学习笔记(条款21:必须返回对象时,别妄想返回其reference)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!在上一条条款中,我们了解到引用传递的高效率,但这并不说明值传递是无用的,若一心只想着使用引用传递,可能会犯下一个致命的错误:开始传递一些引用指向并不存在的对象。设计一个表示有理数的类,内含一个函数用来计算两个有理数的乘积。class Rational{ //表示有理数的类public: Rational(int numerator = 0, int denominato原创 2021-11-09 23:31:34 · 221 阅读 · 0 评论 -
《Effective C++》学习笔记(条款22:将成员变量声明为private)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!不为什么不采用 public 成员变量呢?首先从语法一致性(见条款18)开始。若成员变量不是 public ,用户只能通过成员函数来访问它。如果 public 域内都是函数,用户就不需要在访问 class 成员时迷惑地试着记住是否使用小括号()。或许一致性地理由还不足以让人信服,那么从读写访问权限方面解释。如果成员变量声明为 public ,那么每个人都可以读写它,但是成员变量声明原创 2021-11-09 23:30:16 · 195 阅读 · 0 评论 -
《Effective C++》学习笔记(条款23:宁以非成员非友元函数替换成员函数)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!假设用一个 class 来表示网页浏览器,这样的 class 中有清除缓存、清除历史纪录以及清除cookies:class WebBrowser{public: void clearCache(); void clearHistory(); void removeCookies(); //把调用上述的三个函数的操作封装到一个函数内 void原创 2021-11-09 23:28:50 · 233 阅读 · 0 评论 -
《Effective C++》学习笔记(条款15:在资源管理类中提供对原始资源的访问)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!在资源管理类中存储了我们的原始资源,保证了我们的原始资源必定会执行某些操作,但是有时我们需要用到我们的原始资源,所以资源管理类需要提供对原始资源的访问。如条款13中的投资的例子,我们现在需增加一个获得投资天数的接口int daysHeld(const Investment* pi); //返回某个Investment对象的投资天数shared_ptr<Investment&原创 2021-11-09 23:25:32 · 209 阅读 · 1 评论 -
《Effective C++》学习笔记(条款16:成对使用new和delete时采取相同形式)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!C++中要求通过关键字 new 出来的对象,不使用的时候要通过关键字 delete 将对象的资源释放,不然会导致内存泄漏。当你使用 new ,有两件事发生,一是内存被分配出来,二是针对此内存会有一个(或更多)构造函数被调用。当你使用 delete ,也有两件事发生,一是针对此内存会有一个(或更多)析构函数被调用,然后内存才被释放。delete 的最大问题在于:即将被删除的内存究竟村有原创 2021-11-09 23:24:12 · 136 阅读 · 0 评论 -
《Effective C++》学习笔记(条款17:以独立语句将newed对象置入智能指针)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!假设我们有个函数用来表示处理程序的优先权,另一个函数用来在某动态分配所得的 Widget 上进行某些带有优先权的处理:int priority();void processWidget(shared_ptr<Widget> pw, int priority);//调用形式一:错误的,参数不匹配,编译器报错processWidget(new Widget, prio原创 2021-11-09 23:21:14 · 129 阅读 · 1 评论 -
《Effective C++》学习笔记(条款18:让接口容易被正确使用,不易被误用)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!设计一个好接口必须遵守三条规则:必须考虑用户可能做出什么样的错误要把接口设计得一致不要要求用户记得必须做某事必须考虑用户可能做出什么样的错误:欲开发一个”容易被正确使用,不容易被误用“的接口,首先必须考虑用户可能做出什么样的错误。假设你为一个用来表现日期的类设计构造函数:class Date{public: Date(int month, int day, i原创 2021-11-09 23:19:24 · 146 阅读 · 0 评论 -
《Effective C++》学习笔记(条款14:在资源管理类中小心拷贝操作)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!条款13中描述了使用智能指针来管理基于堆分配的资源,然而并非所有资源都是基于堆分配的,对那种资源而言,像 shared_ptr 这样的智能指针往往不适合作为资源管理者,所以需要建立自己的资源管理类。加入我门正在使用互斥锁 Mutexvoid lock(Mutex* pm); //锁住pm指向的锁void unlock(Mutex* pm); //解锁pm指向的锁为了原创 2021-11-09 23:16:57 · 139 阅读 · 0 评论