C++中应该使用const,enum,inline而非#define
2014-03-15 20:20
337 查看
1、使用#define target source,会引发预处理器的处理而不是编译器的处理,预处理器只会将程序中出现target 的部分替换为source,不会做语法检查。
当如下情况时:
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
int a = 3,b=2;
CALL_WITH_MAX(++a,b); //这样会导致a前加两次,返回的值就不是CALL_WITH_MAX(a,b)中的a,而是++a,这违背了程序的意图
CALL_WITH_MAX(++a,b+3);//这种情况正常
而我们如果使用内联函数,就不会出现这种情况了
template<typename T>
inline void callWithMax(const T&a,const T&b)
{
return (a>b?a:b);
}
2、使用#define预定义一个常量,当程序出现错误时,会给调试带来不便
#define MAX_NUM 100
如果程序出现关于MAX_NUM引起的编译错误,错误信息会指向数值100,而非预定义字符MAX_NUM,如果#define所在头文件不是自己写的,这就会给寻找100
所代表的含义带来不便。
C++中定义常量最好使用const
使用const定义指针的时候需要注意
1)、const char* const sName = "Join";
应该尽量使用const string sName("Join");
2)、关于const T*p 和T *const p
没有必要区分哪个是常量指针,哪个是指针常量,不过是文字游戏,自己明白什么意思就行,当const位于*左边时,说明p指向的内容为常量,不可修改
当const位于*右边时,说明指针p为常量,只能指向初始化时指向的内存地址,不可给p重新赋值,但其指向的空间的内容可以修改。
3)、当const出现在一个类中时
为保证const变量只被赋值一次,应声明为static(保证在整个类中都是恒定常量)
class Test
{
public:
Test(const int val):a(val){}
private:
const int a; //只能在构造函数的初始化列表初始化
static int b;//在类的实现文件中初始化
static const int c;//同const static int c
}
int Test::b = 0;
const int Test::c = 0;
===============================================================================================================
1、关于enum
当一个成员函数需要一个常量时,enum是最好的选择
class Test
{
public:
Test();
enum{length = 5};
int getEnum()
{
return length;
}
private:
int nums[length];
}
//不能用指针或者引用指向一个enum
int *p = t.getEnum(); //error
int &r = t.getEnum(); //error
当如下情况时:
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
int a = 3,b=2;
CALL_WITH_MAX(++a,b); //这样会导致a前加两次,返回的值就不是CALL_WITH_MAX(a,b)中的a,而是++a,这违背了程序的意图
CALL_WITH_MAX(++a,b+3);//这种情况正常
而我们如果使用内联函数,就不会出现这种情况了
template<typename T>
inline void callWithMax(const T&a,const T&b)
{
return (a>b?a:b);
}
2、使用#define预定义一个常量,当程序出现错误时,会给调试带来不便
#define MAX_NUM 100
如果程序出现关于MAX_NUM引起的编译错误,错误信息会指向数值100,而非预定义字符MAX_NUM,如果#define所在头文件不是自己写的,这就会给寻找100
所代表的含义带来不便。
C++中定义常量最好使用const
使用const定义指针的时候需要注意
1)、const char* const sName = "Join";
应该尽量使用const string sName("Join");
2)、关于const T*p 和T *const p
没有必要区分哪个是常量指针,哪个是指针常量,不过是文字游戏,自己明白什么意思就行,当const位于*左边时,说明p指向的内容为常量,不可修改
当const位于*右边时,说明指针p为常量,只能指向初始化时指向的内存地址,不可给p重新赋值,但其指向的空间的内容可以修改。
3)、当const出现在一个类中时
为保证const变量只被赋值一次,应声明为static(保证在整个类中都是恒定常量)
class Test
{
public:
Test(const int val):a(val){}
private:
const int a; //只能在构造函数的初始化列表初始化
static int b;//在类的实现文件中初始化
static const int c;//同const static int c
}
int Test::b = 0;
const int Test::c = 0;
===============================================================================================================
1、关于enum
当一个成员函数需要一个常量时,enum是最好的选择
class Test
{
public:
Test();
enum{length = 5};
int getEnum()
{
return length;
}
private:
int nums[length];
}
//不能用指针或者引用指向一个enum
int *p = t.getEnum(); //error
int &r = t.getEnum(); //error
相关文章推荐
- c++ 尽量不要使用#define 而是用const、enum、inline替换。
- effetive C++ 02 尽量以const,enum,inline替换#define
- C++ 笔记(一) —— 尽量以 const、enum、inline 替换 #define
- 尽量不要使用#define,而是用const、enum、inline替换。
- 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define
- <Effective C++>条款02:尽量以const,enum,inline替换#define
- 条款1---C++尽量用const,inline,enum等代替#define
- 改善C++ 程序的150个建议学习之建议25:尽量用const、enum、inline替换#define
- 使用enum、const、inline替换#define的原因
- C++ 使用#define带来的问题及解决方法(const enum inline)
- 【C++】#define vs const 、enum & inline
- 【C++】尽量以const,enum,inline 替换 #define
- 【C++】#define vs const 、enum & inline
- 条款二 尽量使用const,enum,inline替换#define
- C++基础:#define宏定义和inline,const,enum的区别
- [effectiv c++]条款2:尽量以const,enum,inline替换#define(static,const定义式)
- Effective C++ Item 2 尽量以const, enum, inline 替换 #define
- [C++]尽量以const,enum,inline替换#define
- 转帖 尽量使用const、enum、inline,避免使用#define
- 在c++中尽量使用const,enmu,inline来代替#define