2.5.1 类型别名
typedef以及using,用于给类型起别名,定义类型别名。
?
给double起别名命名为db,再给db起别名命名为d,此时db,d都指代的是double。第三行又将db*也就是double*命名为pd,所以pd=double*。
给类名Sales_item命名为SI。?
?
如果某个类型别名指代的是复合类型或常量,则会与之前的规定有所区分,如:
此处pstring指代的是复合类型:指针类型(指向char类型的指针)。下面展示了变化:
252行 此处的cstr1是一个指向字符型的常量指针,也就是const修饰的是cstr1,这个常量指针存储的是c1的地址。而如果进行一个错误的行为:即把pstring拆开去理解条语句就会发生错误:如255行所示,此处的cstr2,是一个指向常量字符的指针,也就是不允许通过cstr2来改变字符c1。
如253,254所示,通过cstr1改变所指对象c1是允许的,而改变cstr1这个指针的指向是不允许的,因为252表达的是cstr1是一个常量指针。而如果错误的拆分为255去理解的话,就会发生变化。
这也就是为什么说如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果。
2.52 auto类型说明符
auto这个类型说明符好像是在c++11新引入的。在看后面的章节过程中,发现auto这个类型说明符使用频率极高且极其方便,所以需要认真学习。(但是此章节内又给不出太复杂或实用的例子...)
当需要把表达式的值赋给变量时,我们需要根据表达式的值指定变量的类型,但是有的时候想知道表达式的类型或者写出这个类型有很麻烦。所以:auto能让编译器替我们去分析表达式所属的类型,让编译器通过初始值推算变量的类型。显然auto定义的变量必须有初始值。
1.? 例子:?
此处的局部变量i的定义就用到了auto。
?注意1
使用auto也能在一条语句中声明多个变量,因为一条声明语句只能有一个基本数据类型,所以语句中所有变量的初始基本数据类型必须都一样。
?
这个报错信息说明的就很清楚了。
?注意2:
auto类型说明符在某些情况下又有一些特殊之处。?
如上图,给变量at初始化时,运用的是一个引用,此时编译器以引用对象的类型作为auto的类型?
注意3:
auto一般会忽略顶层const(修饰变量本身的const),同时底层const则被保留下来。
??
解释:即如果给auto类型的变量初始化的值有顶层const属性,如a,这个常属性会被忽略,auto定义的变量不会有常属性。即int c1。
而如果用于初始化的变量是一个指向常量的指针时,即&a,这就属于一种底层const,此时被auto声明的变量就是一个指向常量的指针,不能通过c2去改变它所指向对象的值。(其实不去想这些规则,c2是一个指向常量整形的指针也是合情合理的,总不能把一个常量的地址赋给一个auto类型的变量之后,这个变量就可以改变这个常量了吧,这显然是不合理的)
如果希望推断出的auto类型是一个顶层const,需要明确指出
如果将引用的类型设为auto,则初始值中的顶层const不会忽略,会保留下来。原来的规则仍然适用。如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。
如图,m是const int&类型,本质上也就是const int类型,此时初始值的顶层const被保留了下来。而p的是const int *p?。表示指向常量整型的指针。不能改变m以及*p。
综上:当指定为auto类型时,会忽略掉初始值的顶层const。而设定为auto的引用类型时,就相当于给那个初始值起了一个别名,如果原先他就具有顶层const属性,那么引用过来也具有顶层const。这是合情合理的。而定义auto指针时,原先初始值的顶层const会变成底层const。即不允许通过指针改变指向的值。
快吐了= =
练习题:
?i是整型常量,j是整型(顶层const被忽略了),k是const int(事实上不加const,k的性质也不变),p是指向const int 的指针,类型应该是(const int *)。j2是const int类型,此处的顶层const是强制添加的。k2是const int&(事实上不加前面的const,k2也是const int&类型)
decltype 类型指示符
decltype是”declare type“的缩写,译为“声明类型”。
decltype的作用就是当定义一个变量时,只想用一个表达式的类型去定义这个变量,而不想用表达式的值时,可以用decltype。
decltype处理顶层const和引用的方式和auto有些不同,如果decltype使用的表达式是一个变量时,则返回的是这个变量的类型,包括变量的顶层const和引用在内)。即decltype使用的变量是什么类型,那么返回的就是什么类型。不会削减。
引用从来都是作为其所指对象的同义词出现的,只有在用decltype处是一个例外。
?
?
|