69.处理类型

Posted codemagiciant

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了69.处理类型相关的知识,希望对你有一定的参考价值。

1.类型别名

  随着程序越来越复杂,程序中用到的类型也越来越复杂,这种复杂性体现在两个方面。一是一些类型难于“ 拼写 “,它们的名字既难记又容易写错,还无法明确体现其真实目的和含义。 二是有时候根本搞不清到底需要的类型是什么,程序员不得不回过头去从程序的上下文中寻求帮助。

1.1类型别名

  类型别名(type alias)是一个名字, 它是某种类型的同义词。 使用类型别名有很多好处,它让复杂的类型名字变得简单明了、易于理解和使用, 还有助于程序员清楚地知道使 用该类型的真实目的。

  有两种方法可用千定义类型别名。 传统的方法是使用关键字typedef:

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

  新标准规定了一种新的方法, 使用别名声明(alias declaration)来定义类型的别名:

 using SI = Sales_Item;//SI是Sales_item的同义词

指针、常量和类型别名

  如果某个类型别名指代的是复合类型或常佩,那么把它用到声明语句里就会产生意想不到的后果。例如下面的声明语句用到了类型ps七ring,它实际上是类型char*的别名:

typedef char *pstring; 
const pstring cstr = O;//cstr是指向char的常量指针
const pstring *ps;//ps是一个指针,它的对象是指向char的常量指针
const char *cstr = 0;//是对const pstring cstr的错误理解

  这种理解是错误的。声明语句中用到pstring时,其基本数据类型是指针。可是用char*重写了声明语句后,数据类型就变成了char,*成为了声明符的一部分。这样改写的结果是,constchar成了基本数据类型。前后两种声明含义截然不同,前者声明了一个指向char的常量指针,改写后的形式则声明了一个指向constchar的指针。

1.2auto类型说明符

  C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应一种特定类型的说明符(比如double)不同,auto让编译器通过初始值来推算变量的类型。显然,auto定义的变量必须有初始值:

//由vall和val2相加的结果可以推断出item的类型
auto item= val1 + val2;//item初始化为val1和val2相加的结果

  此处编译器将根据val1和val2相加的结果来推断item的类型。

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

auto i = 0, *p = &i;//正确:i是整数
auto sz = 0, pi= 3.14;//错误:sz和pi的类型不一致

复合类型、常量和auto

  编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。
  首先,正如我们所熟知的,使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。此时编译器以引用对象的类型作为auto 的类型:

int i= 0,&r = i; 
auto a = r;//a是个整数(r是i的别名,而i是一个整数)

  其次,auto一般会忽略掉顶层const(参见C++ Primer2.4.3节, 第57页), 同时底层const则会保留下来, 比如当初始值是一个指向常量的指针时:

const int ci = i, &er = ci;
auto b = ci;//b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr;//ie是一个整数(er是ci的别名,ci本身是一个顶层const)
auto d = &i;//d是一个整型 指针(整数的地址就是指向整数的指针) 
auto e = &ci;//e是一个指向整数常责的指针(对常量 对象取地址是一种底层const)

如果希望推断出的auto类型是一个顶层const,需要明确指出:

以上是关于69.处理类型的主要内容,如果未能解决你的问题,请参考以下文章

(69)Python异常处理与断言

69.类型后缀,重载操作符""

Taro+react开发(69):传入localstoage需要jsonstringfy处理

Taro+react开发(69):传入localstoage需要jsonstringfy处理

2020新书深度学习自然语言处理简明导论,69页pdf

LeetCode 69. Sqrt(x)