【C++】auto && 范围for (C++11)

1,328 阅读3分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

auto(C++11)

auto介绍

在早期,C/C++中 auto 的含义是:使用auto修饰的变量,auto是具有自动存储器的局部变量。 C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

可以使用 typeid().name 去打印对象的类型。

==案例分析==

int TestAuto()
{
	return 2;
}

int main()
{
	int a = 10; 
	auto b = a; auto c = 'a'; 
	auto d = TestAuto();  
	cout << typeid(b).name() << endl; 
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	return 0;
}

输出结果

int
char
int

注意: auto e; 无法通过编译,使用 auto 定义变量时必须对其进行初始化。

在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

auto使用细则

  • auto 与指针和引用结合起来使用
  1. 用auto声明指针类型时,用 autoauto* 没有任何区别
  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;

	*a = 20;
	*b = 30;
	c = 40;
	return 0;
}

输出结果

int * __ptr64
int * __ptr64
int
  • 在同一行定义多个变量

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

在这里插入图片描述

auto不能推导的场景

  1. auto 不能作为函数的参数

在这里插入图片描述

  1. auto 不能直接用来声明数组
void TestAuto()
{ 
	int a[] = {1,2,3}; 
	auto b[] = {456};
}

在这里插入图片描述

  1. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
  2. auto在实际中最常见的优势用法就是跟C++11提供的新式for循环,还有lambda表达式等进行配合使用。

范围for语法

C++ 98中如果要遍历一个数组,可以按照以下的方式:

void Testfor()
{
	int array[] = { 1,2,3,4,5 };
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
	{
		array[i] *= 2;
	}
	for (int* p = array; p < array + sizeof(array) / sizeof(array[0]); ++p)
	{
		cout << *p << endl;
	}
}

C++ 11使用范围for:

void Testfor2()
{
	int array[] = { 1,2,3,4,5 };
	for (auto& e : array)
	{
		e *= 2;
	}
	for (auto e : array)
	{
		cout << e << endl;
	}
}

使用条件

  1. for 循环迭代的范围必须是确定的 对于数组而言,就是数组中第一个元素和最后一个元素的范围; 对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。

在数组传参时,数组会降维成指针。此时不能使用范围for 在这里插入图片描述

  1. 迭代的对象要实现++和==的操作。