Effective c++读书笔记
baidu_25539425
这个作者很懒,什么都没留下…
展开
-
effective c++条款01
C++主要由以下4个次语言构成 1.C语言:C++主要发展于C,这个就不用说了吧。区块,语句,预处理器,内置数据类型,数组,指针 2.面向对象的C++包含类的封装,继承,多态 3.Template C++即泛型编程 4.STL 其实就是一个泛型编程的库C++高效编程守则原则的变动取决于你使用它的哪个部分本来不想写这些的,但是如果对C++本身都不了解,怎么能更好的使用它呢原创 2018-04-09 12:03:23 · 148 阅读 · 0 评论 -
effective c++条款11
在 operator= 中处理自我赋值自我赋值发生在对象被赋值给自己时,比如w=w,但是更多的是隐性的自我赋值(不能一下子看穿的) 如果i=j,那么a[i]=a[j]算不算自我赋值呢 假设有这么一段代码class Bitmap {...}class Widget{public: ...private: Bitmap* pb;}//下面是operator=的代码Widg原创 2018-04-13 15:06:35 · 379 阅读 · 0 评论 -
effective c++条款10
令赋值操作符返回一个reference to *this如果赋值操作符不返回引用,那么它只能返回一个临时对象,用一个变量接收这个对象时还需要调用复制构造函数代码:#include <windows.h>#include <iostream>#include <string>#include <vector>using namespace std;class E04{ friend原创 2018-04-13 13:05:38 · 227 阅读 · 0 评论 -
effective c++条款09
在构造和析构函数期间,不要调用virtual函数(或者说调用了也不能显示出多态的行为),因为这类调用从不下降至derived class(派生类) 看如下代码:#include <windows.h>#include <iostream>using namespace std;class Base { public: Base() { OP原创 2018-04-13 12:11:06 · 290 阅读 · 0 评论 -
effective c++条款07
1.带多态性质的基类应该声明一个virtual析构函数,一个基类只要带有任何虚函数,都应该声明一个virtual析构函数 2.所有抽象类的析构函数都应该带有一份实现,否则链接器会报错(因为派生类的析构最终会调用到基类的析构函数,如果基类的析构函数没有提供实现,此时链接器找不到其实现,就会抱怨) 3.如果一个类不是被用作基类或者不是用于多态,则不应该声明virtual析构函数,因为声明之后,类的组原创 2018-04-11 22:20:44 · 202 阅读 · 0 评论 -
effective c++条款06
为驳回编译器自动提供复制构造函数和赋值构造函数的机能,可将相应的成员函数声明为private,但不予实现,或者使用像Uncopyable这样的base class也是一种做法为防止对象被复制或者赋值,只需声明赋值构造函数或者赋值构造函数而不提供实现,且把他们的保护属性设为private#include <Windows.h>#include <iostream>#include <string>原创 2018-04-11 00:11:56 · 151 阅读 · 0 评论 -
effective c++条款05
编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment函数看个例子#include <Windows.h>#include <iostream>#include <string>using namespace std;class E05{ friend ostream& operator<<(ostream& out, E05& e05原创 2018-04-10 23:23:44 · 185 阅读 · 0 评论 -
effective c++条款04_2
全局变量尽量少使 比如 我在一个文件中定义a=10,在另一个模块中定义b=a 此时你一定认为b=10 但是这里很可能不是10,因为不同模块的全局变量初始化是不确定的 有可能b先被初始化,那么b就是一个不确定的值了 所以,为了解决这个问题 我们需要在函数中使用局部静态变量 int get_a() { static int a = 1...原创 2018-04-10 16:35:31 · 161 阅读 · 0 评论 -
effective c++条款04-1
1.为内置类型进行手工初始化,C++不保证会初始化他们,这取决于你用的是C++的哪部分(STL自动初始化,C不会自动初始化) 2.构造函数最好使用成员初始化列表,而最好不要在构造函数本体内进行赋值操作,初始化列表列出的成员变量,其顺序最好和class声明时一样 3.为免除”跨编译单元之初始化次序”问题,请以local static 对象替代 non-local static变量第1条好理解,所有原创 2018-04-10 15:20:24 · 147 阅读 · 0 评论 -
effective c++条款03
const这个关键字非常的神奇,我们首先来剖析它的作用 它的作用范围类外可以修饰global或者namespac作用域中的常量,也可以修饰文件,函数,或者区块作用域中被声明为static的变量 或者修饰指针,或者修饰函数 在class内可以修饰内部的static或者non-static变量,成员函数的参数,成员函数本身,以及成员函数返回值得修饰在class外 修饰常量问题不大,比如con...原创 2018-04-10 00:55:34 · 194 阅读 · 0 评论 -
effective c++条款02
尽量以const,enum,inline 替代define 这条可以改为”宁可以编译器替换预处理器”比较好 首先#define 很方便,但是,它也存在很多问题 1.比如 #define ASPECT_RATIO 1.653 记号名称ASPECT_RATIO从未被编译器看见,因为它被预处理器替换掉了之后,才轮到编译器运行 如果出现问题,你只会在error里隐约看到1.653,如果 ASPEC原创 2018-04-09 23:58:14 · 353 阅读 · 1 评论 -
effective c++条款14
1.复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为 2.普遍而常见的的RAII class copying行为是:抑制copying,施行引用计数法第1条的意思是:我们要根据资源的copying行为去选择所用的管理类, 比如, 我之前有个类class Lock{public: explicit Lock(mutex* p原创 2018-04-15 10:31:21 · 374 阅读 · 0 评论 -
effective c++条款13
所谓资源就是,一旦用了它,将来必须还给系统 c++最常使用的资源就是动态分配内存,但内存只是你必须管理的众多资源之一,其他常见的资源还包括文件描述器,互锁器,图形界面中的画笔,画刷,字型,数据库连接,网络socket等等RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原创 2018-04-14 20:51:55 · 212 阅读 · 0 评论 -
effective c++条款12
1.Copying函数应该确保复制“对象内的所有成员变量”及所有”base class”成分 2.不要尝试以一个copying函数去实现另一个copying函数,应该将共同机能放进第三个函数中,由两个copying函数调用如果类中没有定义复制构造函数和赋值构造函数,编译器会为我们提供默认的赋值和复制构造函数,但是如果你自己定义了这些函数, 但是数据没有全部copy,编译器是不会提醒你的看下面的原创 2018-04-13 17:11:51 · 463 阅读 · 0 评论