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. STLC++提转载 2014-04-11 16:31:44 · 409 阅读 · 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()13转载 2014-04-12 07:00:08 · 532 阅读 · 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:10 · 468 阅读 · 0 评论 -
Effective C++——》条款17:以独立语句将newed的对象置入智能指针
举书上的例子:1 int GetPriority();2 void processWidget(shared_ptr pw, int priority);如果这样调用processWidget:processWidget(new Widget(), GetPriority());注意一下两边的类型,左边是管理者shared_ptr类,而右边是被管理者Wid转载 2014-04-12 07:29:32 · 527 阅读 · 0 评论 -
Effective C++——》 条款21:必须返回对象时,别妄想返回其reference。
当你理解条款21后,很可能出现一种过度使用的情况:只要看到是一个非内置类型,就去使用引用传值。举个书上的例子:1 class Rational2 {3 private:4 int numerator;5 int denominator;6 public:7 Rational():numerator(0), denominator(1){}8转载 2014-04-12 09:04:27 · 453 阅读 · 0 评论 -
Effective C++——》条款23:宁以non-member、non-frined替换member函数
本条款还是讨论封装的问题,举书上的例子:1 class WebBrower2 {3 public:4 void ClearCach();5 void ClearHistory();6 void RemoveCookies();7 };定义了一个WebBrower的类,里面执行对浏览器的清理工作,包括清空缓存,清除历史记录和清除Cook转载 2014-04-12 09:26:04 · 483 阅读 · 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:12 · 482 阅读 · 0 评论 -
Effective C++——》条款25:考虑写一个不抛出异常的swap函数
我也不知道为什么作者给这个条款起这样的名字,因为这样看上去重点是在“不抛出异常”,但事实上作者只是在全文最后一段说了一下不抛异常的原因,大部分段落是在介绍怎样写一个节省资源的swap函数。你可以试一下,只要包含了头文件iostream,就可以使用swap函数,比如:1 #include 2 3 int main()4 {5 int a = 3;6 in转载 2014-04-12 10:09:18 · 469 阅读 · 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:05 · 425 阅读 · 0 评论 -
Effective C++——》条款18:让接口容易被正确使用,不容易被误用
从本条款开始,就进入到全书的第四部分:设计与声明。程序员设计接口时应本的对用户负责的态度,“如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不应该通过编译;如果代码通过了编译,那它的作为就该是客户所想要的”。举一个书上的例子:1 class Date2 {3 public:4 Date(int month, int day, int year)转载 2014-04-12 07:58:58 · 498 阅读 · 0 评论 -
Effective C++——》条款19:设计class犹如设计type
这里初看到”class”和”type”,感觉他们是说的是同一样东西,但仔细读了一下,两者在文中还是有区别的。class侧重于自定义的类,而type侧重于系统预定义的类(像int、double、string、vector)。设计好的class,使之像设计type一样,就是说要使自己设计的类像系统预定义的类那样好用,这对设计思想提出了较高的要求。要设计高效的class,需要回答以下的问题:转载 2014-04-12 08:13:05 · 478 阅读 · 0 评论 -
Effective C++——》条款22:将成员变量声明为private
这个条款从字面意思上理解很简单,很多程序都是这样做的,即使作为初学者,也知道该将成员变量声明为private,但有没有想过,为什么要这样做?为什么public成员变量不行?protected成员变量行不?举一个简单的例子:1 class Clothes2 {3 public:4 int price;5 string name;6 };转载 2014-04-12 09:14:05 · 597 阅读 · 0 评论 -
Effective C++——》条款5:了解C++默默编写并调用哪些函数 .
一个常见的面试题就是问“一个空类占几个字节”,想当然的是0个字节,但事实上类要区分不同的对象,比如:1 EmptyClass obj1;2 EmptyClass obj2;即便是空类,也要能识别obj1和obj2的不同,所以空类仍然要占字节数,一般占一个字节。还有一个针对空类的问题是“一个空类里面有什么”,就是想问编译器为这个空类自动生成了哪些成员函数。很容易想到的是生转载 2014-04-11 16:53:40 · 387 阅读 · 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:19 · 526 阅读 · 0 评论 -
Effective C++——》条款13:以对象管理资源
从这个条款开始,就进入到资源管理部分了。资源管理往往是大型项目的一个难点,也是重中之重,看到一些编程规范,都是将资源管理的规范列为高优先级的重点。管理资源的最好方法其实是预防,而好的预防方法就是尽量不去使用C/C++的原生指针,这些指针像幽灵一样,一个“忘记”,就是一个隐患。当项目小的时候,这些隐患看不出来,但当研发一个拥有上万级用户的产品时,服务器对很多人同时运行含有隐患的代码,这个隐患转载 2014-04-11 22:52:37 · 494 阅读 · 0 评论 -
Effective C++——》条款6:若不想使用编译器自动生成函数,就该明确拒绝 .
举个书上的例子,地产中介商卖的是房子,有这样一个类:class HomeForSale{…}每个房子都是不一样的,所以希望这样:1 HomeForSale house1;2 HomeForSale house2;3 HomeForSale house3(house1); // house3企图与house1相同,不能通过这种情况4 house2 = hous转载 2014-04-11 17:03:43 · 456 阅读 · 0 评论 -
Effective C++——》条款7:为多态基类声明virtual析构函数 .
严格来说,多态分为编译时多态和运行时多态,编译时多态是函数的重载,而运行时多态则是迟绑定技术,即根据基类指针或引用的实际指向来决定采取何种行动,一般来说,多态特指运行时多态。下面我们来举有关C++多态的一个简单例子: 1 class Shape 2 { 3 private: 4 int color; 5 public: 6 vir转载 2014-04-11 17:22:41 · 490 阅读 · 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:55 · 496 阅读 · 0 评论 -
Effective C++——》条款9:绝不在构造和析构过程中调用virtual函数
先举一个在构造函数中调用virtual函数的例子: 1 class Base 2 { 3 public: 4 Base() 5 { 6 VirtualFunction(); 7 } 8 9 virtual void VirtualFunctio转载 2014-04-11 17:56:33 · 510 阅读 · 0 评论 -
Effective C++——》条款3:尽可能使用const .
const是常量的意思,它可以定义一个不可改变的量,主要用于以下几个地方:1. 修饰变量,使之不可改变举个例子:const int var = 3;此时var的值就不能改变了。也正是因为const的变量不能轻易修改存储的值,所以在声明的时候就要初始化,这样就是不行的:const int var;编译器就会报错。2. 修饰指针指针是特殊的变量,有时我们希望对它所指向的转载 2014-04-11 16:11:17 · 484 阅读 · 0 评论 -
Effective C++——》条款2:尽量以const,enum,inline替换#define .
这个条款或许可以改为“宁可 以编译器替换预处理器”。即尽量少用预处理。 编译过程:.c文件--预处理-->.i文件--编译-->.o文件--链接-->bin文件转载 2014-04-11 15:40:43 · 553 阅读 · 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:36 · 439 阅读 · 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) 9转载 2014-04-11 22:23:13 · 401 阅读 · 0 评论 -
Effective C++——》条款12:复制对象时勿忘其每一部分
这句话包含两部分的意思:第一部分是要考虑到所有成员变量,特别是后加入的,相应的拷贝构造函数和赋值运算符要及时更新;第二部分是在存在继承时,不要遗忘基类部分的复制。先看第一部分的意思,举个例子:1 class SampleClass2 {3 private:4 int a;5 public:6 SampleClass(const Sample转载 2014-04-11 22:35:24 · 440 阅读 · 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 St转载 2014-04-12 08:28:55 · 521 阅读 · 0 评论