Effective C++
lkq_primer
软件工程研二在读
展开
-
笔记:条款21: 必须返回对象时,别妄想返回其reference
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。以下代码中重写的operator* 以传值方式返回。效率低,内部调用构造函数,返回时调用拷贝构造、析构函数。例如下面代码调用了3次构造函数 1次拷贝构造 4次析构。(VS2015 debug版)class Rational {public: Rational(i...原创 2018-07-20 16:47:42 · 283 阅读 · 0 评论 -
笔记:条款28: 避免返回handles指向对象内部部分
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。注意以下代码中,外界通过调用B类的get函数可以修改B类中指针指向的成员,而get函数是个const,但其实那部分数据应该是不能改变的。class A {public: A(string&s) { a = s; } void set(string...原创 2018-07-20 16:44:14 · 177 阅读 · 0 评论 -
笔记:条款25: 考虑写出一个不抛出异常的swap函数
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。标准库std命名空间中 的swap定义如下:namespace std { template<typename T> void swap(T&a, T&b) { T temp(a); a = b; b = temp; }...原创 2018-07-20 00:13:19 · 386 阅读 · 2 评论 -
笔记:条款43: 学习处理模板化基类内的名称
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。当模板没有遇到继承时,下例可以编译通过。class companyA {public: void sendCleartext() { cout << "1" << endl; } void sendEncrypted() {...原创 2018-07-20 00:09:42 · 244 阅读 · 0 评论 -
笔记:条款40: 明智而审慎地使用多重继承
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。多重继承可能从一个以上的基类继承相同名称(如函数、typedef等等),例如下:class A {public: void check() { cout << "A" << endl; }};class B {privat...原创 2018-07-20 00:08:21 · 258 阅读 · 0 评论 -
笔记: 条款39: 明智而审慎地使用private继承
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。如果类之间的继承关系是private,编译器不会自动将一个继承类对象转换为一个基类对象。private继承意味着根据某物实现出,和复合的意义一样。通过使用复合+public继承使得继承的类无法继承它并重新定义它的虚函数,模拟java中的final或c#中的seal...原创 2018-07-20 00:06:44 · 276 阅读 · 0 评论 -
笔记:条款35: 考虑virtual函数以外的其它选择
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。使用non-virtual interface(NVI)手法,那是Template Method设计模式的一种特殊形式。它以public non-virtual成员函数包裹较低访问型(private或protected)的虚函数。例如:class A {pub...原创 2018-07-19 21:00:54 · 214 阅读 · 0 评论 -
笔记:条款33: 避免遮掩继承而来的名称
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。当发生继承时,如下所示,子类的mf1会遮挡父类中的mf1()和mf1(int), 编译器默认的行为是不允许父类中的重载函数派生到子类中,如果想在子类中使用父类中的重载函数,那么要在子类中使用using,本例中就是using A::mf1;class A {publ...原创 2018-07-19 20:58:16 · 173 阅读 · 0 评论 -
笔记: 条款31: 将文件间的编译依存关系降至最低
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。考虑如下程序, B.h的任何改变都会重新编译源文件,目的是解除接口和实现的耦合关系,有2种方法: Handle classes和Interface classes.第一种方法类似模拟java中的一种机制,不需要class的定义式就可以声明一个对象,本质上在java中声...原创 2018-07-19 20:56:08 · 372 阅读 · 0 评论 -
笔记:条款15: 在资源管理类中提供对原始资源的访问
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。一种方法是提供一个get函数,返回原始资源。另一种方法是提供隐式转换函数operator type() const { return xxx;}请记住API 往往要求访问原始资源(raw resource),所以每一个 RAII class 应该提供...原创 2018-07-19 20:09:38 · 196 阅读 · 0 评论 -
笔记:条款14: 在资源管理类中小心copying行为
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。当我们自己写一个使用RAII管理不在heap存储区中建立资源时,应该考虑当一个RAII对象被复制,会发生什么事情。大多数时候会选择两种可能:禁止复制 对底层资源祭出“引用计数法”正常的非heap存储区的RAII管理类如下:class Mutex {};void...原创 2018-07-19 20:08:34 · 188 阅读 · 0 评论 -
笔记:条款13: 以对象管理资源
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。考虑以下代码:void f() { Investment* pInv = creatInvestment(); ... ... delete pInv;}如果在…区域内抛出异常或出现return,则会导致没有释放资源,导致内存泄漏。解决此问题的方...原创 2018-07-19 20:05:47 · 195 阅读 · 0 评论 -
笔记:条款12: 复制对象时勿忘其每一个成分
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。 如果你声明自己的copying函数(拷贝构造,拷贝赋值),那么编译器在你做出错误的动作时不会告诉你,下面定义的copying函数没有对Defau赋值或初始化,而编译器不会管。class Defau {public: int i = 10;};class...原创 2018-07-19 20:03:54 · 184 阅读 · 0 评论 -
笔记:条款11: 在operator= 中处理“自我赋值”
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。有一份自我赋值不安全和异常不安全的代码如下:class Bitmap {};class Widget {private: Widget(Bitmap*pb):p(pb){ } Bitmap* p; //指向一个从heap分配而得的对象。 Widget...原创 2018-07-19 20:01:46 · 195 阅读 · 0 评论 -
笔记:条款9: 绝不在构造和析构过程中调用virtual函数
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。 我们原本认为构造子类对象时,如果在父类的构造函数中调用虚函数就会调用子类的虚函数,然而编译器会调用父类的虚函数,如果父类的虚函数是纯虚函数,编译器就会找不到父类虚函数的实现代码。 编译器对这种在父类中调用虚函数的做法的一个解决方案是:继承类对象...原创 2018-07-19 19:59:01 · 186 阅读 · 0 评论 -
笔记:条款4:确定对象被使用之前已先被初始化
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。重要的的类中的构造函数是赋值而不是初始化,对于类类型name,则是先初始化再赋值,对于内置类型nums,编译器不保证会初始化。class A { A(string&name, int nums) { name = name; nums = nums...原创 2018-07-19 19:53:32 · 160 阅读 · 0 评论 -
笔记: 条款45: 运用成员函数模板接受所有兼容类型
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。真实指针做得很好的一件事是,支持隐式转换,继承类指针可以隐式转换为基类指针,指向non-const对象的指针可以转换为指向const对象的指针。例如有下面的一个三层继承体系中的一些转换:class Top{};class Middle:public To...原创 2018-07-20 16:51:49 · 289 阅读 · 0 评论