Effective C++ 学习笔记
文章平均质量分 78
学习一下《Effective C++》,并记录一下自己的思考与总结。
四夕_日月
这个作者很懒,什么都没留下…
展开
-
Effective C++ 49,50
49.熟悉标准库。C++标准库很大。首先标准库中函数很多,为了避免名字冲突,使用命名空间std。而之前的库函数都存放于中,现在成为伪标准库。而不能直接将这些头文件全部直接添加命名空间,标准委员会只能重新创建了不带.h的头文件。对于C中头文件采用同样的方法,但是每个名字前添加一个c,如C中的变成了。旧的c++头文件是官方反对使用的,但旧的c头文件不是,为了保持对C的兼容性。如 是旧的C头文件原创 2014-10-11 00:32:27 · 1144 阅读 · 0 评论 -
Effective C++ 1-6
1.尽量用const 和inline 而不用#define:即尽量用编译器,而不是预处理。宏命令导致编译器永远看不到被声明为宏的符号名,而编译器的处理会进行一些错误判断,但预处理不会。如果出错,调试无法找到宏声明的错误来源,因为这些符号不存在于符号列表中。宏调用时会出错,如使用自加或自减操作符时。宏应该使用inline 内联函数代替。在类中可以使用enium来代替宏,如下,在类中声原创 2014-10-05 23:26:09 · 760 阅读 · 0 评论 -
Effective C++ 7
7.预先准备好内存不够的情况。new在无法完成内存分配请求时,会抛出异常,异常了要怎么办,这是一个很现实且以后绝对要碰到的问题。在c中一般使用宏来分配内存并检测分配是否成功,c++中类似以下函数:#define NEW(PTR,TYPE) \try { (PTR) = new TYPE;} \ catch (std::bad_alloc& ){assert(0);}catc原创 2014-10-06 13:44:10 · 1008 阅读 · 0 评论 -
Effective C++ 8,9
8.写operator new 和 operator delete 时要遵循常规。operator new要与系统缺省的operator new 操作一致。即有正确的返回值,内存不够时要调用出错处理函数,处理好0字节内存请求的情况,避免隐藏标准形式的new。new会多次的尝试分配内存,寄希望与每次失败后执行的出错处理函数能释放其他地方的内存以供使用。只有在出错处理函数指针为空的情原创 2014-10-06 15:06:52 · 749 阅读 · 0 评论 -
Effective C++ 10
10.如果写了operator new,就要同时写operator delete。为什么要写自己的operator new和delete,首先这不叫重载,这叫隐藏。 new只是用来申请空间,而构造函数是在申请的空间的基础上继续初始化。为了效率。缺省的operator new 进行内存分配是并不仅仅分配一块所需大小的内存,因为delete释放内存时要知道指针所指向内容的大小,所以,n原创 2014-10-06 19:43:10 · 840 阅读 · 0 评论 -
Effective C++ 11-17
11.为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符。显然,由于动态内存分配,绝对会有深浅拷贝的问题,要重写拷贝构造函数,使其为深拷贝,才能实现真正意义上的拷贝。这是我理解的关于要声明拷贝构造函数的原因。而对于赋值操作符,类似的道理。 A b = a; b = a;对于上述两种形式,上面调用的是复制构造函数,而下面才是 赋值操作符=。赋值与复制很相似,缺省的操作都是将原创 2014-10-07 20:18:09 · 1238 阅读 · 0 评论 -
Effective C++ 18-23
18.争取使类的接口完整并且最小。类的用户接口是指使用这个类的程序员所能访问得到的接口,典型的接口里只有函数存在,封装好类的数据成员。完整是指接口中包含所有 合理的操作的函数。最小是指函数尽可能少且功能不重复。接口中的函数要少的原因:接口中函数越多,越让其他人难以理解,函数多了会让人混淆。函数多了难以维护,更难维护与升级。长的类定义会导致长的头文件,浪费大量编译时间。19.原创 2014-10-08 00:06:56 · 1081 阅读 · 0 评论 -
Effective C++ 24,25
24.在函数重载和设定参数缺省值间要慎重选择。获得一种类型的数据的最小值或最大值,对于c中,一般使用在中定义的各种宏如INT_MIN 来进行表示,但是这样无法进行泛型编程,即对应如何一种类型T返回对应类型的最小或最大值。而在c++中一般如此获得std::numeric_limits::min()c++在中定义了类模版numeric_limits,用来返回对应类型的最小最大值,这是一个很有用原创 2014-10-08 14:14:46 · 943 阅读 · 0 评论 -
Effective C++ 26,27,28
26.当心潜在的二义性。一些潜在的二义性的例子:class A{public: A(const B&);};class B{public: operator A() const;};void f(const A&);一般情况下,这样写不会出错,但当调用f函数传入一个 B的对象b时,就会发生二义性错误,b既可以通过A的构造函数获得一个A的对象,也可以通过B的类型转换运算符来将原创 2014-10-08 15:23:07 · 911 阅读 · 0 评论 -
Effective C++ 34
34.将文件间的编译依赖性降到最低。对于一个大型程序,其结构是错综复杂的,当你对一个类进行一些改动时,修改的不是接口,而是类的实现,即只是一些细节部分,但重新生成程序时,所有用到这个类的的文件都要重新编译。这里题目指的是这个意思。但实际上,我在vs2012实践了一下,对于类B与类A相关联,类B的实现依赖于类A,若类A的实现发生了改变,并不会影响B,即生成时,编译器只会去重新编译A,而对于依赖于原创 2014-10-09 01:05:15 · 1560 阅读 · 0 评论 -
Effective C++ 29-33
29.避免返回内部数据的句柄。即使声明一个类的对象为const,不能进行修改,在获得其数据的句柄也就是地址的情况下,还是可以强行修改的。class A{public: int n; A(int x):n(x){} operator int*() const;};inline A::operator int*()const{ return const_cast(&n);}原创 2014-10-09 01:06:38 · 1312 阅读 · 0 评论 -
Effective C++ 35,36,37
35.使公有继承体现 “是一个” 的含义。共有继承意味着 “是一个”。如 class B:public A; 说明类型B的每一个对象都是一个类型A的对象,A比B具有更广泛的概念,而B表示一个更特定的概念。在C++中任何一个参数为基类的函数都可以实际取一个派生类的对象,只有共有继承会如此,对于共有继承,如AB,若有两个函数 一个函数为 void fun1(A &a);另一个函数为void原创 2014-10-09 16:07:22 · 884 阅读 · 0 评论 -
Effective C++ 38-42
38.绝不要重新定义继承而来的缺省参数值。重新定义函数缺省参数值意味着重新定义函数,而非虚函数不能重新定义,所以将就考虑不能重新定义虚函数的缺省参数值的原因:虚函数是动态绑定的而缺省参数值是静态绑定的。静态类型是指程序中声明的类型,而动态类型是指实际对象的类型,举个栗子:class A{public: virtual void fun(int a=0) const{cout<<原创 2014-10-09 20:00:38 · 847 阅读 · 0 评论 -
Effective C++ 43,44
43.明智地使用多继承。多继承带来了极大的复杂性。最基本的一条就是二义性。当派生类为多继承时,其多个基类有同名的成员时,就会出现二义性。通常要明确其使用哪个成员的。显式地限制修饰成员不仅很笨拙,而且会带来限制。当显式地用一个类名来修饰一个虚函数时,函数就会被固定,而不再具有虚拟的特性。对于虚函数,若两个基类拥有一个同名同参的虚函数,当派生类没有重新定义虚函数时(可以只声明),直接调用这个同原创 2014-10-09 22:39:44 · 1108 阅读 · 0 评论 -
Effective C++ 45-48
45。弄清c++在幕后为你所写,所调用的函数。如果设置一个空类,c++编译器会声明以下函数:拷贝构造函数,赋值运算符,析构函数,一对析构函数(const和非const)。而如果你没有声明任何构造函数的话,编译器会为你声明一个缺省构造函数。这些函数都是公有的。编译器生成的缺省构造函数和析构函数实际上什么也不做,生成的析构函数一般是非虚构的,除非继承了一个具有虚析构函数的基类。缺省取地址符只是原创 2014-10-10 00:44:35 · 1020 阅读 · 0 评论