Effective C++笔记1

【条款1】尽量用const和inline,而不用#define
换言之,尽量用编译器而不用预处理。
1.尽量用const,而不用#define
#define ASPECT_RATIO 1.653
预处理后,编译器只知道1.653而不知道ASPECT_RATIO,编译出错时报错信息只显示1.653而不显示ASPECT_RATIO,这可能很令人费解。
可以用常量实现:
const double ASPECT_RATIO = 1.653;

2.尽量用inline函数,而不用#define
#define只是简单地文字替换,可能会出现问题。
例如:#define max(a,b) ((a) > (b) ? (a) : (b)) //括号不可缺,否则如果a或b是表达式会出问题
如果这样使用max(++a, b),a的值会被增加2次。
可以使用inline函数实现:
inline int max(int a, int b) { return a > b ? a : b; }

 

【条款2】尽量用<iostream>而不用<stdio.h>
1.scanf和printf不是类型安全的,编译时不会根据格式信息检查参数;

操作符>>和<<是类型安全的,要输出或读入一个对象,这个对象的类必须重载了>>和<<运算符。

2.scanf和printf没有扩展性,操作符>>和<<有扩展性。类只要重载了>>和<<运算符,就可以跟基本类型一样输入输出。

【条款3】尽量用new和delete,而不用malloc和free
malloc和free可以分配内存,但不会调用构造函数和析构函数。
string *stringarray1 =
static_cast<string*>(malloc(10 * sizeof(string)));
上面的代码确实分配了10个string需要的内存,但没有创建string对象。
free(stringarray1)会释放内存,但不会调用string的析构函数,这样如果string自己new过内存,这部分内存就泄漏了。
所以,要使用new和delete。

 

【条款4】尽量使用C++风格的注释
尽量用//,尽量别用/**/
if ( a > b ) {
 // int temp = a; // swap a and b
 // a = b;
 // b = temp;
}
没有问题。

if ( a > b ) {
 /* int temp = a;  /* swap a and b */
  a = b;
  b = temp;
 */
}
有问题,注释提前结束了!

如果要注释掉一大段代码,可以用#if 0

 

【条款5】对应的new和delete要采用相同的形式
string *stringptr1 = new string;
string *stringptr2 = new string[100];
...
delete stringptr1;// 删除一个对象
delete [] stringptr2;// 删除对象数组

new的是单个对象,就用delete;new的是对象数组,就用delete[]。
否则,后果不可预测。

另外,尽量避免对数组类型重命名(typedef)。
例如:
typedef string addresses[4];
string *p = new addresses;
...
delete p; //错误
delete[] p; //正确
typedef的本意是使用户使用addresses,而不用关心它的类型,结果还是得关心。
数组最好使用C++标准库的vector。

 

【条款6】析构函数里对指针成员调用delete
毋庸赘言。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值