
Effective C++
liuxiaomao1988
这个作者很懒,什么都没留下…
-
转载 Effective C++——》条款4:确定对象使用前已先被初始化 .
1. 内置类型 C++中的内置基本类型,比如int,double,float等,初值都是垃圾值,即声明int i,i的初值是一个垃圾值。本书建议的最佳处理方法是:永远在使用对象之前将之初始化。比如: 1 int x = 0; 2 3 const char* test = “hello world”; 4 5 double d; cin >> d; 2. STL C++提2014-04-11 16:31:44353
0
-
转载 Effective C++——》条款14:在资源管理中小心copying行为
首先来看一个例子: 1 #include iostream> 2 using namespace std; 3 4 class Lock 5 { 6 public: 7 explicit Lock(int* pm): m_p(pm) 8 { 9 lock(m_p); 10 } 11 12 ~Lock() 132014-04-12 07:00:08453
0
-
转载 Effective C++——》条款15:在资源类管理类中提供对原始资源的访问
1 void PrintIntPointerValue(int* p) 2 { 3 cout endl; 4 } 5 6 int main() 7 { 8 MySharedPtrint> ptr(new int(2)); 9 PrintIntPointerValue(ptr); 10 } 因为PrintIntPointerValue函数需要2014-04-12 07:08:10416
0
-
转载 Effective C++——》条款17:以独立语句将newed的对象置入智能指针
举书上的例子: 1 int GetPriority(); 2 void processWidget(shared_ptr pw, int priority); 如果这样调用processWidget: processWidget(new Widget(), GetPriority()); 注意一下两边的类型,左边是管理者shared_ptr类,而右边是被管理者Wid2014-04-12 07:29:32467
0
-
转载 Effective C++——》 条款21:必须返回对象时,别妄想返回其reference。
当你理解条款21后,很可能出现一种过度使用的情况:只要看到是一个非内置类型,就去使用引用传值。举个书上的例子: 1 class Rational 2 { 3 private: 4 int numerator; 5 int denominator; 6 public: 7 Rational():numerator(0), denominator(1){} 82014-04-12 09:04:27396
0
-
转载 Effective C++——》条款23:宁以non-member、non-frined替换member函数
本条款还是讨论封装的问题,举书上的例子: 1 class WebBrower 2 { 3 public: 4 void ClearCach(); 5 void ClearHistory(); 6 void RemoveCookies(); 7 }; 定义了一个WebBrower的类,里面执行对浏览器的清理工作,包括清空缓存,清除历史记录和清除Cook2014-04-12 09:26:04442
0
-
转载 Effective C++——》条款24:若所有参数皆需类型转化,请谓词函数采用non-member函数
还是举书上的有理数例子: 1 class Rational 2 { 3 private: 4 int numerator; 5 int denominator; 6 public: 7 Rational(int n = 0, int d = 1): numerator(n), denominator(d){assert(denominator !=2014-04-12 09:39:12432
0
-
转载 Effective C++——》条款25:考虑写一个不抛出异常的swap函数
我也不知道为什么作者给这个条款起这样的名字,因为这样看上去重点是在“不抛出异常”,但事实上作者只是在全文最后一段说了一下不抛异常的原因,大部分段落是在介绍怎样写一个节省资源的swap函数。 你可以试一下,只要包含了头文件iostream,就可以使用swap函数,比如: 1 #include 2 3 int main() 4 { 5 int a = 3; 6 in2014-04-12 10:09:18390
0
-
转载 Effective C++——》条款16:成对使用new和delete时要采取相同的形式
这个条款比较好理解,就是new有两种形式: 1 int *p = new int(); // 申请一个int资源 2 int *p = new int[3]; // 申请连续三块int资源 而delete也有两种资源: 1 delete p; // delete指针所指向的单一资源 2 delete [] p; // delete指针所指向的多个连续资源块 那么该各2014-04-12 07:17:05365
0
-
转载 Effective C++——》条款18:让接口容易被正确使用,不容易被误用
从本条款开始,就进入到全书的第四部分:设计与声明。 程序员设计接口时应本的对用户负责的态度,“如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不应该通过编译;如果代码通过了编译,那它的作为就该是客户所想要的”。 举一个书上的例子: 1 class Date 2 { 3 public: 4 Date(int month, int day, int year)2014-04-12 07:58:58438
0
-
转载 Effective C++——》条款19:设计class犹如设计type
这里初看到”class”和”type”,感觉他们是说的是同一样东西,但仔细读了一下,两者在文中还是有区别的。class侧重于自定义的类,而type侧重于系统预定义的类(像int、double、string、vector)。设计好的class,使之像设计type一样,就是说要使自己设计的类像系统预定义的类那样好用,这对设计思想提出了较高的要求。 要设计高效的class,需要回答以下的问题:2014-04-12 08:13:05401
0
-
转载 Effective C++——》条款22:将成员变量声明为private
这个条款从字面意思上理解很简单,很多程序都是这样做的,即使作为初学者,也知道该将成员变量声明为private,但有没有想过,为什么要这样做? 为什么public成员变量不行?protected成员变量行不? 举一个简单的例子: 1 class Clothes 2 { 3 public: 4 int price; 5 string name; 6 };2014-04-12 09:14:05532
0
-
转载 Effective C++——》条款5:了解C++默默编写并调用哪些函数 .
一个常见的面试题就是问“一个空类占几个字节”,想当然的是0个字节,但事实上类要区分不同的对象,比如: 1 EmptyClass obj1; 2 EmptyClass obj2; 即便是空类,也要能识别obj1和obj2的不同,所以空类仍然要占字节数,一般占一个字节。 还有一个针对空类的问题是“一个空类里面有什么”,就是想问编译器为这个空类自动生成了哪些成员函数。 很容易想到的是生2014-04-11 16:53:40336
0
-
转载 Effective C++ ——》条款01:视C++为一个语言联邦
条款01:视C++为一个语言联邦 为了更好的理解C++,我们将C++分解为四个主要次语言: C。说到底C++仍是以C为基础。区块,语句,预处理器,内置数据类型,数组,指针统统来自C。 Object-Oreinted C++。这一部分是面向对象设计之古典守则在C++上的最直接实施。类,封装,继承,多态,virtual函数等等... Template C++。这是C++泛型编程2014-04-11 15:16:19416
0
-
转载 Effective C++——》条款13:以对象管理资源
从这个条款开始,就进入到资源管理部分了。资源管理往往是大型项目的一个难点,也是重中之重,看到一些编程规范,都是将资源管理的规范列为高优先级的重点。 管理资源的最好方法其实是预防,而好的预防方法就是尽量不去使用C/C++的原生指针,这些指针像幽灵一样,一个“忘记”,就是一个隐患。当项目小的时候,这些隐患看不出来,但当研发一个拥有上万级用户的产品时,服务器对很多人同时运行含有隐患的代码,这个隐患2014-04-11 22:52:37435
0
-
转载 Effective C++——》条款6:若不想使用编译器自动生成函数,就该明确拒绝 .
举个书上的例子,地产中介商卖的是房子,有这样一个类: class HomeForSale {…} 每个房子都是不一样的,所以希望这样: 1 HomeForSale house1; 2 HomeForSale house2; 3 HomeForSale house3(house1); // house3企图与house1相同,不能通过这种情况 4 house2 = hous2014-04-11 17:03:43400
0
-
转载 Effective C++——》条款7:为多态基类声明virtual析构函数 .
严格来说,多态分为编译时多态和运行时多态,编译时多态是函数的重载,而运行时多态则是迟绑定技术,即根据基类指针或引用的实际指向来决定采取何种行动,一般来说,多态特指运行时多态。下面我们来举有关C++多态的一个简单例子: 1 class Shape 2 { 3 private: 4 int color; 5 public: 6 vir2014-04-11 17:22:41440
0
-
转载 Effective C++——》 条款08:别让异常逃离析构函数
举书上的例子,有以下代码: 1 class Widget 2 { 3 public: 4 ~Widget(){…} // 析构函数 5 }; 6 7 void DoSomething() 8 { 9 vector v; 10 } STL的vector在析构时会逐一调用容器内每个元素的析构函数,这样问题就来2014-04-11 17:31:55427
0
-
转载 Effective C++——》条款9:绝不在构造和析构过程中调用virtual函数
先举一个在构造函数中调用virtual函数的例子: 1 class Base 2 { 3 public: 4 Base() 5 { 6 VirtualFunction(); 7 } 8 9 virtual void VirtualFunctio2014-04-11 17:56:33428
0
-
转载 Effective C++——》条款3:尽可能使用const .
const是常量的意思,它可以定义一个不可改变的量,主要用于以下几个地方: 1. 修饰变量,使之不可改变 举个例子: const int var = 3; 此时var的值就不能改变了。也正是因为const的变量不能轻易修改存储的值,所以在声明的时候就要初始化,这样就是不行的: const int var; 编译器就会报错。 2. 修饰指针 指针是特殊的变量,有时我们希望对它所指向的2014-04-11 16:11:17417
0
-
转载 Effective C++——》条款2:尽量以const,enum,inline替换#define .
这个条款或许可以改为“宁可 以编译器替换预处理器”。即尽量少用预处理。 编译过程:.c文件--预处理-->.i文件--编译-->.o文件--链接-->bin文件2014-04-11 15:40:43479
0
-
转载 Effective C++——》条款10:令operator=返回一个reference to *this
这个条款很简单的说,先解释一下为什么赋值后还要有返回值,这是因为我们可以这样用连等: 1 int x, y, z; 2 x = y = z; 注意等号是右结合的,所以上述运算实际上等同于: x = (y = z); 如果没有返回值,上述代码就不能通过编译。 至于为什么返回的是一个引用,这并不是编译器强制的,但有三个原因让你觉得这样做是明智的: (1)2014-04-11 22:07:36384
0
-
转载 Effective C++——》条款11:在operator=中处理自我赋值
直观的operator=是这样定义的: 1 class SampleClass 2 { 3 private: 4 int a; 5 double b; 6 float* p; 7 public: 8 SampleClass& operator= (const SampleClass& s) 92014-04-11 22:23:13353
0
-
转载 Effective C++——》条款12:复制对象时勿忘其每一部分
这句话包含两部分的意思:第一部分是要考虑到所有成员变量,特别是后加入的,相应的拷贝构造函数和赋值运算符要及时更新;第二部分是在存在继承时,不要遗忘基类部分的复制。先看第一部分的意思,举个例子: 1 class SampleClass 2 { 3 private: 4 int a; 5 public: 6 SampleClass(const Sample2014-04-11 22:35:24385
0
-
转载 Effective C++——》条款20:宁以pass by refrence to const 替换 pass by value
默认情况下,C++的函数调用是传值调用,也就是说形参拷贝实参的内容。举书上的例子: 1 class Person 2 { 3 private: 4 string name; 5 string address; 6 public: 7 Person(){} 8 virtual ~Person(){} 9 }; 10 11 class St2014-04-12 08:28:55441
0