《effective C++》读书笔记
2014-10-01 01:49
225 查看
条款3:尽可能使用const
1、const int * a; int const *a;这两个都是修饰数据类型int的所以是指向一个常数据
int*const p=a;这是一个指向不可以改变的常指针
2、STL里面:
const vector <int>
:: iterator vIntIter = vInt.begin();//不可以改变指向
vector<int >::const_iterator cConstIntIter
= vInt.begin(); //指向的内容不可以用
3、令函数返回一个常量值 往往可以降低客户错误而造成的意外 例如 const Rational operator*(const Rational& lhs,const Rational& rhs) (a*b)=12 XXX
条款4:确定对象被使用前先被初始化
1、对象的构造函数 注意初始化和赋值的区别
初始化是在构造函数之前,用参数列表来语法实现的,ABEntry::ABEntry(const std::name& name):theName(name)//初始化{ //赋值}
在初始化的时候会调用成员变量的构造函数 例如例子里面就会调用string 的copy函数
这样效率会提高,因为在初始化时候调用成员变量构造函数的时候就进行赋值操作
2、初始化成员列表不代表初始化顺序 而是根据成员变量的申明顺序
3、static对象 全局成员和static变量 他们会在main函数结束的时候被调用 调用析构函数
使用单例模式来解决这个问题:
FIleSystem& tfs()
{
static FileSystem fs;
return fs;
}======》reference-returning函数 第一行定义初始化一个static变量 第二行返回它
用来防止”初始化次序问题“
4、全局变量和静态变量的区别 可以被extern吗 局部静态变量则是作用域的区别 函数外面调用不到函数里面的局部静态变量
【记住】:
【1】为内置型对象(int float)进行手工初始化,因为C++不保证初始化它们
【2】构造函数最好使用成员初值列表,而不要在构造函数本体内使用赋值操作
【3】为避免”跨编译单元之初始化次序“问题,使用local static对象替换non-static对象
条款5:Know what function C++ silently writes and calls
1、编译器会自动为class申明一个copy构造函数、一个copy assignment操作符和一个析构函数 此外如果你没有申明任何构造函数,编译器也会自动为你申明一个default构造函数 所有这些函数都是public而且是inline
2、编译器自动生成的copy构造函数和copy assignment函数的做法是调用成员变量的copy函数 内置类型就拷贝值
【注】:引用初始化的时候就要赋予一个引用 之后就不可以更改了
3、如果成员变量中有引用,那么默认的copy构造函数应该怎么copy这个引用类型的变量呢? 还有常量,不可以改变了。
解决办法:必须自己定义copy函数和copy assignment操作符
把父类的赋值构造函数申明为privae
1、const int * a; int const *a;这两个都是修饰数据类型int的所以是指向一个常数据
int*const p=a;这是一个指向不可以改变的常指针
2、STL里面:
const vector <int>
:: iterator vIntIter = vInt.begin();//不可以改变指向
vector<int >::const_iterator cConstIntIter
= vInt.begin(); //指向的内容不可以用
3、令函数返回一个常量值 往往可以降低客户错误而造成的意外 例如 const Rational operator*(const Rational& lhs,const Rational& rhs) (a*b)=12 XXX
条款4:确定对象被使用前先被初始化
1、对象的构造函数 注意初始化和赋值的区别
初始化是在构造函数之前,用参数列表来语法实现的,ABEntry::ABEntry(const std::name& name):theName(name)//初始化{ //赋值}
在初始化的时候会调用成员变量的构造函数 例如例子里面就会调用string 的copy函数
这样效率会提高,因为在初始化时候调用成员变量构造函数的时候就进行赋值操作
2、初始化成员列表不代表初始化顺序 而是根据成员变量的申明顺序
3、static对象 全局成员和static变量 他们会在main函数结束的时候被调用 调用析构函数
使用单例模式来解决这个问题:
FIleSystem& tfs()
{
static FileSystem fs;
return fs;
}======》reference-returning函数 第一行定义初始化一个static变量 第二行返回它
用来防止”初始化次序问题“
4、全局变量和静态变量的区别 可以被extern吗 局部静态变量则是作用域的区别 函数外面调用不到函数里面的局部静态变量
【记住】:
【1】为内置型对象(int float)进行手工初始化,因为C++不保证初始化它们
【2】构造函数最好使用成员初值列表,而不要在构造函数本体内使用赋值操作
【3】为避免”跨编译单元之初始化次序“问题,使用local static对象替换non-static对象
条款5:Know what function C++ silently writes and calls
1、编译器会自动为class申明一个copy构造函数、一个copy assignment操作符和一个析构函数 此外如果你没有申明任何构造函数,编译器也会自动为你申明一个default构造函数 所有这些函数都是public而且是inline
2、编译器自动生成的copy构造函数和copy assignment函数的做法是调用成员变量的copy函数 内置类型就拷贝值
【注】:引用初始化的时候就要赋予一个引用 之后就不可以更改了
3、如果成员变量中有引用,那么默认的copy构造函数应该怎么copy这个引用类型的变量呢? 还有常量,不可以改变了。
解决办法:必须自己定义copy函数和copy assignment操作符
把父类的赋值构造函数申明为privae
相关文章推荐
- 读书笔记《Effective c++》 条款02 尽量用const,enum,inline代替#define
- 读书笔记《Effective c++》 条款20 宁以pass-by-reference-toconst替换pass-by-value
- [C/C++] Effective C++ [ 读书笔记 ] 整理 1 - 12/55
- 读书笔记 Effective C++: 01 让自己习惯C++
- effective C++ 读书笔记 条款20
- 函数继承Effective C++ 读书笔记之Part6.Inheritance and Object-Oriented Design
- effective C++ 读书笔记 条款14 以对象管理资源
- Effective C++ 读书笔记(13)
- Effective C++ 读书笔记(21)
- Effective C++ 读书笔记(24)
- 读书笔记《Effective C++》条款09:绝不在构造和析构过程中调用virtual函数
- 【Effective C++】读书笔记 条款49~51
- 读书笔记《Effective C++》条款36:绝不重新定义继承而来的non-virtual函数
- 【读书笔记】Effective C++-2 构造/析构/赋值运算(之四)
- 读书笔记 Effective C++
- 《Effective C++》第4章 设计与声明(1)-读书笔记
- effective C++ 读书笔记 条款11
- Effective C++ 3rd 读书笔记
- effective C++ 读书笔记(一)
- 《effective C++》读书笔记