zoukankan      html  css  js  c++  java
  • using用法总结

    一、命名空间的使用

    不再赘述。

    二、在子类中改变基类成员的访问权限

    using可以将publicprotected的基类成员的访问权限改为publicprotectedprivate,注意,using不能改变基类的private成员的访问权限,因为子类根本访问不到基类的private成员。

    #include<iostream>
    using namespace std;
    
    //基类People
    class People {
    public:
        void show();
    protected:
        char *m_name;
        int m_age;
    };
    void People::show() {
        cout << m_name << "的年龄是" << m_age << endl;
    }
    
    //派生类Student
    class Student : public People {
    public:
        void learning();
    public:
        using People::m_name;  //将protected改为public
        using People::m_age;  //将protected改为public
        float m_score;
    private:
        using People::show;  //将public改为private
    };
    void Student::learning() {
        cout << "我是" << m_name << ",今年" << m_age << "岁,这次考了" << m_score << "分!" << endl;
    }
    
    int main() {
        Student stu;
        stu.m_name = "小明";
        stu.m_age = 16;
        stu.m_score = 99.5f;
        stu.show();  //compile error
        stu.learning();
    
        return 0;
    }
    /*
    代码中首先定义了基类 People,它包含两个 protected 属性的成员变量和一个 public 属性的成员函数。定义 Student类时采用 public 继承方式,People 类中的成员在 Student 类中的访问权限默认是不变的。
    
    不过,我们使用 using 改变了它们的默认访问权限,如代码第 21~25 行所示,将 show() 函数修改为 private 属性的,是降低访问权限,将 name、age 变量修改为 public 属性的,是提高访问权限。
    
    因为 show() 函数是 private 属性的,所以代码第 36 行会报错。把该行注释掉,程序输出结果为:
    我是小明,今年16岁,这次考了99.5分!
    */
    

    三、指定别名

    类似于typedef , 但比typedef 好用:

    using zjz = int;
    
    int a = 10;
    

    或许从这个例子中,我们是看不出来明显的好处的(而于我来说,以一个第三者的角度,这个例子也难以说服我一定要用C++11的using)。
    再来看下:

    typedef void (*FP) (int, const std::string&);
    

    若不是特别熟悉函数指针与typedef的童鞋,我相信第一眼还是很难指出FP其实是一个别名,代表着的是一个函数指针,而指向的这个函数返回类型是void,接受参数是int, const std::string&。那么,让我们换做C++11的写法:

    using FP = void (*) (int, const std::string&);
    

    我想,即使第一次读到这样代码,并且知道C++11 using的童鞋也能很容易知道FP是一个别名,using的写法把别名的名字强制分离到了左边,而把别名指向的放在了右边,比较清晰。

    从可读性来看,using也是要好于typedef的。

    那么,若是从可读性的理由支持using,力度也是稍微不足的。来看第二个理由,那就是举出了一个typedef做不到,而using可以做到的例子:alias templates, 模板别名。

    template <typename T>
    using Vec = MyVector<T, MyAlloc<T>>;
    
    // usage
    Vec<int> vec;
    

    这一切都会非常的自然。
    参考:

    https://zhuanlan.zhihu.com/p/21264013

  • 相关阅读:
    boost::ASIO的异步方式
    C++ 类构造函数初始化列表
    C++11 shared_ptr(智能指针)详解
    C/C++中静态成员变量和静态成员函数的含义与不同用法
    静态局部变量
    GDB入门教程之如何使用GDB启动调试
    Qt的QWaitCondition了解一下吧
    Qt信号量QSemaphore认识一下
    瞧一瞧Qt的QMutex
    Qt的读写锁QReadWriteLock要怎么玩?
  • 原文地址:https://www.cnblogs.com/rookiezjz/p/12347685.html
Copyright © 2011-2022 走看看