您的位置:首页 > 编程语言 > C语言/C++

Effective C++第一章 让自己习惯C++

2014-11-03 22:39 633 查看
条款01:视C++为一个语言联邦

个人理解:这个条款主要告诉我们,C++并不是一种单一思想的语言,C++语言是多种思想的联合。C++可以划分为四个部分:C(c语言),Object—Oriented C++(面向对象:类),Template C++(模板的泛型编程),STL(标准模板库)。每个部分都有自己的规约,自己的思想,切忌一成不变。

======================================================================

条款02:尽量以const,enum,inline替换#define

个人理解:个人觉得应该是合理替换比较好点,#define有const等无法替换的有点,如在某些时候需要改写程序某一点此时#define比较方便。

知识点:

(1)在类内中的皆为声明,即是你进行了初始化。

(2)如果有时你的编译器(错误的)不允许“static整数型class常量”完成“in class
 初始值设定”,可以使用所谓的“the enum hack”补偿做法。由于无法取到enum的地址,所以可以使用enum实现你不想让别人获得一个pointer或reference指向你的某个整数常量。

(3)对于形似函数的宏,最好使用inline函数(模板)替换#define。

======================================================================

条款03:尽可能使用const

个人理解:对于确定保持不变的对象,一定要用const表达出来。

知识点:

(1)char greeting[]=”Hello”;

const char* const p =greeting;中的两个const,如果const出现在星号(*)左边,表
示所指的对象是常量,出现在星号右边表示指针本身是常量。

(2)对于迭代器const_iterator表示我们希望迭代器所指向的对象是常量。对于修饰iterator的const表示迭代器本身是常量,切记!!!很易混淆。

const std::vector<int >::iterator iter ;

std::vector<int>const_iterator CIter;//看清楚区别

(3)将const实施于成员函数,是为了确认该函数可作用于const对象身上。

(4)在const成员函数中,不能修改成员变量的值,如想在const成员变量中改变成员
  变量的值必须在要改变的成员变量之前加上mutable,mutable能够释放掉non_static成员变量的bitwise constness约束,是这些变量总是会被改变,即是在const成员
函数内部。

(5)在const和non-const成员函数为中避免重复,应该另non-const去调用const函数,
反过来调用是错误行为。

例class Text{

public:

const char& operator[ ](std::size_t position) const

{

...............

return text[position];

}

const char& operator[ ](std::size_t position) const

{

..................

...................

return 

const_cast<char&>(static_cast<const Text&>(*this)[position]

);

}

...............

}

为何不用常量调用非常量呢?因为const成员函数承诺绝不改变其对象的逻辑状 态,二非常量成员函数却没有此承诺。若用const调用对象有可能以此被改动。

======================================================================

条款04:确定对象在使用前已先被初始化

个人理解:C的内置类型一般不会被自动初始化,C++部分的内置类型一般会被自动初始化,但是尽量主动初始化。

知识点:(1)区分两种构造函数的区别

ABEntry::ABEntry(const std::string &name,const std::string &address,

const std::list<phoneNumber> &phone)

{

theName=name;

theAddress=address;

thePhones=phones;

nunTimesConsulted=0;//这些都是赋值而非初始化操作

}

ABEntry::ABEntry(const std::string &name,const std::string &address,

const std::list<phoneNumber> &phone)

:theName(name),

theAddress(address),

thePhones(phones),

nunTimesConsulted(0)//这些才是初始化

{ }

原因:C++规定,对象的成员变量的初始化发生在进入函数本体之前,赋值版本的构造函数是先调用default初始化成员变量,然后在进行赋值。(效率低)

(2)如果成员变量有const或references,即是是内置类型也一定要使用初值列,因为
他们无法被赋值,一定要初始化。

(3)C++有着十分固定的“成员初始化次序”。基类先于派生类初始化,在类内,成员变量总是以声明次序被初始化。

(4)为避免“跨编译单元的初始化次序”问题,请以local static对象替换non-local static对象。(原因:C++保证,函数内的loca static对象会在“该函数被调用期间”“首次遇到该对象的定义式”时被初始化。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ Effective C++