【C++关键字】auto的使用(C++11)

简介: 【C++关键字】auto的使用(C++11)

auto关键字

早期C\C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但由于一般函数内没有声明为static的变量总是具有自动存储期的局部变量,导致关键字auto被遗弃。

而在C++11中,标准委员会赋予了auto全新的含义:

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

int main(void)
{
  int a = 10;
  auto b = a;
  auto c = 'a';
  cout << typeid(b).name() << endl;
  cout << typeid(c).name() << endl;
  return 0;
}

【注意】关键字typeid:打印变量类型

int main(void)
{
  double d = 1.1;
  int i = 10;
  auto a = i + d;
  cout << a << endl;
  return 0;
}

auto a;

【注意】这种情况属于编译错误,使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。

因此,auto并非时一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期间会将auto替换为变量实际的类型。

auto的使用细则

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

int main(void)
{
  int i = 10;
  auto a = i;
  auto* b = &a;//auto此时为int
  auto c = &a;//auto此时为int*
  return 0;
}

使用auto声明指针类型时,用auto和auto*没有区别。

int main(void)
{
  int i = 10;
  auto a = i;
  auto& b = a;//auto此时为int
  auto c = a;//auto此时为int
  return 0;
}

auto声明引用类型时必须加&

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

int main(void)
{
  auto a = 1, b = 2;//编译成功
  auto c = 3, d = 4.4//编译失败
  return 0;
}

c和d的初始化表达式类型不同

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

auto使用场景

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

void Func(auto a){}

此代码为错误代码,代码会编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导。

2.auto不能声明变数组

auto a[] = {1,2,3};

此代码为错误代码,代码会编译失败,主要因为数组的大小在声明时需要明确的指定,而auto是根据初始化表达式来推导类型的,无法确定数组的大小。

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

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