stexpr是否修饰成功,人工检测方法:将这个函数拿来作为数组的大小。比如int array[fn()];若没有报错则表示修饰成功。
4.constexpr在用来修饰指针的时候,这个指针要么是必须初始化为空,要么指向的对象的地址是固定不变的(static对象,全局对象);
5.并没有所谓的指向constexpr对象的指针,constexpr只能修饰指针。constexpr int *q=nullptr; q是常量指针。
2.5 处理类型
1)类型别名
1.类型别名有两种定义方法:
①:typedef double wages; // wages=double typedef wage *p //p=double *
②using SI=double;//SI=double
2.值得注意的理解:
typedef char *pstring;
const pstring cstr=0;//注意其中cstr是一个常量指针
const pstring *ps; ps是一个指针,指向一个指向char类型对象的指针。
错误的理解:将pstring换成char *.比如 const char * cstr=0;按照这样的理解,cstr应该是一个指向常量的char类型的指针。。然而在typedef这个定义中,把char*作为一个整体取了一个类型别名pstring,在const pstring cstr=0;中,const是修饰的pstring这个整体,也就是说修饰的是指针而不是char。
2)auto类型说明符
1.auto(自动类型说明符)是通过等号右边进而推断等号左边的类型。int ci=42; auto index=ci;//index被推断为int;
2.auto会忽略顶层const特性而保留底层const特性(想想吧,它不得不这样做,要是不保留底层const特性,那么赋值便是错误的,那为什么要忽略顶层const特性呢,这是为了保留可扩展性,然用户自己选择是否真的需要const,万一只是需要一个变量呢,而真正需要const可以看第3条)
3.若想给auto加上顶层const特性:const int ci=42; const auto f=ci;
3)decltype 类型指示符
1.decltype(类型提取说明符)是通过表达式的返回类型而推断出类型。decltype(fon()) sum=x;(与auto不同之处,当想用这个表达式的返回值初始化这个变量的时候,用auto,只需要它的类型,而不需要这个值得时候,用decltype)。
2.decltype是类型提取,必须提取完全,因此他会保留所有的顶层和底层const特性。
3要给一个decltype修饰的变量加上const特性,const decltype(fon()) f=42;
4.值得注意的地方:int i=42,*p=&i,&r=i;
decltype(r+0) b;//因为r是一个引用类型,decltype得到的是引用类型,r+0返回的时int类型,则b是一个int类型。
decltype(*p) c;//c是一个引用。为什么:因为p为一个指针,而对这个指针解引用得到这个指针所指的变量,但是这个变量有个特性,就是可以作为表达式的左值,因此这是一个引用类型,更加详细的说明见第5条。
5.decltype((i)) e;//e是一个引用,因为对i加一个括号修饰符,decltype会把它提取为一个表达式,一个变量可以作为赋值语句的左值,这种类型和引用具有完全相同的特性,因此e被作为一个引用,
2.6自定义类型
1)编写自己的头文件
1.不管需要不需要,最好给头文件加上防止多重定义的预处理符:
①:#ifndef XXXX
#define XXXX
#endif
②:#pragram once
2.头文件一般放的东西:
1.函数的声明
2.需要在多个文件中使用的变量的声明
3.类或者结构体
4.模版
5.inline函数
6.const变量
7.类函数成员,类数据成员的声明
8.预处理命令
|