在社交网站开发外国客户,游戏加盟公司,做网站的说3年3年包括什么软件,电商平台商户Item01 视C为一个语言联邦
C由四个次语言组成#xff1a;
C#xff1a;过程形式#xff0c;没有模板、没有异常、没有重载Object-Oriented C#xff1a;面向对象形式#xff0c;类#xff08;构造函数和析构函数#xff09;、封装、继承、多态Template#xff1a;泛型…Item01 视C为一个语言联邦
C由四个次语言组成
C过程形式没有模板、没有异常、没有重载Object-Oriented C面向对象形式类构造函数和析构函数、封装、继承、多态Template泛型编程、模板元编程STL容器、算法、迭代器和函数对象
Item02 尽量以constenuminline替换#define
目标是让编译器来替代预处理器使用预处理器会存在以下问题
1. 预处理器只进行简单的替换变量名称不会被记录符号表同时可能导致编译的目标文件包含常量的多份拷贝
#define ASPECT_RATIO 1.653
// 如果没有被记录到符号表程序遇到编译错误时输出的错误信息1.653
// 会带来不必要的排查时间
// 替换为
const double AspectRatio 1.653;2. 定义字符串的采用string替换char*避免写两次const的情况出现
const char* const authorName Scott Meyers;
//替换为
const std::string authorName(Scott Meyers);
3. #define没有作用域不能将常量的作用域限制在class内
class GamePlayer {
private:static const int NumTurns 5; // 常量声明int scores[NumTurns]; // 使用该常量
}
4. 如果上述类中编译器不允许在类中设定初值可以改用枚举值替代
5. enum 和 #define定义的对象不会导致非必要的内存分配
class GamePlayer {
private:enum { NumTurns 5 }; // NumTurns 成为5的记号名称int scores[NumTurns];
}
enum 行为类似#define而不像const因为对const对象取地址是合法的对前面两个定义的对象取地址是不合法的在C中enum类型的取值通常被编译器实现为整数右值对右值取地址是非法的它们的值被编译器直接嵌入到生成的机器码中不会在栈上开辟空间没有内存分配的过程。
6. 形似函数的宏最好用inline函数替换
宏定义避免了函数调用的开销但是存在行为不可预料以及类型安全等问题
#define CALL_WITH_MAX(a, b) f((a) (b) ? (a) : (b))
int a 5, b 0;
CALL_WITH_MAX(a, b); // a被累加两次
CALL_WITH_MAX(a, b10); // a被累加一次// 替换为
templatetypename T
inline void callWithMax(const T a, const T b) { f(a b ? a : b);
}