effective c++條款22:將成員變數宣告為private
阿新 • • 發佈:2018-11-11
將成員變數宣告為private的三大理由:
1. 提供語法一致性:
如果將所有的變數都宣告為private,那麼當其他人使用這個類時,就不用糾結是以函式方式呼叫還是變數方式呼叫,更加節省時間。
#include <iostream> using namespace std; class MyClass { public: MyClass(){} ~MyClass(){} private: std::string name; public: std::string GetName() { return this->name; } }; int main() { MyClass Me; Me.GetName(); }
2. 可以對變數實現禁止訪問、讀寫訪問、只讀訪問、唯寫訪問:
#include <iostream> using namespace std; class MyClass { public: MyClass(){} ~MyClass(){} private: std::string name; int ClassNum; //禁止訪問 int GradeNum; public: std::string GetName() //只讀訪問 { return this->name; } void SetClassNum(int Cn) //唯寫訪問 { ClassNum = Cn; } void SetGradeNum(int Gn) //讀寫訪問 { GradeNum = Gn; } int GetGradeNum() { return GradeNum; } };
3. 保證封裝性:
#include <iostream>
using namespace std;
class SomeThingForSale
{
public:
SomeThingForSale(){}
~SomeThingForSale(){}
private:
int Value;
public:
int GetValue()
{
return Value;
}
};
沒到雙十一的時候,某件商品的價格直接通過GetValue介面即可得到,到了雙十一時,由於商品要先漲價再打折o(* ̄︶ ̄*)o,我們需要重新修改GetValue的內部實現:
#include <iostream>
using namespace std;
class SomeThingForSale
{
public:
SomeThingForSale(){}
~SomeThingForSale(){}
private:
int Value;
public:
int GetValue()
{
return Value * 1.5 * 0.5;
}
};
但是,客戶呼叫的方式依舊沒有改變,這就體現了封裝的重要性。
那麼protected如何呢?
在沒有派生類的情況下,protected和private是一樣的,但是一旦出現了派生類,如果這個派生類大量使用基類的某個變數,而之後我們要刪除此變數,那麼修改派生類程式碼付出的時間代價是不可估量的。
結論:
1. 將成員變數實現為private;
2. 如果封裝就一定要private,要麼就不封裝。