c++讲义 第一部分(2)

4. 类和对象

4.1 类和对象的基本概念

4.1.1 C和C++中struct区别

  1. c语言struct只有变量
  2. c++语言struct 既有变量,也有函数

4.1.2 类的封装

我们编写程序的目的是为了解决现实中的问题,而这些问题的构成都是由各种事物组成,我们在计算机中要解决这种问题,首先要做就是要将这个问题的参与者:事和物抽象到计算机程序中,也就是用程序语言表示现实的事物。

那么现在问题是如何用程序语言来表示现实事物?现实世界的事物所具有的共性就是每个事物都具有自身的属性,一些自身具有的行为,所以如果我们能把事物的属性和行为表示出来,那么就可以抽象出来这个事物。

比如我们要表示人这个对象,在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. 封装
  1.  把变量(属性)和函数(操作)合成一个整体,封装在一个类中
  2.  对变量和函数进行访问控制
  1. 访问权限
  1. 在类的内部(作用域范围内),没有访问权限之分,所有成员可以相互访问
  2. 在类的外部(作用域范围外),访问权限才有意义:public,private,protected
  3. 在类的外部,只有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; //可正常外部访问

}

4.1.3 将成员变量设置为private

  1. 可赋予客户端访问数据的一致性。

如果成员变量不是public,客户端唯一能够访问对象的方法就是通过成员函数。如果类中所有public权限的成员都是函数,客户在访问类成员时只会默认访问函数,不需要考虑访问的成员需不需要添加(),这就省下了许多搔首弄耳的时间。

  1. 可细微划分访问控制。

使用成员函数可使得我们对变量的控制处理更加精细。如果我们让所有的成员变量为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; //只写访问

};

4.1.3课堂练习

请设计一个Person类,Person类具有name和age属性,提供初始化函数(Init),并提供对name和age的读写函数(set,get),但必须确保age的赋值在有效范围内(0-100),超出有效范围,则拒绝赋值,并提供方法输出姓名和年龄.(10分钟)

4.2 面向对象程序设计案例

4.2.1 设计立方体类

设计立方体类(Cube),求出立方体的面积( 2*a*b + 2*a*c + 2*b*c )和体积( a * b * c),分别用全局函数和成员函数判断两个立方体是否相等。

//立方体类

class Cub{

public:

    void setL(int l){ mL = l; }

    void setW(int w){ mW = w; }

    void setH(int h){ mH = h; }

    int getL(){ return mL; }

    int getW(){ return mW; }

    int getH(){ return mH; }

    //立方体面积

    int caculateS(){ return (mL*mW + mL*mH + mW*mH) * 2; }

    //立方体体积

    int caculateV(){ return mL * mW * mH; }

    //成员方法

    bool CubCompare(Cub& c){

        if (getL() == c.getL() && getW() == c.getW() && getH() == c.getH()){

            return true;

        }

        return false;

    }

private:

    int mL; //

    int mW; //

    int mH; //

};

//比较两个立方体是否相等

bool CubCompare(Cub& c1, Cub& c2){

    if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH()){

        return true;

    }

    return false;

}

void test(){

    Cub c1, c2;

    c1.setL(10);

    c1.setW(20);

    c1.setH(30);

    c2.setL(20);

    c2.setW(20);

    c2.setH(30);

    cout << "c1面积:" << c1.caculateS() << " 体积:" << c1.caculateV() << endl;

    cout << "c2面积:" << c2.caculateS() << " 体积:" << c2.caculateV() << endl;

    //比较两个立方体是否相等

    if (CubCompare(c1, c2)){

        cout << "c1和c2相等!" << endl;

    }

    else{

        cout << "c1和c2不相等!" << endl;

    }

    if (c1.CubCompare(c2)){

        cout << "c1和c2相等!" << endl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员zhi路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值