zoukankan      html  css  js  c++  java
  • C++0X 学习之 auto

    auto并不是一个新关键词,是一个把旧关键词赋予新的作用,
    新的作用修饰变量声明,指示编译器根据变量的初始化表达式推导变量应有的类型。
    auto 声明的变量必须“在声明处完成初始化”,编译器才可根据初始化表达式推导变量的类型。
    二话不说,先看看例子呗。
    对于现在,我们一般通过迭代器 for 容器的时候,都会写出这样的代码

    #include <map>
    #include <string>
    struct people
    {
        int age;
        char sex;
    };
    
    typedef std::map<std::string,people> people_map;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        people_map my_map;
        for (people_map::iterator it = my_map.begin(); it != my_map.end(); ++it)
        {
            std::cout<<"do something"<<std::endl;
        }
    
        return 0;
    }

    获取容器的迭代器之前,我们要写出容器的类型,在这里用了 typedef,把类型缩短了=,=,
    要是懒点的话,很可能写成 std::map<std::string, people>::iterator。我的天啊,
    我仅仅想获取它的迭代器,却要写那么多代码。很多时候,我们并不需要知道容器的类型,
    或者,我们已经非常清楚类型了,那么,除了用 typedef 简化,还有啥方法呢?

    这就是 auto 关键词的新作用了,用来推倒表达式的应有类型,代码改进后是这样子了。

    #include <map>
    #include <string>
    
    struct people
    {
        int age;
        char sex;
    };
    
    int main()
    {
        std::map<std::string, people> my_map;
        for (auto it= my_map.begin(); it!=my_map.end(); ++it)
        {
            std::cout<<"do something"<<std::endl;
        }
        return 0;
    }

    在这里,把 typedef 咔嚓掉了(但是声明变量的时候麻烦了点)=,=,然后获取迭代器, 直接用 auto 了,不用管它是什么类型了。 在这里,it 自动推导成 std::map<std::string, people>::iterator 了。

    auto 是不是很强大的一个关键词呢,在新的作用下,可以写出更简洁的代码。 但是 auto 也有局限性,比如上面的例子,他是推导成 std::map<std::string, people>::iterator, 不会推导成 std::map<std::string, people>::const_iterator。

    使用 auto关键词也有注意的地方(摘自网络):

    注意一:auto 不能做为模板参数。因为这违背了 auto 需要由初始化表达式来推导类型的原则。

    注意二:auto 不能做为函数的参数类型和返回类型。同样是因为违背了 auto 推导类型的原则。 函数在编译时要实例化,此时便需要确定参数的类型,以方便安排内存。声明为 auto 的话如何确定其类型呢?没法确定,所以这样用是不允许的。

    下面再让我门看看  auto  的一点代码 然后 就可以睡觉了:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        auto a = 100;
        cout<<a<<endl;    //100
    
        auto b = 12.0f;
        cout<<b<<endl;    //12
    
        auto& c = a;
        c++;
        cout<<a<<endl;    //101
    
        vector<int> vec;
        for(int i = 0; i < 10; ++i)
        {
            vec.push_back(i);
        }
        for (auto it = vec.cbegin(); it != vec.cend(); ++it)
        {
            cout<<*it<<endl;    // 0 1 2 3 4 5 6 7 8 9
        }
    
        //lambda 表达式
        auto pF = [&c](int i)->int{ return c+=i; };
        cout<<pF(1)<<endl;   //102
    
        cout<<a<<endl;        //102
    
        return 0;
    }

    好吧 同志们 每天学习一点点 洗洗睡吧!!!

    Dreams are one of those things that keep you going and happy!!!
  • 相关阅读:
    div弹出层
    经典SQL语句
    sql连接及操作
    给flash加上连接
    在c#中图片原比例缩放
    悬浮提示筐
    拖动板块
    IFrame自适应高度
    SQL语句中的日期计算
    注意Request.Cookies["UserID"]的用法
  • 原文地址:https://www.cnblogs.com/MrGreen/p/3271678.html
Copyright © 2011-2022 走看看