C++ auto关键字

C++ auto关键字

C++中有很多很长的类型,那么作为一个优秀的编程语言肯定会想办法便利程序员开发。在C语言中typedef给类型取别名,但是typedef还是有很多不足,比如我只用一次该类型,那么typedef重命名就有点多余了。C++11标准中将auto赋予新的含义,也可以完成这一功能。

auto关键字

C++11重新定义关键字auto的含义,使得auto能方便我们日常编写代码。

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

auto的使用细则

  • auto声明的变量必须由编译器在编译时期推导可以得出的。
  • 用auto声明指针类型时,用auto和auto* 没有任何区别,但用auto声明引用类型时则必须加&
  • 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后推导出来的类型定义其他变量。
  • auto不能作为函数的参数,可以做返回值,但是建议谨慎使用。
  • auto不能直接用来声明数组

样例1:“auto”的符号必须具有初始值设定项

#include <iostream>
using namespace std;
int func1()
{
	return 10;
}

int main()
{
	int a = 10;
	auto b = a;
	auto c = 'a';
	auto d = func1();

	// 编译报错:error C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项
	//auto e;

	cout << typeid(b).name() << endl;	// int
	cout << typeid(c).name() << endl;	// char
	cout << typeid(d).name() << endl;	// int
}

样例2:auto和auto* 没有任何区别,但用auto声明引用类型时则必须加&

#include <iostream>
using namespace std;
int main()
{
	int x = 10;
	auto y = &x;
	auto* z = &x;
	auto& m = x;

	cout << typeid(y).name() << endl;	// int * __ptr64
	cout << typeid(z).name() << endl;	// int * __ptr64
	cout << typeid(m).name() << endl;	// int
	return 0;
}

样例3:“auto”必须始终推导为同一类型、数组不能具有其中包含“auto”的元素类型

#include <iostream>
using namespace std;
int main()
{
	auto aa = 1, bb = 2;
	// 编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型
	//auto cc = 3, dd = 4.0;

	// 编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
	//auto array[] = { 1, 2, 3 };
	return 0;
}

样例4:auto可以做函数的返回值但不能做参数类型 (不建议使用)

#include <iostream>
using namespace std;
auto func2(int x)
{
	return x;
}

// 编译报错:error C3533: 参数不能为包含“auto”的类型
//auto func3(auto x = 10)
//{
//	return x;
//}

int main()
{
	return 0;
}

auto关键字使用场景

1. 代替长类型

上面都是一些auto来代替int之类的短类型,但是实际上我们并不这样做,一般情况下auto是用来代替长类型,便利开发人员的编码。

#include <iostream>
#include <map>
using namespace std;
int main()
{
	map<string, string> dict;
	map<string, string>::iterator mit1 = dict.begin();
	auto mit2 = dict.begin();
	return 0;
}

如上申明一个map的迭代器,采用auto就非常简洁并且编码效率高。但是可读性就变差了。

2. 范围for中使用

#include <iostream>
#include <list>
using namespace std;
int main()
{
	list<int> lt = { 1,2,3,4,5 };
	for (auto& k : lt)
	{
		cout << k << "->";
	}
	cout << endl;
	return 0;
}

一般我们习惯在范围for中使用auto,省去我们自主判断类型的时间,但是依然降低了可读性。

auto关键字的缺点

  1. 降低代码可读性
  2. 不适用invisible proxy class(代理类)
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中提到,C语言中的auto关键字用于声明变量并自动推断其类型。auto declarator initializer*;的语法表示可以声明一个或多个具有自动类型推断的变量。同时,引用也提到了C语言引入了auto关键字来实现类型推导,通过auto关键字可以方便获取复杂的类型,并简化书写,提高编码效率。 更具体地说,使用auto关键字声明变量时,编译器会根据变量的初始化表达式来推断变量的类型。这样可以减少代码中的类型声明,使代码更加简洁和灵活。例如,在函数参数中使用auto关键字可以实现参数的类型推导,使函数调用更加方便。同时,auto关键字还可以与范围for循环结合使用,自动推断容器中元素的类型。 关于C语言auto关键字的更多详细信息,可以参考引用所提供的Microsoft的官方文档链接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C++ auto关键字](https://blog.csdn.net/L_Chee/article/details/125349312)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [C++基础:关键字auto](https://blog.csdn.net/weixin_58368590/article/details/124871252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值