effective c++条款22:将成员变量声明为private

版权声明:转载请注明出处,谢谢!!! https://blog.csdn.net/qhdhnbd110/article/details/83614808

将成员变量声明为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,要么就不封装。

猜你喜欢

转载自blog.csdn.net/qhdhnbd110/article/details/83614808
今日推荐