C++处理类型

来源:互联网 发布:excel编程用什么语言 编辑:程序博客网 时间:2024/06/03 13:25

编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型。然而要做到这一点并非那么容易,有时甚至做不到。其实有两个C++类型说明符可以帮助解决该问题:auto和decltype。
auto可以让编译器通过初始值来推断出变量的类型,所以使用auto声明的变量就必须要初始化。话不多说,上代码:

int i = 10;int &r = i;cout<<i<<'\t'<<r<<endl;auto t = r;t=20;cout<<i<<'\t'<<r<<'\t'<<t<<endl;auto &temp = t;cout<<"&r="<<&r<<'\t'<<"&t="<<&t<<'\t'<<"&temp="<<&temp<<endl;

这里写图片描述
首先定义一个int型变量i,初始化值为10,然后定义了i的引用r。看看i和r的输出,没问题,都是10.
接着使用auto定义了t这个变量,初始化为r。我们知道r是一个引用,那看看t是个什么类型的变量。其实auto t = r;这行代码能够通过编译就可以知道,t肯定不是一个引用,因为本身r是一个引用,不可能定义一个引用的引用,那t肯定是和i同一类型。不过为了验证一下,我们让给t重新赋值,然后输出i,r,t,发现i和r值没有变化,只有t变了,说明推断是正确的。不过按照auto的使用方法来说,t应该和r是同一类型。但是,这里需要注意的是:使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。此时编译器就以引用对象的类型作为auto的类型。
我们继续往下走,auto t = r; 这个语句定义了一个t类型的引用,也就是int型的引用temp,然后我们输出r,t,temp的地址来观察,到底这三个是个什么样的关系:可以发现,t和temp是一样的地址,也就是temp是t的引用,而和r已经没有了任何关联。
使用auto时需要注意的除了引用这,还有顶层const和底层const的问题:一般auto会忽略掉顶层const,而保留底层const。所谓顶层const,就是经const修饰后变量保持不变的,而底层const,一般是修饰指针对象,经修饰之后该指针必须指向对应类型的常量,即指向常量的指针。

0 0