• C++ 11中几个我比较喜欢的语法(三)


    随着Vsisual Studio 2013 RC版的放出,之前承诺的对C++ 11语法支持已经全部完成,本文是C++ 11中我喜欢的语法系列的最后一部分(一)(二)

    非静态成员直接初始化

    在C++ 03的时候,非静态成员变量只能在对象的构造函数里初始化,例如:

        struct A
        {
            int m;
            A() : m (7) { }
        };

    当对象成员比较多的时候,这个对象成员的初始化是非常难看的。尤其是在构造函数较多的情况下,由于C++ 03不支持委托构造函数,这一大堆的成员需要在每一个构造函数中初始化一遍,是十分冗繁而容易出错的。

    在C++ 11中,非静态成员也能以静态成员那种方式直接初始化的,这样就直观的多了:

        struct A
        {
            int m = 7;
        };

     

    启用和禁止默认函数

    在C++中,编译器会生成一些默认函数,例如对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数,如

    1. A(void);                    // 缺省的无参数构造函数
    2. A(const A &a);                // 缺省的拷贝构造函数
    3. ~A(void);                    // 缺省的析构函数
    4. A & operate =(const A &a);    // 缺省的赋值函数

    在C++ 11中,支持通过 default delete 两个关键字来管理这默认函数。delete意为禁止默认函数,default则使用默认函数。

    例如,当我们自定义你空构造函数时,编译器就不会给我们生成缺省无参构造函数,此时则可以通过= default来让编译器产生默认构造函数。

        struct A
        {
            A() = default;
            A(int n) {}
        };

    至于= delete,一个比较典型的用途是可以定义一个不可拷贝的对象,如:

        struct NoCopy
        {
            NoCopy & operator =(const NoCopy &) = delete;
            NoCopy(const NoCopy &) = delete;
        };

    另外,= delete也可以用于禁止那些隐式转换而执行的函数,例如:

        struct A
        {
            void foo(int k){}
            void foo(double k) = delete;
        };

    这样,类似a.foo(3.2)之类的调用就会有编译错误(话说,应该像C#那样天生报编译错误才更为合理)。

     

    类型别名

    虽然自C语言时代就支持通过typedef来为类型起别名,但typedef对函数指针起别名显得比较难看,并且不支持模板。因此,在C++ 11种新增了using为对象起别名的语法:

        // typedef std::ios_base::fmtflags flags;
        using flags = std::ios_base::fmtflags;

        // typedef void (*func)(int, int);
        using func = void(*) (int, int);


        template<class T> using ptr = T*;
        //'ptr<T>'
    等价于
    T 的指针
        ptr<int> x;

  • 相关阅读:
    定理,定律,公理
    逻辑的体系:论据-》论证-〉论点
    深度解读:数学的本质与宇宙万物的关联--数学的本质是一门语言
    第一性原理的钥匙—逻辑奇点
    系统论的两个方向:系统分析与系统构建
    系统
    科学思考
    系统思考-使用系统论构建系统
    系统论是大尺度的还原论的时空思考-系统论是宏观上的还原论
    思考的几种形式
  • 原文地址:https://www.cnblogs.com/TianFang/p/3306231.html
Copyright © 2020-2023  润新知