Effective C++ 笔记1

条款1:视C++为一个语言联邦

1、C、Object-Oriented C++、Template C++ 、STL 组成了C++,高效编程取决你使用C++的哪一部分

 

条款2:尽量用const ,enum,inline替换 #define

1、Const 代替 #define中普通的宏,编译器会对类型进行检查避免类型错误。

//如这里
#define PI 3.1415
//最好用const代替,一旦定义错了define只会对3.1415进行提示,而不会对PI进行提示,因为在预处理的时候PI已经被3.1415代替了
Const double PI=3.1415

 

2、inline 代替#define中形似函数的宏,同意可以避免宏定义错误

 

//这样定义不安全
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
//采用inline
template<typename T>
inline T callWithMax(const T& a,const T& b)
{
    return a>b?a:b;   
}

 

3、类中有const 必须要有static,有const就表示该属性是只有一份所以必须也是静态的

Class C
{
    static const int pi;    
}

 

4、如果不允许类中static初始化,那么用enum代替

//旧的编译器不支持static在声明时获得初值
Class C
{
private:
    static const double PI;
};    
const double C::PI=3.14159;
//所以用这种方式来定义静态变量
Class C
{
privateenum{num=5};
};

 

5、Ifdef/ifndrf 可以防止类被重复引用

#ifdef _TEST_
#define _TEST_

int max(int a,int b);

#endif

 

 

条款3:尽量使用const

1、Const出现在星号左边,被指物是常量。右边指针自身是常量

char greeting[]="hello"
//值常数
const char* p=greeting;
//指针常数
char* const p =greeting;
//指针和值都是常数
const char* const p=greeting;

2、Const定义迭代器错误,应该使用const_iteator

std::vector<int> vec;

const std::vector<int>::iterator it=vec.begin();
*it=10;
//错误 迭代器本身是常量
++it;
    

std::vector<int>::const_iterator it=vec.begin()
//错误,该迭代器指向的值是常量
*it=10;
++it;

3、函数返回 const 可避免无意义的赋值动作

 

条款4:确定对象使用之前已先被初始化

1、  永远在对象使用之前初始化

2、  类中初始化不要用构造函数赋值的形式,要使用成员初值列

class C
{
    int a;
    int b;
    int c;
        //初始化队列 
    C(int x,int y)
        :a(x),
         b(y),
         c(1)
    {
    }
};

 

posted @ 2016-04-12 19:42  深空灰  阅读(208)  评论(0编辑  收藏  举报