C++11特性:auto关键字

C++11新增了一个工具,让编译器能够根据初始值的类型推断变量的类型。
auto是一个C语言关键字,它和早期C++中的auto关键字一样,它修饰局部变量,表示自动生命周期。

C++98 auto

早在C++98标准中就存在auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命周期。

auto a = 10;//自动生命周期
auto int b = 20;// 自动生命周期
static int c = 30;//延长生命周期

c++98中的auto多余且极少使用,C++11中已经删除这样的用法。

C++11 auto

auto 可以让编译器能够根据初始值推断变量的类型。

int a = 10;
auto b = a;//自动推断类型,b为 int类型
auto c = 1.9;//自动推断类型,c为double类型
auto d = 1.2e12L;//自动推断类型,d 是 long double

auto用法演示:

#include <iostream>
#include <vector>
using namespace std;

#define COUNT 5

int main (int argc, char **argv)
{
	vector<int> myvector;
	for (int i = 1; i < COUNT; ++i)
	{
		myvector.push_back(i);//在向量的最后一个元素之后,在其末尾添加一个新元素。
	}

	for (std::vector<int>::iterator i = myvector.begin(); i != myvector.end(); ++i)
	{
		cout<<*i <<" ";
	}
	cout << endl;

  return 0;
}

输出结果:

在这里插入图片描述
auto版本

#include <iostream>
#include <vector>
using namespace std;

#define COUNT 5

int main (int argc, char **argv)
{
	vector<int> myvector;
	for (int i = 1; i < COUNT; ++i)
	{
		myvector.push_back(i);//在向量的最后一个元素之后,在其末尾添加一个新元素。
	}

	for (auto it = myvector.begin(); it != myvector.end(); ++it)
	{
		cout<<*it <<" ";
	}
	cout << endl;

  return 0;
}

输出结果:
在这里插入图片描述
在for循环中it将在编译时自动推导类型,而不用我们显式去定义那常常的一串(std::vector::iterator)。

类型推导

1.auto变量必须在定义是初始化,这类似于const关键字。
2.定义在一个auto序列的变量必须始终推导成同一类型

例如:

auto a = 10, b = 20 ,c = 30;//正确
auto i = 10, j = 20, k = 'a'; //错误

在使用auto关键字做类型自动推导时,应该准守规则:

如果初始化表达式const或volatile,则除去const/volatile语义。

const int a = 10;
auto b = a; //b的类型为int而不是const int (去除const)
const auto c = a;//此时c的类型为 const int
b = 100;//合法
c = 100;//不合法

如果初始化表达式是引用,则去除引用语义。

int a = 10;
int &b = a; 

auto c = b;//c的类型为int而非 int & (去除引用)
auto &d = b;//此时c的类型才为 int &

初始化表达式为数组时,auto关键字推导类型为指针

const int arr[] = {11};
auto p = arr;//arr 是const int *,这是底层const,推导后,保留底层const,所以p是 const int*

注意

函数或者模板参数不能被声明为 auto

void func(auto a) //错误
{
   // other
}

时刻要注意auto并不是一个真正的类型。auto仅仅是一个占位符。不能使用sizeof来测试大小。

cout << sizeof(auto) << endl;//错误

总结

合理使用auto,不是很明确的规则,不建议以代码可读性为代价而简化代码。直接写出变量的类型更加清晰易懂。

在这里插入图片描述

扫二维码关注微信公众号,获取技术干货

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值