2.5处理类型

2.5处理类型

2.5.1 类型别名

类型别名是某种类型的名字的同义词,就是给某种类型起别的名字。
目的和便利:简单化类型名,方便记忆和使用。
方法:

  • 传统方法:使用关键字typedef
  • 新标准规定:使用别名声明来定义类型的别名

其中,关键字typedef作为声明语句中的基本数据类型的一部分出现。

typedef double wages; // wages是doule的同义词
typedef wages base,*p; // base是double的同义词,p是double*的同义词

别名声明使用关键字using作为别名声明的开始,其后紧跟别名和等号,其作用是把等号的名字规定成等号右侧类型的别名。

using wages = double; // wages是double的别名

指针、常量和类型别名

某个类型指代的是符合类型或者常量,那么它在声明语句中就会产生复杂的效果,示例:

const char c = 'u';
typedef char *pstring;
const pstring o = &c; // o是指向char的常量指针
const pstring *p = &o; // p是一个指针,它的对象是指向char的常量指针

2.5.2 atuo类型说明符

C++新标准引入的auto类型符可以让编译器替我们去分析表达式所属的类型。

int val1 = 10;
int val2 = 11;
auto item = val1 + val2; //item初始化为val1和val2相加的结果,item的类型是int

使用auto也能在一条语句中声明多个变量,因为一套声明语句只能由一个基本数据类型,所以该语句中所有的变量的初始基本数据类型都一样:

auto i= 0,*p =&i;//  正确:i是整数,p是整型指针

复合类型、常量和auto

编译器推断出来的auto类型有时候和初始值类型完全不一样,编译器会适当地改变结果类型并使其更符合初始化规则。

  • 使用引用其实是使用引用所绑定的对象,当引用被当作初始值时,真正参与初始化的其实是引用所绑定的对象的置,此时编译器回忆引用所绑定的对象的类型作为auto的类型。
int i=0,&r = i;
auto a = r; // a的类型是引用r所绑定的对象i的类型
  • auto一般会忽略顶层const,同时底层const则会保留下来,比如当初始值是一个指向常量的指针时:
int i=0;
const int ci = i, &cr = ci;
auto b = ci; // b是一个整数(ci的顶层const特性被忽略掉了)
auto c = ci; // c是一个整数(cr是ci的别名,ci本身是一个顶层const)
auto d = &i; // b是一个整型指针
auto e = &ci; // e是一个指向整数常量的指针(对常量对象取地址也是一种底层const)

如果希望推断出的auto类型是一个顶层const,则如下所写

const auto  f = ci;// ci的推演是int,f的推演是const int

2.5.3 decltype类型指示符

情况:希望从表达式的类型推断出要定义的变量的类型,但是不用该表示式的值初始化变量。
C++11新标准:第二种类型说明符decltype
作用:选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。

decltype(f()) sum = i;   

decltype处理顶层和引用的方式和auto有不同——decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内)

const int ci = 0,&cj = ci;
decltype(ci) x = 0; // x的类型式const int
decltype(cj) y = x; // y的类型式const int&, 常量引用y绑定到变量x
decltype(cj) z; // 错误:z是一个引用,必须初始化

decltype和引用

有些表达式将向decltype返回表达式结果对应的类型,一般这种情况下,意味着该表达式的结果对象能作为一条赋值语句的左值。

// decltype的结果可以是引用类型
int i = 45,*p =&i,&r = i;
decltype(r+0) b; // 正确:加法的结果式Int,因此b是一个未初始化的int
decltype(*p) c; // 错误:c是int&,必须初始化

如果表达式的内容是解引用操作,则decltype将得到引用类型。

猜你喜欢

转载自blog.csdn.net/weixin_44848852/article/details/123999349