C++ 类型指示符(auto)

1、auto的概念

C++11中,auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

2、auto的使用

实列说明:

int main() 
{
	int x = 10;
	auto a = &x;
	auto* b = &x;
	auto& c = x;

	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;

	return 0;
}

运行结果:
在这里插入图片描述
解析:
在编译阶段编译器根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

注意:
1、在使用auto时必须对其进行初始化。

2、当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。 列如:

void TestAuto() 
{    
	auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同
} 

2、auto不能作为函数的参数。 列如:

void TestAuto(auto a) {}                    //错误

3、auto不能直接用来声明数组。 列如:

 auto b[] = {4,5,6};                         //错误

4、 auto不能定义类的非静态成员变量

5、实例化模板时不能使用auto作为模板参数

3、基于范围的for循环

实列说明:

#include<iostream>
using namespace std;

int main()
 {
	
		int array[] = { 1, 2, 3, 4, 5 };

		for (auto& e : array)
			e *= 2;

		for (auto e : array)
			cout << e << " ";

		return 0;

}

运作结果:
在这里插入图片描述
解析:
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,这个变量可以随意设置;第二部分则表示被迭代的范围,也就是要循环的目标。一般来说,auto通常和这样的for循环结合起来使用。

4、范围for的使用条件

1、for循环迭代的范围必须是确定的 。对于数组而言,就是数组中第一个元素和后一个元素的范围;对于类而言,应该提供begin和end的方法, begin和end就是for循环迭代的范围。列如下面的代码就是错误的:

void TestFor(int array[])
 {     
 	for(auto& e : array)         
 	cout<< e <<endl;
 } 

这是因为数组array作为函数参数时,会隐式的转化为指针。

2、只会执行++==操作,也就是说只有执行遍历操作时(列如:遍历整个数组的元素时),才可使用它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章