【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♪(・ω・)ノ谢谢阅读

下一篇文章见!!!

相关推荐
wjs20246 分钟前
Chrome 浏览器:现代网络浏览的先锋
开发语言
爱学的小涛11 分钟前
【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解
java·开发语言·笔记·后端·nio
吹老师个人app编程教学12 分钟前
详解Java中的BIO、NIO、AIO
java·开发语言·nio
爱学的小涛12 分钟前
【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
java·开发语言·笔记·后端·nio
北极无雪16 分钟前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring
AI视觉网奇39 分钟前
pymeshlab 学习笔记
开发语言·python
木向1 小时前
leetcode42:接雨水
开发语言·c++·算法·leetcode
sukalot1 小时前
windows C++-创建基于代理的应用程序(下)
c++
gopher95111 小时前
final,finally,finalize的区别
java·开发语言·jvm
m0_687399841 小时前
QT combox 前缀匹配
开发语言·数据库·qt