《effective C++》读书笔记

12 篇文章 0 订阅
条款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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值