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的童鞋們是個好辦法吧 ~

反正我有時候很想有這樣的控制權,確保函數職責的單一性,能快速定位問題所在。

不知道大家是什么看法 ? ~ 歡迎發表評論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM