zoukankan      html  css  js  c++  java
  • C++ 中的权限控制

    权限控制,指的是用户只能访问符合自己权限的资源,系统对用户进行权限控制以防止用户的误操作/恶意操作等。

    在C++代码中,权限控制指的是程序员在接口声明/类声明/函数声明等中进行的授权控制。如下面的代码:

    class base
    {
        //friend 授权getX函数对本类的完全控制
        friend int getX(base obj);
    //public 授权外部对此类中被声明为public的函数,类成员的访问与修改
    public:
        //后置的const 禁止此函数对本类的任何修改
        virtual void show() const
        {
            cout<<"hello from base"<<endl;
        }
    //protected 仅授权子类对此类中被声明为protected的函数,类成员的访问与修改
    protected:
        //参数中的const 禁止此函数对传入参数的任何修改
        //后置的const 禁止此函数对本类的任何修改
        int getSum(const int x,const int y) const
        {
            return x+y;
        }
    //private 禁止对此类中被声明为private的函数,类成员的访问与修改
    private:
        int m_x;
    };
    int getX(base obj)
    {
        return obj.m_x;
    }
    //public 表示继承关系对外可见,外部可将此类视作base类型
    class derived : public base
    {
    public:
        virtual void show() const
        {
            cout<<"hello from derived"<<endl;
        }
    private:
        int m_Y;
    }

    c++11中新增的的lambda函数中也有权限控制相关的部分,如下代码:

    void foo(int x)
    {
        int y = 0;
        //[&]授权对此处所有可见变量进行完全控制
        auto lambda_func1 = [&](){x+=1;y-=1;};
        //[=]仅授权对此处所有可见变量进行读取
        auto lambda_func2 = [=](){int z = x+y;};
        //[=x,&y]仅授权对此处所x进行读取,对y进行读取/修改
        auto lambda_func3 = [=x,&y](){int z = x+y;y++;};
    }

    权限控制是个好东西,能够让我们最小化自己的权限以防任何的误操作,同时也能更清晰的进行编码debug,查找bug时能迅速定位相关函数代码。

    如果在c++中的全局函数中,类成员函数生命中确定更详细的权限控制,并且权限进行继承,不加权限控制符则默认与传统C++代码一致,如下代码:

    //global var
    const int g_nVar = 0;
    
    //class
    //禁止访问任何外部变量
    [NA] class base
    {
        //授权getX仅能读取本类的m_x变量
        [=m_x] friend int getX(base obj);
    public:
        //此函数禁止访问本类中任何变量
        [NA] int getConstant() const
        {
            return 10;
        }
        //授权此函数访问/修改m_x
        [&m_x] int modifiedX()
        {
            return ++m_x;        
        }
        //授权此函数可读取本类中所有变量
        [=] void show() const
        {
            cout<<"hello from base , m_x = "<<m_x<<endl;
        }
    private:
        int m_x;
    };
    [=] int getX(base obj)
    {
        return obj.m_x;
    }
    
    //禁止访问任何外部变量
    [NA] void foo(int x)
    {
        int y = 0;
        //[&]授权对此处所有可见变量进行完全控制
        auto lambda_func1 = [&](){x+=1;y-=1;};
        //[=]仅授权对此处所有可见变量进行读取
        auto lambda_func2 = [=](){int z = x+y;};
        //[=x,&y]仅授权对此处所x进行读取,对y进行读取/修改
        auto lambda_func3 = [=x,&y](){int z = x+y;y++;};
    }

    估计对于那些受够了由于在类的不知道哪个犄角旮旯里修改了某些成员变量,全局变量的bug的童鞋们是个好办法吧 ~

    反正我有时候很想有这样的控制权,确保函数职责的单一性,能快速定位问题所在。

    不知道大家是什么看法 ? ~ 欢迎发表评论。

  • 相关阅读:
    Kubernetes之Replica Set
    Kubernetes之Replication Controller
    Kubernetes之Deployment
    golang channel select
    golang slice
    epoll的由来
    ceph crush 之 crush_do_rule
    libevent
    P2P资料
    混沌理论学习笔记
  • 原文地址:https://www.cnblogs.com/xylc/p/3664521.html
Copyright © 2011-2022 走看看