小白学习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