C 中auto的用法

auto在声明变量的时候可根据变量初始值的数据类型自动为该变量选择与之匹配的数据类型:

    double x = 100.00;
    auto y = x;//自动类型推断,x为 double 类型,所以此时auto 等价于 double
    cout << typeid(y).name() << endl;

其中 typeid 运算符的作用是输出变量的类型。结果输出了 double.

 

auto的用法

上面举的这个例子很简单,在真正编程的时候也不建议这样来使用auto,直接写出变量的类型更加清晰易懂。下面列举auto关键字的正确用法。

用于代替冗长复杂、变量使用范围专一的变量声明。

想象一下在没有auto的时候,我们操作标准库时经常需要这样:

#include<string>
#include<vector>
int main()
{
    std::vector<std::string> vec;
    for (std::vector<std::string>::iterator i = vec.begin(); i != vec.end(); i++)
    {
        //...
    }
}

这样看代码写代码很复杂。有些人会说为什么不直接使用 using namespace std,这样代码可以好看一些。但是实际上这不是该建议的方法(看文章后半部分)。使用auto能简化代码:

#include<string>
#include<vector>
int main()
{
    std::vector<std::string> vec;
    for (auto i = vec.begin(); i != vec.end(); i++)
    {
        //...
    }
}

for 循环中的变量 i 将在编译时自动推导并匹配其类型,而不用显式去定义那长长的一串。

在定义模板函数时,用于声明依赖模板参数的变量类型。

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

 

模板函数依赖于模板参数的返回值

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

当模板函数的返回值依赖于模板的参数时,无法在编译代码前确定模板参数的数据类型,故也无从知道返回值的数据类型,于是我们可以使用auto。格式如上所示。

关于为何不直接使用using namespace std的说明

《C++ Primer Plus (第六版 中文版 人民邮电出版社)》第九章:内存模型和名称空间
"有关using编译命令和using声明,需要记住的一点是,他们增加了名称冲突的可能性。"

一般说来,使用 using命令 使用 using编译命令 安全,这是由于它只导入了制定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。using编译命令导入所有的名称,包括可能并不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器并不会发出警告。另外,名称空间的开放性意味着名称空间的名称可能分散在多个地方,这使得难以准确知道添加了哪些名称。
...
然而名称空间的支持者希望有更多的选择,既可以使用解析运算符面也可以使用using声明,也就是说,不要这样做:

using namespace std; // avoid as too indiscriminate(随意)

 正确做法

int x;

std::cin >> x ;

std::cout << x << std::endl;

//or

using std::cin;

using std::cout;

using std::endl;

int x;

cin >> x;

cout << x << endl;

 

  • 21
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值