Effective C++ 条款15 在资源管理类中提供对原始资源的访问 条款15 : 在资源管理类中提供对原始资源的访问 我们将资源存入资源管理类, 为的是可以免去资源管理的麻烦, 但同时我们也希望可以正常合理地通过资源管理类来使用资源, 就像直接使用资源一样, 为此我们一定需要在资源管理类中提供对原始资源的访问; 我们先来解答一些疑问 : 为什么要对原始资源进行访问(为什么要获取原始资源的指针)?有时候需要我们传递原始资源的指针, 因为很多C API都是要求传 2024-11-30 #Effective C++
Effective C++ 条款14 在资源管理类中小心 copying 行为 条款14 : 在资源管理类中小心 copying 行为 本条款是在我们自己建立资源管理类时要注意的行为, 但是归根结底, 我们为什么要自己建立资源管理类呢 ? 为什么不用 shared_ptr ? 这是我们在本条款中需要首先解决迭代问题. 书中提出, C++提供的智能指针是适配于heap-based资源上的, 其要求不管是自动生成还是手动完成, 该资源必须要有析构函数, 然而并非所有的资源都是h 2024-11-30 #Effective C++
Effective C++ 条款13 以对象管理资源 条款13 : 以对象管理资源 所谓资源, 一旦用了它, 将来必须还给系统. 本条款及以后几项条款都致力于实现优秀的资源管理, 严守这些条款, 可以几乎消除资源管理问题. 本条款主要提出以对象管理资源的思想, 以及对std内置的auto_ptr和smart_prt的使用策略做了分析. 书中塑模了一个投资行为, 让我们看看资源该如何处理 : 12345678910class Investment 2024-11-30 #Effective C++
Effective C++ 条款10-12 拷贝与赋值 条款10 : 令 operator= 返回一个 reference to * this 很多类都有重写operator=函数的要求, 本质是 = 左侧调用 operator= 函数, 右侧作为参数传入, 将右侧参数赋值给左侧成员变量, 并且为了实现连锁赋值, 我们还应当使 operator= 返回当前赋完值的对象. 本条款的目的是实现连锁赋值, 2024-11-30 #Effective C++
Effective C++ 条款9 绝不在构造和析构函数过程中调用 条款09 : 绝不在构造和析构函数过程中调用virtual函数开门见山阐释本条款的重点 : 你不该在构造函数和析构函数中调用virtual函数. 书中给出了一个例子 : 假如我们要塑膜股市交易订单模型, 订单可以分成买入, 卖出等不同类型的订单, 当我们产生不同类型的订单, 也就是构造不同类型订单对象时, 我们也许会有记录订单日志的需求, 并我们希望订单根据不同的订单类型产生不同的订单日志. 于是 2024-11-30 #Effective C++
Effective C++ 条款8 析构函数的异常管理 条款08 : 别让异常逃离析构函数 日常编程中,常见异常通常由以下原因引发: 资源管理不当(如内存泄漏, 文件操作, 连接或断开连接失败)。 边界和合法性检查不足(如数组越界、除以零)。 并发编程问题(如死锁、数据竞争)。 类型不匹配或错误的操作。 本条款主要讨论的是析构函数的异常管理, 为什么会不希望异常逃离析构函数, 因为析构函数是一个必须执行且有可能失败的函数, 因为内存泄漏, 文件操 2024-11-30 #Effective C++
Effective C++ 条款7 virtual析构函数 条款07 : 为多态基类声明virtual析构函数 说到多态, 我们应当非常了解其运行时绑定的机制, 简单来说就是我们可以在任何时候根据用户的需求将基类绑定为不同的派生类, 用相同的操作实现不同的效果, 这其中virtual函数起到了至关重要的作用, 每一个含有虚函数的类都会维护一个虚表, 以此实现基类到派生类的动态绑定. 这里书中提到了一个重要又经常发生的问题 : 如果drived clas 2024-11-30
Effective C++ 条款5-6 默认成员函数 条款05 了解C++默默编写并调用哪些函数 编译器会默认为class创建default构造函数, 析构函数, copy构造函数, 赋值操作符重载, 这算是我们C++语言基础学习中的重中之重, 这里就不再过多阐释. 书中提出一点 : 如果我们在实际使用中确实没有使用到某些默认成员函数, 编译器很大可能也不会自动创建对应的默认函数(例如copy构造函数, 赋值操作符重载). 书中还提出了三种编译器 2024-11-30
Effective C++ 条款4 初始化 条款04 确定对象被使用前已先被初始化 本条讨论如何安全高效地实现初始化, 当然也有一些条件奇葩的初始化值得我们去讨论 普通变量初始化12345int x = 0;cont char text[] = "hello";double d;cin >> d; // 这种也叫初始化 类内变量初始化类内变量的初始化一般就是三种, 类内设置初始值, 缺省值 , 初始 2024-11-29
Effective C++ 条款3 const 条款03 : 尽可能使用const const(不可被改动), 是一种非常有效且多样的语义约束, 有了这项约束, 我们可以借用编译器之手规范我们的代码, 以免带来意想不到的错误, 毕竟任何的改动都会伴随着一定的风险, 如果可以提前规避, 我们何乐而不为呢? const在实际表现上是多才多艺的, 他可以修饰对象, 对象指针, 甚至成员函数, 接下来逐一介绍 : const 修饰变量1const 2024-11-29