小白学习C++ 教程二十C++ 中的auto关键字

Posted 刘润森!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白学习C++ 教程二十C++ 中的auto关键字相关的知识,希望对你有一定的参考价值。

@Author: Runsen

在 C++ 11 之前,每种数据类型都需要在编译时显式声明,在运行时限制表达式的值,但在 C++ 新版本之后,包含了许多关键字,允许程序员将类型推导留给编译器本身。

有了类型推断功能,我们可以花更少的时间写出编译器已经知道的东西。由于所有类型都是在编译阶段推导出来的,编译时间略有增加,但不影响程序的运行时间。

auto 关键字

auto 关键字指定正在声明的变量的类型将自动从其初始值设定项中扣除。对于函数,如果它们的返回类型是 auto,那么它将在运行时由返回类型表达式求值。

用 auto 关键字声明的变量只能在声明时初始化,否则会出现编译时错误

例如:

auto c = a(int)+ b(double)

在上面的代码段中,a是整型,b是双精度型,那么通过编译器的分析,c就被定义成了双精度型。

#include <bits/stdc++.h>
using namespace std;

int main()
{

    auto x = 4;
    auto y = 3.37;
    auto ptr = &x;
    cout << typeid(x).name() << endl
    << typeid(y).name() << endl
    << typeid(ptr).name() << endl;

    return 0;
}

输出

i
d
Pi

使用 typeid 来获取变量的类型。typeid 是一个运算符,用于需要知道对象的动态类型的地方。typeid(x).name() 返回 x 数据类型的简写名称,例如,它返回 i 表示整数,d 表示双精度,Pi表示整数指针等。但返回的实际名称主要取决于编译器。

auto 的一个很好的用途是在为容器创建迭代器时避免长时间的初始化。

#include <iostream>
#include <set>
using namespace std;
int main()
{
    // Create a set of strings
    set<string> st;
    st.insert({ "runsen", "is",
                "22" });

    for (auto it = st.begin();
    it != st.end(); it++)
        cout << *it << " ";

    return 0;
}

输出

22 is runsen

对于有序STL,输出是有顺的

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> st;
    st.push_back(1);
    st.push_back(2);
    st.push_back(3);

   for(auto  it = st.begin() ; it != st.end();it++ )
     cout << *it << endl;
   
    return 0;
}

输出

1
2
3

接下来,看一下 auto 和 const 的结合:

int  x = 0;
const  auto n = x;  //n 为 const int ,auto 被推导为 int
auto f = n;      //f 为 const int,auto 被推导为 int(const 属性被抛弃)
const auto &r1 = x;  //r1 为 const int& 类型,auto 被推导为 int
auto &r2 = r1;  //r1 为 const int& 类型,auto 被推导为 const int 类型

下面我们来解释一下:

  • 第 2 行代码中,n 为 const int,auto 被推导为 int。

  • 第 3 行代码中,n 为 const int 类型,但是 auto 却被推导为 int 类型,这说明当=右边的表达式带有 const 属性时, auto 不会使用 const 属性,而是直接推导出 non-const 类型。

  • 第 4 行代码中,auto 被推导为 int 类型,这个很容易理解,不再赘述。

  • 第 5 行代码中,r1 是 const int & 类型,auto 也被推导为 const int 类型,这说明当 const 和引用结合时,auto 的推导将保留表达式的 const 类型。

**auto一般会忽略掉顶层const,但底层const会被保留下来,**比如当初始值是一个指向常量的指针时:

  • int i = 0;
  • const int ci = i, &cr = ci; //ci 为整数常量,cr 为整数常量引用 auto a = ci; // a 为一个整数, 顶层const被忽略
  • auto b = cr; // b 为一个整数,顶层const被忽略
  • auto c = &ci; // c 为一个整数指针.
  • auto d = &cr; // d 为一个指向整数常量的指针(对常量对象区地址是那么const会变成底层const)

如果想编译器推断出的是一个顶层的const类型,需要进行明确说明:
const auto f = ci;

以上是关于小白学习C++ 教程二十C++ 中的auto关键字的主要内容,如果未能解决你的问题,请参考以下文章

小白学习C++ 教程二十一C++ 中的STL容器Arrays和vector

小白学习C++ 教程二十二C++ 中的STL容器stackqueue和map

小白学习C++ 教程二十二C++ 中的STL容器stackqueue和map

小白学习C++ 教程二十三如何安装和使用 C++ 标准库

小白学习C++ 教程二十三如何安装和使用 C++ 标准库

小白学习C++ 教程十五C++ 中的template模板和泛型