本文共 2264 字,大约阅读时间需要 7 分钟。
2.1常量
在新版的C++标准中,使用nullptr来替代NULL指针, C++会把NULL和0视为同一各东西,这由编译器决定,有些编译器会将NULL定义为((void*)0),有些则会直接其其定义为0。在C++中是不允许直接将void*隐式转到其他类型的。但如果编译器把NULL定义为((void*)0),就会出现下面这段代码中
char *ch = NULL; //char *ch = ((void*)0);
没有了void *隐式转换的C++只好将NULL定义为0,
这将导致C++中重载特性发生混乱,看下面两个foo函数调用
void foo(char *);
void foo(int);
#include#include void foo(char *);void foo(int);int main(){ if(std::is_same ::value) std::cout << "NULL==0" << std::endl; if(std::is_same ::value) std::cout << "NULL==(void*)0" << std::endl; if(std::is_same ::value) std::cout << "NULL==nullptr" << std::endl; std::cout << "Hello World!" << std::endl; foo(0); foo(NULL); foo(nullptr); return 0;}void foo(char *){ std::cout << "foo(char*) is called" << std::endl;}void foo(int i){ std::cout << "foo(int) is called" << std::endl;}
foo(NULL)调用了foo(int)的函数,这与原本调用foo(char*)函数相违背。
上面的代码中,我们使用了 decltype 和 std::is_same 这两个属于现代 C++ 的语法,简单来说, decltype 用于类型推导,而 std::is_same 用于比较两个类型是否相同。
constexpr
c++本身已经具备了常量表达式的概念,比如 1+2, 3*4这种表达式总是会产相同的结果并且没有副作用。如果编译器能够在编译时把这些表达式真接优化并植入到程序运行时,将能增加程序的性能。一个非常明显的例子就是在数组的定义阶段:
#include#define LEN 10int len_foo(){ int i = 2; return i;}constexpr int len_foo_constexpr(){ return 5;}constexpr int fibonacci(const int n){ //return n == 1 || n == 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2); if(1 == n) return 1; if(2 == n) return 1; return fibonacci(n - 1) + fibonacci(n - 2);}int main(){ char arr_1[10];//合法 char arr_2[LEN];//合法 int len = 10; //char arr_3[len];//非法 const int len_2 = len + 1; constexpr int len_2_constexpr = 1 + 2 + 3; //char arr_4[len_2];//非法 char arr4[len_2_constexpr];//合法 //char arr_5[len_foo() + 5];//非法 char arr_6[len_foo_constexpr() + 1];//合法 std::cout << fibonacci(10) << std::endl; //1, 1, 2, 3, 5, 8, 13, 21, 34, 55 std::cout << fibonacci(10) << std::endl; std::cout << "Hello World!" << std::endl; return 0;}
const是定义一个常数,constexpr是表示一个常量表达式,在C++标准中数组的长度必须是常量表达式,所以char arr_4[len_2]是非法的。
虽然constexpr定义的是一个常表达式,比如可以用来表示一天多少分钟,可以constexpr int m = 24 * 60;
但个人觉得用宏表达这种常量方便些 如 #define DAY_m 24 * 60;
当然调试的时候是看不到这个DAY_m,只看到24*60这个值,根据项目需求而定吧。
*
转载地址:http://yriub.baihongyu.com/