您的位置:首页 > 编程语言 > C语言/C++

C++改善_2016_11_21

2016-11-21 18:39 260 查看
Rule 01: 视C++为一个语言联邦: 1. C

2. Object-Oriented C++

3. Template C++

4. STL

Rule 02: 尽量以const, enum, inline替换 #define

//宁可以编译器替换预处理器
/*
#define ASPECT_RATIO 1.653
const double AspectRatio = 1.653;
*/
/*
当我们以常量替换#define时,有两种情况:
1. 定义常量指针,必须写两次const,比如:
const char* const authoName = "Scott Meyers";
2. class专属常量
为了将常量的作用域限制于class内,你必须让它成为class的一个成员,比如:
class GamePlayer{
private:
static const int NumTurns = 5;
int scores[NumTurns];
...
};

or
理论基础:一个属于枚举类型的数值可权充ints被使用
class GamePlayer{
private:
enum{ NumTurns = 5};
int scores[NumTurns];
...
};
(如果你不想别人获得一个pointer或reference指向你的某个整数常量,enum可以帮助你实现这个约束。)
(enum和#define一样绝不会导致非必要的内存分配)
个人觉得enum在类里的应用比static const更好
*/

#include <iostream>
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))

using namespace std;

template <typename T>
void f(T a)
{
cout << a << endl;
}

template<typename T>
inline void callWithMax(const T &a, const T &b)
{
f<T>(a>b?a:b);
}

int main()
{
int a = 5, b = 0;
CALL_WITH_MAX(++a, b);
cout << "a = " << a <<endl; // a被累加两次

CALL_WITH_MAX(++a, b+10) ;
cout << "a = " << a << endl; //a 被累加一次
cout << "b = " << b << endl; //b还是b
//a的累积次数竟然取决于 “它被拿来和谁比较”

int c = 5, d = 0 ;
callWithMax<int>(++c,d);
cout << "c = " << c << endl; //c被加一次

callWithMax<int>(++c, d+10);
cout << "c = " << c << endl; //c被加一次
cout << "d = " << d << endl;
//这样一个符合设计的本意,更合理

return 0;
}

//请记住:
// 对于单纯常量,最好以const对象或者enums替换#defines。
// 对于形似函数的宏(macros), 最好改用inline函数替换#defines。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++