【C++入门】一篇搞懂auto关键字

简介: 【C++入门】一篇搞懂auto关键字

作用不那么大的场景

在C++中推出了关键字auto,其最大的价值就是自动推导。

举一个例子:


int a = 10;
int b = 20;
auto c = a;
auto d = 10 + 1.2;


这里的变量c的类型就是int类型。(auto关键字会根据右边的表达式自动推导变量c的类型)。

同理auto关键字根据右边的表达式10 + 1.2来自动推导出变量d的类型为double。


我们可以打印出变量c和变量d的类型来看一下验证一下。

1.png

上面这个场景的话,其实关键字auto并没有显示多大的作用,我们还不如干脆直接定义int或double类型就好了。


auto真正的价值

2.png

上面的代码中的vector<int>::iterator it = v.begin();和auto it = v.begin();是等价的,用auto关键字的话就会很方便,可以直接把类型很长的内容直接推导出来。


其实,还有更长的类型,在某些项目的场景下,std是不允许进行展开的,请看:

std::map<std::string, std::string> dict;
std::map<std::string, std::string>::iterator dit = dict.begin();
//std::map<std::string, std::string>::iterator是一个类型
//我们直接用auto来进行推导,即定价于下面这种写法
auto dit = dict.begin();


上面这段代码的话用auto就会极大的提高我们的效率,的确是非常方便,也可以一定程度上减少我们的出错的可能性。


auto和指针结合使用

指针和auto是可以结合起来使用的。当我们使用auto来声明指针类型是,用auto和auto*其实是没有任何区别的,但是要注意一点就是用auto声明引用类型时必须加上&。

using namespace std;
int main()
{
  int a = 10;
  auto x = &a;
  auto* y = &a;//指定y必须是指针
  auto& z = a;
  cout << typeid(x).name() << endl;
  cout << typeid(y).name() << endl;
  cout << typeid(z).name() << endl;
  *x = 1000;
  *y = 2000;
  z = 10000;
  return 0;
}

4e94b56807c5453a984c10dd7cde5ed0.png


注意点

第一点:


注意:auto关键字的使用要有一个推导,不能直接进行定义,请看:

3.png


上面这种写法是错误的,这个点一定要注意。


第二点:


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


请看举例:

4.png

5.png



auto不能推导的场景

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

比如:

int Add(auto a,auto b);

这里的话就会编译失败,因为编译器无法对a的实际类型进行推导。

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

举个例子:

6.png

这是一个错误样例,auto不能直接用来声明数组。


3.为了避免于C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法。


范围for

auto在实际中最常见的又是用法就是C++11提出的新式的for循环,还有lambda表达式等进行配合使用。


比如说,我们来举一个auto与C++11提出的新式的for循环来进行配合使用,请看:


//范围for
#include<iostream>
using namespace std;
int main()
{
  int a[] = { 1,2,3,4,5,6,7,8,9,10 };
  for (auto e : a)
  {
  cout << e << " ";
  }
  return 0;
}


另外,只要是数组都可以,这里会依次取数组中的数据赋值给e(e这只是一个名字,当然也可以用a或者b又或者是c都可以),自动迭代,自动判断结束。


刚刚是读取数组中的内容,现在我们来修改数组中的内容能不能行呢?请看:

7.png


这里发现并没有改变数组中的内容,我们要知道,这里会依次读取数组中的内容并赋值给e,而e的改变并不会影响数组中的内容。


那应该怎么办呢?

别忘了,我们可以利用引用俩该改变数组中的内容,请看:


8.png

我们能不能把这里的auto改为int类型呢,答案是肯定的,当然可以了,请看:

9.png

只不过推荐使用auto,因为这样的话不管数组是什么类型的,auto都可以进行推导,减少我们出错的可能性。


范围for的使用条件

1.for循环迭代的范围必须是确定的

对于数组而言,就是数组第一个元素到最后一个元素的范围,对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。

还有一点需要我们注意,请看下面代码:

void TestFor(int arr[])
{
  for (auto& e : arr)
  {
  cout << e << endl;
  }
}


上述代码是错误的,因为这里for循环的范围是不确定的,同时arr并不是数组,而是一个指针(因为数组传参了之后就是指针),这里的arr是一个数组名,代表了首元素的地址。

10.png


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

好了,以上就是本文的主要讲解内容,主要是C++中的关键字auto。讲解了auto有价值有意义的几个使用场景,同时也介绍了auto的使用规则等等。

就到这里吧,再见啦各位!!!

目录
相关文章
|
2月前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
49 1
|
4月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
100 1
|
4月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
41 0
|
4月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
49 0
|
4月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
4月前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)
|
30天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
67 19
|
30天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
46 13
|
30天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
48 5
|
30天前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
38 5