C++ auto用法示例

项目的工程里用到了auto,网上查了一伙,还是没有十分清楚到底是怎么回事,就先简单记录下怎样应用、应用最多的场合吧。
一、什么是auto类型
auto是c++中的关键字。
其实在C++98标准中就有该关键字了,但是和c++11中的用法差别就大、且c++98中的作用较为鸡肋,以下仅说C++11中的情况。
auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,这种用法就类似于C#中的var关键字。
auto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。而是否会造成编译期的时间消耗,我认为是不会的,在未使用auto时,编译器也需要得知右操作数的类型,再与左操作数的类型进行比较,检查是否可以发生相应的转化,是否需要进行隐式类型转换。


二、auto用法示例
最简单的用法:

int a = 10;
auto au_a = a;//自动类型推断,au_a为int类型
cout << typeid(au_a).name() << endl;

typeid运算符可以输出变量的类型。程序的运行结果输出了

int

注:上面举的这个例子很简单但是在真正编程的时候也不建议这样来使用auto,直接写出变量的类型更加清晰易懂。

下面列举auto关键字的正确用法。

场景1、代替冗长复杂的变量声明

在使用迭代器时常常会这样操作:

list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);

for (list<int>::iterator i = l1.begin(); i!= l1.end(); i++) //迭代器的类型名称很长,阅读性不好、且容易写错
{
	cout << i.operator->() << endl;
	cout << *i << endl;
}

这样list<int>::iterator i = l1.begin()的声明迭代器i看起来繁琐冗长,我们实际可以用auto代替:auto i = l1.begin();即:

list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);

for (auto i = l1.begin(); i!= l1.end(); i++)  //非常清爽了
{
	cout << i.operator->() << endl;
	cout << *i << endl;
}

场景2、定义模板参数时,用于声明依赖模板参数的变量

template <typename _Tx,typename _Ty>
void Multiply(_Tx x, _Ty y)
{
    auto v = x+y;
    std::cout << v;
}

如上所示:我们获取x+y的值,但是x、y都是模板类型,我们无法知道其类型,这时就可以使用auto。
场景3、模板函数依赖于模板参数的返回值

template <typename _Tx, typename _Ty>
auto multiply(_Tx x, _Ty y)->decltype(x*y)
{
    return x*y;
}

当模板函数的返回值依赖于模板的参数时,我们依旧无法在编译代码前确定模板参数的类型,故也无从知道返回值的类型,这时我们可以使用auto。
auto在这里的作用也称为返回值占位,它只是为函数返回值占了一个位置。
参考链接文章
1、C++ auto用法及应用详解

2、C++11特性:auto关键字

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值