【C++】C++入门 auto关键字详解(C++11)

这篇具有很好参考价值的文章主要介绍了【C++】C++入门 auto关键字详解(C++11)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

C语言中包括了关键字auto,它可用于定义局部变量。但自从所有的非全局变量的缺省值假定为auto以来,auto就几乎很少使用了。 在C或者以前C++中,auto关键字基本上可以被无视.

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


一、C语言中的auto

在C语言的学习中我们几乎用不到auto关键字,它的存在感实在是太低了!!!
即便如此,我们还是为了C++中的auto的学习先复习一下C语言中的auto关键字吧。

1、C语言中,auto用于声明一个变量为自动变量

自动变量也称局部变量。auto关键字主要用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字经常被省略,因为所有的局部变量默认就是auto的。

  1. 用auto声明全局变量时,编译出错:
#include<stdio.h>
auto int i=0;  //编译出错
int main()
{
	return 0;
}
  1. auto声明局部变量时,编译正常:
#include<stdio.h>
int main()
{
	auto int i=0; 
	return 0;
}

2、C语言中,只使用auto修饰变量,变量的类型默认为整型

void main(void)
{
	float a = 3.2f, b = 2.1f;
	auto c = a + b;//c语言中,c = 5
}

二、C++中的auto

1、auto的基本介绍

在C++11中,auto是用来自动推导表达式或变量的实际类型的。
例如:

#include<iostream>
using namespace std;
int main()
{
	int a = 0;
	auto b = a;//此时b为int 类型
	cout << typeid(a).name() << endl;//typeid().name()可以自动识别变量的类型
	cout << typeid(b).name() << endl;
	return 0;
}

c++ auto,C++,c++,c语言,算法

可能你会觉得auto的这点功能好像可有可无啊,但其实随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:

  1. 类型难于拼写
  2. 含义不明确导致容易出错

例如这样长的的变量类型std::map<std::string, std::string>::iterator我们完全可以使用一个auto来进行代替

下面的代码可能你看不懂,但是你只需要理解这里auto的作用就行了。

#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();
	//auto it = m.begin();//与上一行代码作用相同,只是auto更加方便

	return 0;
}

可能你会觉得C语言中的typedef关键字也能做到同样的简化代码的效果,但是使用typedef有时会遇到新的难题。
例如:

typedef char* pstring;
int main()
{
const pstring p1; // 编译成功还是失败?
const pstring* p2; // 编译成功还是失败?
return 0;
}

答案是第一个编译失败,第二个编译成功。

  • 第一个实际类型是:
char*const p1;

const修饰的是p1,p1是一个常变量,常变量的创建必须初始化,而且只能初始化一次,而上面的代码并没有进行初始化,因此报错。

  • 第二个的实际类型是:
char*const* p2;

const修饰的是*p2,没有问题。

通过上面的对比相信你也能体会到auto的作用了吧,在编程时,常常需要把表达式的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的类型。然而有时候要做到这点并非那么容易,auto的出现就解决了这个问题。

2、auto的使用细则

1.使用auto定义变量时必须对其进行初始化

#include<iostream>
using namespace std;
int TestAuto()
{
	return 10;
}
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;

	//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化
	return 0;
}

c++ auto,C++,c++,c语言,算法

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

2.auto与指针和引用结合起来使用

用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&

#include<iostream>
using namespace std;
int main()
{
	int x = 10;
	auto a = &x;
	auto* b = &x;//使用auto*时,表达式右边必须是指针,否则报错
	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;
}

c++ auto,C++,c++,c语言,算法

3. 在同一行定义多个变量

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

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

3、auto不能推导的场景

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

// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
void TestAuto(auto a)
{
}

2.auto不能直接用来声明数组

void TestAuto()
{
	int a[] = {1,2,3};
	auto b[] = {456};//报错
}

tip:为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法文章来源地址https://www.toymoban.com/news/detail-712652.html

到了这里,关于【C++】C++入门 auto关键字详解(C++11)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++入门必备知识:|引用| +|auto关键字| + |范围for|】

    在这里插入图片描述 引用不是新定义一个变量,而是给已经存在的变量取别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存区间。 比如水浒传里的李逵 小名叫铁牛,江湖人称黑旋风。这些都是他,只不过名字不同。 类型 引用变量名=引用实体

    2023年04月22日
    浏览(49)
  • 计算机语言 之【C++】入门级知识讲解(命名空间,C++输入输出,缺省参数,函数重载,引用,内敛函数,auto关键字,for循环,指针空值nullptr)

    三点睡六点起,阎王夸我好身体 不到三点我不睡,太平间里抢C位 目录: 前言: 本片博客是以学习过C语言之后进入C++学习为前提,讲解C++入门级知识,为C++之后的学习做铺垫 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀

    2024年04月11日
    浏览(128)
  • 【C++】: auto关键字(C++11)+基于范围的for循环(C++11)+指针空值nullptr(C++11)

    随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在: 类型难于拼写 含义不明确导致容易出错 std::mapstd::string, std::string::iterator 是一个类型,但是该类型太长了,特别容 易写错。聪明的同学可能已经想到:可以通过typedef给类型取别名,比如: 使用typedef给类

    2024年02月08日
    浏览(41)
  • 【C++基础】auto关键字(C++11)(auto的使用细则;auto不能推导的场景;auto的使用场景;基于范围的for循环)

    在早期C/C++( C++98 )中auto的含义是:使用auto修饰的变量,是具有 自动存储器的局部变量 ,但遗憾的是一直没有人去使用它。因为在函数内定义的变量默认就是局部变量。 C++11 中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的 类型指示

    2023年04月13日
    浏览(43)
  • 【C++初阶】二、入门知识讲解(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】一、入门知识讲解 (C++、命名空间、C++输入输出、缺省参数、函数重载)-

    2024年02月04日
    浏览(64)
  • C++ : auto关键字

            前提引入:                 1.类型名,在绝大多数编程时,我们都会引入类型来定义一个我们需要的数据。                 类型众多,偶尔我们会遇见一串类型名,使用起来无比复杂。存在拼写错误,含义不明确导致出错的问题。                 列如:      

    2023年04月11日
    浏览(95)
  • 【开懂C++】引用与关键字auto

    引用就是给一个已经存在的变量取一个别名,与变量共用一段内存空间。注意引用的类型必须和变量类型相同,来演示下引用如何使用。 如上面的代码所示:我们给a取了个别名b,给b取别名c…也就是b是a的引用,c是b的引用…。 其实b,c,d都代表着a,它们都共用着一块内存空间

    2023年04月18日
    浏览(50)
  • 【C++】引用、内联函数、auto关键字等

    前言:在前面我们讲解了C++入门基础的一些学习例如命名空间、缺省参数、函数重载等。今天我们将进一步的学习,跟着博主的脚步再次往前迈一步吧。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量C++学习 👈 💯代码仓库:卫卫周大胖的学习日记💫 💪关注博

    2024年02月20日
    浏览(62)
  • c++ for循环中使用auto关键字

    代码 编译运行结果 总结 代码 编译运行结果 总结

    2024年02月14日
    浏览(41)
  • 【C++初阶(三)】引用&内联函数&auto关键字

    目录  前言  1. 引用   1.1 引用的概念   1.2 引用的特性  1.3 引用的权限  1.4 引用的使用  1.5 引用与指针的区别 2. 内联函数 2.1  什么是内联函数 2.2  内联函数的特性  3. auto  3.1 auto简介  3.2 auto使用规则  3.3 auto不能使用的场景 4.  基于范围的for循环  4.1 范围for使用

    2024年02月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包