1、void*指针的使用,平时见得也很多了,至于为什么使用void* 指针,很多人有自己的见解,反正普通指针轻轻松松的转向void * 指针,但是void*指针转向其他的指针都要采用强制转换的。
2、static_cast强制转换举例
int xx = ; cout<<"st "<<static_cast<double>(xx)<<typeid(xx).name()<<typeid(static_cast<double>(xx)).name()<<endl;
运行结果是
st 5intdouble
static强制转换的话,紧紧并不改变原来xx的类型的呀,但是整个的static_cast的转换才是真正的double
3、const_cast更加用于去const的强制类型转换,会多用于函数重载的过程中
4、有很多代码里存在字面值类型,其实提到字面值对应三个,算术类型,指针和引用。(nullptr作为一个神奇的存在,自己脑补吧)
5、预处理器和编译器,哈哈。
预处理名字是由预处理器来进行处理的,例如assert,NULL,这些东西根本不会等到编译的时候由编译器来管理,直接用预处理器来处理,典型的预处理变量是用#define来进行的,反正这些都是在预处理的阶段进行的,不用管它啦,最重要的是在使用assert这种进行调试的时候其实是不需要使用std的。因为预处理变量和命名空间没有任何瓜葛。
6、我们常常使用#define NDEBUG来进行控制assert的行为,但是记住了要想assert发挥作用,#define NDEBUG这句话必须要放在#include<cassert>前面,具体的详见头文件哈。
7、很多时候__func__宏我们是用不了的,为什么呢?因为这和编译器有关,有的编译器不支持这样的宏,悲哀!
8、有很多很难记的名字对我们来说却又很重要的术语。
decltype
int haha = ;
int hahaha = ;
const int &ii = haha;
decltype(ii) hehe = hahaha;
cout<<"hehe "<<hehe<<typeid(hehe).name()<<endl;
结果是hehe 1int
主要就是将ii的类型作为hehe的类型,ii本身是一种引用类型,话说引用类型必须要初始化
constexpr很多编译器实现不了的,新标准新挑战呀