博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
现代C++学习笔记——第2章
阅读量:2194 次
发布时间:2019-05-02

本文共 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/

你可能感兴趣的文章
详解 LSTM
查看>>
按时间轴简述九大卷积神经网络
查看>>
详解循环神经网络(Recurrent Neural Network)
查看>>
为什么要用交叉验证
查看>>
用学习曲线 learning curve 来判别过拟合问题
查看>>
用验证曲线 validation curve 选择超参数
查看>>
用 Grid Search 对 SVM 进行调参
查看>>
用 Pipeline 将训练集参数重复应用到测试集
查看>>
PCA 的数学原理和可视化效果
查看>>
机器学习中常用评估指标汇总
查看>>
什么是 ROC AUC
查看>>
Bagging 简述
查看>>
详解 Stacking 的 python 实现
查看>>
简述极大似然估计
查看>>
用线性判别分析 LDA 降维
查看>>
用 Doc2Vec 得到文档/段落/句子的向量表达
查看>>
使聊天机器人具有个性
查看>>
使聊天机器人的对话更有营养
查看>>
一个 tflearn 情感分析小例子
查看>>
attention 机制入门
查看>>