处理类型(auto,decltype)----C++初学之路

来源:互联网 发布:ubuntu u盘安装 编辑:程序博客网 时间:2024/06/16 19:31

*以下是自己自学C++prime的一些自己的理解,不保证权威*

先说说处理类型,什么是处理类型,就是在我们声明变量,声明各种东西,我们要用到int double 等等数据类型,越是到后面

这类的类型会越来越多,并且随着表达式的复杂,数据的类型很难去掌控,所以我们需要一种东西来让我们能够在定义类型的情况

下不容易出错,于是就有了auto与decltype。


1.typedef与using:举几个例子就能明白:

typedef int wages;//这里wages就等于了int
wages a1,a2;//a1与a2就是int类型的数a1=3.14;//a1等于3


using si=int;//这个的意思和上面的一样,新标准出的

2.auto:C++11引入,auto是让编译器通过初始值来推算变量的类型,记住,auto定义的变量一定要有初始值。

要点1:因为一条声明语句只能有一个基本类型,所以这个语句的所有变量的出事基本数据类型都必须一样。这句话的

意思就是,我们可能会出现,auto a1=0,a2=6; 的情况,既然auto是根据后面的表达式来推算类型,我们就不能矛盾,不能

说,这是int,这是double,那么auto就会不知道选择哪个,举个错误例子:auto sz=0,pi=3.14;

要点2:说完基础的东西,肯定会有引用,指针,还有会有const,学的越多,累加的一起的东西越多,这个时候更不应该弄混。

所以用例子结合我觉得印象最深,例子1:

int i=0,&r=i;auto a=r;//r是一个引用,与i绑定,那么auto的类型就不是引用,而是int

要点3:(最重要)auto会忽略掉顶层const,链接:点击打开链接,而会保留底层const,依然举个例子:

const int ci = i,&cr=ci;auto b =ci ;//const int ci是顶层const,忽略之后就只是int,所以b的类型为intauto c = cr;//结合要点2可以知道,cr绑定ci,和尚一行代码结果一样auto d = &i;//这个和要点2的例子结合,i是个int,那么&int就是i的地址,所以d的类型就是int*auto e = &ci;指向一个常量的指针。

要点4:(要点3的补充)

4-1:如果我们要实现auto加上顶层,那么就在前面加上const,const auto f=ci;

4-2:auto的引用,设置一个类型为auto的引用,初始值中的顶层常量属性会保留。例子:

auto &g=ci;//g为一个对常量的引用auto &h=42;//错误,不能为非常量引用绑定字面值const auto &j=42;//正确,对上个错误实例的纠正auto k=ci,&l=i;//k为int,l为int&auto &m=ci,*p=&ci;//m为对常量的引用,p为指向整形常量的指针auto &n=i,*p2=&ci;//错误,违反要点1的问题


3.decltype类型指示符:我们希望得出表达式中的类型,但不想用这个表达式来初始化我修饰的变量。

要点1:先说说用法:decltype(f()) sum =x;sum的类型跟随,f()的返回类型。要记住,decltype仅仅只是获取类型,编译器并不会实际调用这个函数。

要点2:与auto的要点2不同,decltype返回变量的类型,例如:

const int ci = 0,&cj=ci;decltype(ci) x = 0; //x的类型,直接与ci的类型相同,不会忽略顶层,也包括引用,这个x为const int
decltype(cj) y = x;//y的引用保留,则为 const int&,必须初始化decltype(ci) z;//违反上一行代码,错误。

要点3:如果没有要点3的话,那么decltype无法像auto那样,获取引用的对象的类型,所以decltype与引用的情况下如何获得引用对象的类型,

并且解引用在decltype的类型怎么办。

例子:

int i = 42,*p= &i,&r=i;decltype(r+0) b;这里的b的类型则就是r所绑定的对象,为int而不是int&,做法:就是让引用r作为表达式的一部分,就像r+0.decltype(*p) c;//此处为解引用,那么decltype出来的就是引用,int&,因此需要初始化,这里是错误的。

要点4:(最重要)decltype使用的是一个不加括号的变量,则得到的结果就是该变量的类型,如果在变量上加上一层或多层括号,编译器则会把

它当成一个表达式,书本上有个warning,告诉我,双括号的结果永远是引用,例如decltype((variable))。如果是decltype(varriable)除非它本身是引用

才是引用。