const,enum,inline和#defjne

来源:互联网 发布:知乎气功 编辑:程序博客网 时间:2024/06/05 22:47


条款1:
1.c++包含c,也支持面向过程;
2.c++支持面向对象形式,有类,封装,继承,多态和虚函数等;
3.泛型编程,强大的模板编程;、
4.STL标准模板库。

条款2:
1.编译器代替预处理器;使用const,enum,inline代替#define。

const:
int const *p;表示(*p)不能被改变,也就是p指向的内容不能被改变,p可以改变。
int* const p;表示p不能被改变,但是p指向的内容可以改变。
const int* const p;表示p和(*p)都不能被改变。
const int *p; 和int const *p是一个意思,写法不同而已。
const_cast可以撤销const的常量特性。

在定义类专属常量时:
类专属常量最多只有一份实体,所以要使用static。
1):
在类的内部:static const int a = 5;  //此为声明式;
在类的外部:const int ClassB::a;     //此为定义式;

或者:
2):
在类的内部:static const int a;   //此为声明式;
在类的外部:const int ClassB::a = 5;    //此为定义式;
部分编译器可以用1),部分编译器可以用2),也有编译器1)
、2)都不支持(此时就用enum定义类专属常量)。但在类内部
的必为声明式,外部为定义式。

enum:
刚才的类专属常量可以如是定义:
在类的内部:
enum { a = 5 };

const定义的常量可以取地址,而#define和enum都不能取他们
定义常量的地址。

inline:
类似于函数一样的宏使用inline更好,inline能使用模板就使
用模板,如:
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))//(很糟糕,极容易出错)
改后:
template<typename T>
inline woid callWithMax(const T& a,const T& b)
{
f(a > b ? a : b);
}
//这个就很好了。

2.#define只是字符替换,无安全检查,所有实参要加小括号(不然替换后容易出错);

宏不重视作用域,在#undef前都有效。

原创粉丝点击