c++ primer学习笔记5_复合类型续2

来源:互联网 发布:中银淘宝联名卡 编辑:程序博客网 时间:2024/05/24 03:21

1.constexper变量

c++新标准中,容许将变量声明为constexpr型以便于编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。一般来说,如果你认定变量一定是一个常量表达式,那就可以把它声明为constexpr类型。

2.字面值类型:

其实,算术类型,指针和引用都是属于字面值类型。但是自定义类,i/o库,还有string类不是字面值类型。自然就不能定义为constexpr类型。尽管指针和引用可以被定义为constexpr类型,但是他的初始值受到严格的限制。一个constexpr指针的初始值必须是nullptr或者为0;或者存储于某个地址的对象中。前面讲过,函数体内定义的变量一般来说并非存储在固定的地址中。因此,constexpr指针不能指向这样的变量。如果是定义在函数体外,那么他们是有固定的地址,constexpr指针可以指向这样的变量。在constexpr的声明中,如果定义了指针,那么这个constexpr仅对指针有效,跟其他对象无关。Constexpr既可以指向常量也可以指向非常量。

2.5处理类型

2.5.1类型别名

类型别名是个名字,它是某种类型的同义词,有两种方法可以定义类型别名,一个是typedef,另外的一个是using。注意1,类型别名和类型的名字等价。只要名字出现的地方,类型别名也可以出现。比如

typedef double wage;typedef wage *p;using si=int;


如果类型别名指代复合类型,那么就复杂了。比如

typedef char pstring;const pstring cstr=0;const pstring *ps;


这几句理解起来是不很费劲啊,我们一个一个分析,首先第一个,这个好理解,pstring就是一个char*的类型别名,也即是pstring是一个指向char的指针。第二个,cstr是一个指向char的常量指针。并且被初始化为0;第三个,ps是一个指向char的常量指针的指针。

2.5.2 auto类型说明符。

Auto能让编译器替我们去分析表达式的类型。注意auto定义的变量必须初始值。使用auto也能在一条语句中声明多个变量。Auto一般会忽略顶层const。底层const会保留下来。设置一个auto的引用时,初始值中顶层常量属性依然保留,。如果在一个语句中定义多个变量,注意*&从属于某个声明符,而非基本数据类型的一部分。

Decltype类型说明符

Decltype的作用是选择并返回操作数的数据类型。如果decltype使用的是一个变量,则返回该变量的类型。包括顶层const和引用。注意,引用从来都作为其所指对象的同义词出现。只有用在decltype处时是个例外。如果decltype使用的不是一个变量,那就返回表达式结果对应的类型。如果表达式类型是一个解引用操作,那么decltyppe得到的是一个引用类型。

切记,如果形如decltype((x)),的结果永远是个引用。而decltypex),只有x是引用时,结果才是引用。

0 0