1. 程式人生 > >effective c++條款22:將成員變數宣告為private

effective c++條款22:將成員變數宣告為private

將成員變數宣告為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,要麼就不封裝。