權限控制,指的是用戶只能訪問符合自己權限的資源,系統對用戶進行權限控制以防止用戶的誤操作/惡意操作等。 在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的童鞋們是個好辦法吧 ~ 反正我有時候很想有這樣的控制權,確保函數職責的單一性,能快速定位問題所在。