Effective C++ 读书笔记一

条款1:将c++看做是在C的基础上添加了类的特性,再添加了泛型编程和STL库的集合。

条款2:少使用#define,换之以const,enum和inline关键字

1>当想用#define定义一个变量时,可以考虑用const代替

2>当想用#define实现一个函数的功能时,可以考虑将函数在头文件中实现,并加上(或不加)inline关键字,即让函数成为内敛函数,减少了函数调用上的时间开销,在所有使用该函数的地方,都是采用代码块移植的方法进行函数调用,即用空间换时间

3>当你想在类中定义一个数组并指定数组大小时,当你的编译器不允许在class中将static的变量进行初始化时,可以考虑采用enum hack的方式,即在class中定义一个枚举,并指定大小,然后再定义数组时,指定数组大小为枚举值,如

class A {

private:
    enum {Num = 4};
    int arr[Num];
};

注意:

为了表示变量的只读性,通常会将变量定义成const,为了限制变量的使用范围,可以考虑将变量值包含在class中,同时为了确保所有的类实例只有一份数据,会将此数据定义成static,定义成static的变量通常是在类外或.cpp文件中初始化,即

class A {
private:
    static const int myNum;
};

const int A::myNum = 1;

条款3:多使用const

1>识别到底谁是常量。

当const在*(星号)的左边时,表示指针所指的对象是常量,即指针指向的内容不可修改;

int a=10;

const int *p=&a;

*p=20;(错误)

当const在*右边时,表示指针本身是常量,即指针地址不可修改,即当前指针不可以指向其他地方;

int b=20;

p=&b;(错误)

当const在*左侧和右侧都存在时,表示两者都是常量,不可修改。

*p=20;(错误)

p=&b;(错误)

2>函数返回值为什么要声明为const?

将函数返回值声明为const,可以避免不必要的错误(进行操作符的检查)

class A{};
const A operator* (const A& lfs, const A& rfs);


A a,b,c;
(a*b) = c;//在a*b的结果上调用operator=

此时const的作用就发挥出来了,因为a*b的结果是const A类型的,所以a*b的结果不可以修改,此时就无法将c赋值成功,避免了无意义的赋值动作

3>函数参数什么时候需要加const?

很简单的判断,一般情况下,都声明为const,除非你想要修改他

4>const成员函数和非const成员函数

const成员函数承诺不改变对象的逻辑状态,如果在const函数内调用了非const函数,对象有可能被改变,是一种错误的行为;而non-const函数可以做任何行为,所以自然就可以调用const函数

条款4:在定义类的同时,构造函数采用初始化列表的形式完成对象的初始化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值