權限控制,指的是用戶只能訪問符合本身權限的資源,系統對用戶進行權限控制以防止用戶的誤操做/惡意操做等。
在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的童鞋們是個好辦法吧 ~c++