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

条款01:C++为一个语言联邦

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

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

条款02:尽量以constenuminline替换#define

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

知识点:

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

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

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

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

条款03:尽可能使用const

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

知识点:

1char greeting[]=”Hello”;

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

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

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

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

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

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

5)在constnon-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)如果成员变量有constreferences,即是是内置类型也一定要使用初值列,因为 他们无法被赋值,一定要初始化。

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

4)为避免“跨编译单元的初始化次序”问题,请以local static对象替换non-local static对象。(原因:C++保证,函数内的loca static对象会在“该函数被调用期间”“首次遇到该对象的定义式”时被初始化。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值