C++中面向对象思想的封装性

类的封装

        我们编写程序的目的是为了解决现实中的问题,而这些问题的构成都是由各种事物 组成,我们在计算机中要解决这种问题,首先要做就是要将这个问题的参与者:事 和物抽象到计算机程序中,也就是用程序语言表示现实的事物。
        那么现在问题是如何用程序语言来表示现实事物?现实世界的事物所具有的共性就是每个事物都具有自身的属性,一些自身具有的行为,所以如果我们能把事物的属 性和行为表示出来,那么就可以抽象出来这个事物。
比如我们要表示人这个对象,在 c 语言中,我们可以这么表示:
typedef struct _Person{
    char name[64];
    int age;
}Person;
typedef struct _Aninal{
    char name[64];
    int age;
    int type; //动物种类
}Ainmal;
void PersonEat(Person* person){
    printf("%s 在吃人吃的饭!\n",person->name);
}
void AnimalEat(Ainmal* animal){
    printf("%s 在吃动物吃的饭!\n", animal->name);
}
int main(){
    Person person;
    strcpy(person.name, "小明");
    person.age = 30;
    AnimalEat(&person);
    return EXIT_SUCCESS;
}
        定义一个结构体用来表示一个对象所包含的属性,函数用来表示一个对象所具有的 行为,这样我们就表示出来一个事物,在 c 语言中,行为和属性是分开的,也就是 说吃饭这个属性不属于某类对象,而属于所有的共同的数据,所以不单单是 PeopleEat 可以调用 Person 数据, AnimalEat 也可以调用 Person 数据,那么万一 调用错误,将会导致问题发生。 从这个案例我们应该可以体会到,属性和行为应该放在一起,一起表示一个具有属 性和行为的对象。
        假如某对象的某项属性不想被外界获知,比如说漂亮女孩的年龄不想被其他人知道, 那么年龄这条属性应该作为女孩自己知道的属性;或者女孩的某些行为不想让外界 知道,只需要自己知道就可以。那么这种情况下,封装应该再提供一种机制能够给 属性和行为的访问权限控制住。 所以说封装特性包含两个方面,一个是属性和变量合成一个整体,一个是给属性和 函数增加访问权限。
   
封装
        1. 把变量(属性)和函数(操作)合成一个整体,封装在一个类中
        2. 对变量和函数进行访问控制 访问权限
        3. 在类的内部 ( 作用域范围内 ) ,没有访问权限之分,所有成员可以相互访问
        4. 在类的外部 ( 作用域范围外 ) ,访问权限才有意义: public private protected
        5. 在类的外部,只有 public 修饰的成员才能被访问,在没有涉及继承与派生时, private 和 protected 是同等级的,外部不允许访问
/ 封装两层含义
        //1. 属性和行为合成一个整体
        //2. 访问控制,现实事物本身有些属性和行为是不对外开放
class Person{
        //人具有的行为 ( 函数 )
public:
        void Dese(){ cout << "我有钱,年轻,个子又高,就爱嘚瑟 !" << endl;}
        //人的属性 ( 变量 )
public:
        int mTall; //多高,可以让外人知道
        protected:
        int mMoney; // 有多少钱 , 只能儿子孙子知道
        private:
        int mAge; //年龄,不想让外人知道
};
int main(){
        Person p;
        p.mTall = 220;
        //p.mMoney 保护成员外部无法访问
        //p.mAge 私有成员外部无法访问
        p.Dese();
        return EXIT_SUCCESS;
}
[struct class 的区别 ?]
class 默认访问权限为 private,struct 默认访问权限为 public.
        class A{
                int mAge;
        };
        struct B{
                int mAge;
        };
        void test(){
                A a;
                B b;
                //a.mAge; //无法访问私有成员
                b.mAge; // 可正常外部访问
        }

将成员变量设置为private

1. 可赋予客户端访问数据的一致性。
        如果成员变量不是 public ,客户端唯一能够访问对象的方法就是通过成员函数。
        如果类中所有 public 权限的成员都是函数,客户在访问类成员时只会默认访 问函数,不需要考虑访问的成员需不需要添加(), 这就省下了许多搔首弄耳的时间。
2. 可细微划分访问控制。
        使用成员函数可使得我们对变量的控制处理更加精细。如果我们让所有的成员 变量为public ,每个人都可以读写它。如果我们设置为 private ,我们可以实 现“ 不准访问 只读访问 读写访问 ,甚至你可以写出 只写访问
class AccessLevels{
public:
    //对只读属性进行只读访问
    int getReadOnly(){ return readOnly; }
    //对读写属性进行读写访问
    void setReadWrite(int val){ readWrite = val; }
    int getReadWrite(){ return readWrite; }
    //对只写属性进行只写访问
    void setWriteOnly(int val){ writeOnly = val; }
private:
    int readOnly; //对外只读访问
    int noAccess; //外部不可访问
    int readWrite; //读写访问
    int writeOnly; //只写访问
};

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值