【C++】 C++入门 — auto关键字

C++入门

auto 关键字

1 介绍

编程时常常需要把表达式的值赋给变量,这就要求在声明变量时清楚地知道表达式的类型 。然而要做到这一点并非那么容易,有时甚至做不到。如下:

  1. 类型难于拼写
  2. 含义不明确导致容易出错
cpp 复制代码
#include <string>
#include <map>
int main()
{
	std::map<std::string, std::string> m{ { "apple", "苹果" }, 
	{ "orange","橙子" },
	{"pear","梨"} };
	
	std::map<std::string, std::string>::iterator it = m.begin();
	while (it != m.end())
	{
		//....
	}
	return 0;
}

std::map<std::string, std::string>::iterator 是一个类型,但是该类型太长了,特别容易写错

为了解决这个问题,C++11完善了auto类型。通过使用它,就能让编译器替我们去分析表达式所属的类型。

C++11中,标准委员会赋予了auto全新的含义:
auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

2 使用细则

使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此 auto 并非是一种"类型"的声明,而是一个类型声明时的"占位符",编译器在编译期会将auto替换为变量实际的类型

  1. auto与指针和引用结合起来使用
    用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
  2. 在同一行定义多个变量
    当在同一行声明多个变量时,这些变量必须是相同的类型 ,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
cpp 复制代码
#include<typeinfo>
#include<iostream>

using namespace std;

int main() {
	int x = 10;

	auto a = 1,b = 5;//前后一致可以
	auto c = 10,d = 1.0;//这样会报错,因为c和d的初始化表达式类型不同

	return 0;
}

3 注意事项

auto有不能被推导的情况:

  1. auto不能作为函数的参数
cpp 复制代码
void add(auto a, auto b){
	//这样不能通过编译!!!
}
  1. auto不能直接用来声明数组
cpp 复制代码
void TestAuto()
{
	int a[] = {1,2,3};
	auto b[] = {4,5,6};//这样会报错!!!
}
  1. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法

  2. auto在实际中最常见的优势用法C++11提供的新式for循环,还有lambda表达式等进行配合使用

  3. 切记不要过度使用auto 关键字,不然代码的可读性会大大折扣!!!

cpp 复制代码
#include<iostream>

using namespace std;

auto func(){
	//...
	if(){
	//...
	return a;
	}
	else if(){
	//...
		if(){
		//...
			return b;
		}
		//...
		return c;
	}
	//...
	
}

int main() {
	auto add = 	func();
}

像这样多上几个嵌套,就不好确认数据类型,让代码可读性大打折扣!!!

Thanks♪(・ω・)ノ谢谢阅读

下一篇文章见!!!

相关推荐
onlooker66668 分钟前
Go 语言底层(四) : 深入 Context 上下文
开发语言·数据库·golang
Bardb18 分钟前
01__C++入门
c++·qt
若水晴空初如梦1 小时前
QT聊天项目DAY14
开发语言·qt
幼稚园的山代王1 小时前
python3基础语法梳理(一)
开发语言·python
幼稚诠释青春1 小时前
面试实例题
java·开发语言
weixin_457665391 小时前
C++11新标准
开发语言·c++
阿蒙Amon1 小时前
C#封装HttpClient:HTTP请求处理最佳实践
开发语言·http·c#
大白爱琴2 小时前
使用python进行图像处理—像素级操作与图像算术(4)
开发语言·图像处理·python
奔跑吧邓邓子2 小时前
解锁Vscode:C/C++环境配置超详细指南
c语言·c++·vscode·配置指南
虾球xz3 小时前
CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
开发语言·c++·物联网·学习