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++并不是一种单一思想的语言,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对象会在“该函数被调用期间”“首次遇到该对象的定义式”时被初始化。)
相关文章推荐
- Effective c++ 第一章 让自己习惯C++
- effective c++ 第一章:让自己习惯c++
- Effective c++ 第一章 让自己习惯C++
- 《Effective C++》第一章:让自己习惯C++
- Effective C++第一章:让自己习惯C++
- Effective C++(一)让自己习惯C++
- 【读书笔记】Effective C++-1 让自己习惯C++(之二)
- (Effective C++)第一章 让自己习惯C++(View Yourself to C++)
- Effective C++ 第一章(让自己习惯C++)
- Effective C++ 3nd 读书摘要(一、让自己习惯C++ ; 二、构造,析构,赋值运算)Item1 - 12
- effective C++ 1.让自己习惯C++
- Effective C++(一)让自己习惯C++
- 《Effective C++ 3》01 让自己习惯C++ 条款:01-04
- 《Effective C++ 3/e》笔记(一):让自己习惯 C++
- Effective C++ ——让自己习惯C++
- 《Effective C++》 读书笔记(一) 让自己习惯C++
- Effective C++ 笔记一 让自己习惯C++
- Effective C++ --1 让自己习惯C++
- 【读书笔记】Effective C++-1 让自己习惯C++(之三)
- effective C++阅读笔记一——让自己习惯C++