赞
踩
面向对象方法中的抽象 ,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。
一个问题的抽象包括:数据抽象和行为抽象(或被称为功能抽象、代码抽象)。前者描述某类对象的属性和状态,也就是此类对象区别于彼类对象的特征,后者描述的是某类对象共同行为或功能特征。
封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合,形成“类”,其中的数据和函数都是类的成员。
以时钟为例:
- class Clock
- {
- public:
- //时钟的行为——函数成员
- void setTime(int newH,int newM,int newS);
- void showtime();
- private:
- //时钟的数据——数据成员
- int hour,minute,second;
- };
定义类的语法形式如下:
- class 类名称
- {
- public:
- //外部接口
- protected:
- //保护型成员
- private:
- //私有成员
- };
2.2.1 访问权限
2.2.2 struct和class的区别
C++中struct和class的唯一区别在于默认的访问权限不同。
2.2.3 数据成员私有化
以汽车为例:
- class Car
- {
- public:
- //编号:外侧可读可写
- //设置编号
- void setID(int ID)
- {
- m_ID=ID;//ID是对外提供的一个公共的成员函数,来给数据成员赋值
- }
- //获取编号
- int getID()
- {
- return m_ID;
- }
-
- //型号:外侧只读
- //获取型号
- string getmodel()
- {
- return m_nodel;
- }
-
- //功率:外侧只写
- //设置功率
- //对数据进行有效性检测
- void setpower(int power)
- {
- if(power<0||power>1000)
- {
- cout<<"请输入合理的数据"<<endl;
- return;
- }
- m_power=power;
- }
-
- private:
- int m_ID;
- string m_model;
- int m_power;
- };
在C++中。类的对象就是该类的某一特定实体(也称实例)。
- //和一般变量相同
- 类名 对象名;
-
- Car mycar1;
- Car mycar2;
注意,对象所占据的内存空间只是用于存放数据成员,函数成员不在每一个对象中存储副本,每个函数的代码在内存中只占据一份空间。
访问数据成员的形式是:对象名.数据成员名
调用函数成员的一般形式是:对象名.函数成员名(参数表)
- //访问Car类的对象mycar1的函数成员
- mycar1.setID(int ID);
- mycar1.getID();
2.4.1 成员函数的实现
实现成员函数时要指明类的名称。与普通函数不同,类的成员函数名需要用类名来限制。示例如下:
- 返回值类型 类名::函数成员名(参数表)
-
- {
-
- 函数体
-
- }
- void Car::set(int ID,string model, int power, double price, string color)
- {
-
- m_ID = ID;
- m_Model = model;
- m_Power = power;
- m_Price = price;
- m_Color = color;
-
- }
- void Car::Display()
- {
- cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率 为" <<m_Power << "马力,价格为 " << m_Price << "元\n";
- }
2.4.2 成员函数调用中的目的对象
调用一个成员函数与调用普通函数的差异在于,需要使用"."操作符指出调用所针对的对象,这一对象在本次调用中称为目的对象。
- mycar.Display();
- //mycar是这一调用过程中的目的对象
2.4.3 带默认形参值的成员函数
类成员函数的默认值,一定要写在类定义中,而不能写在类定义之外的函数实现中。
如果调用这个函数没有给出实参,就会使用默认形参值。
- class Car
- {
- public:
- void set(int ID=1,string model=A, int power=100, double price=25, string color=RED);
- }
2.4.4 内联成员函数
有的函数被频繁调用,而且代码比较简单,这个函数也可以定义为内联函数(inline function)。
内联函数的声明有两种方式:隐式声明和显式声明
将函数直接放在类体内,这种方法称之为隐式声明:
- class Car
- {
- public:
- void set(int ID,string model, int power, double price, string color);
- void Display()
- {
- cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率为" << m_Power << "马力,价格为 " << m_Price << "元\n";
- }
- private:
- int m_ID;//编号
- string m_Model;//型号
- int m_Power;//功率
- double m_Price;//价格
- string m_Color;//颜色
- };
为保证类定义的简洁,可以采用关键字inline显式声明的方式。即在函数体实现时,在函数返回值前类型加上inline:
- inline void Car::Display()
- {
- cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率为" << m_Power << "马力,价格为 " << m_Price << "元\n";
- }
声明一个车辆类Car,至少包含编号(ID)、型号(Model)、功率(Power)、颜色(Color)、价格(Price)等私有成员变量。包含必要的公有成员函数,实现属性设置、属性获取、属性显示的功能。get和set函数分别用于获取和设置车辆的成员变量。显示车辆属性信息的成员函数Display,可以输出如下信息:“编号***的***型汽车的颜色是*色,功率为***马力,价格为*”。
声明至少3个车辆实例对象。提示用户输入全部车辆信息。用户完成输入后,将3辆车的全部信息显示出来,并统计最高价格、平均价格。
首先声明车辆类car,用set和get函数分别完成设置和获取车辆的成员变量。set充当外部接口,用户可以访问、设定数据。如果不使用set函数,那么这个类无法从外部访问(只读,不可写),一旦被赋值就无法更改。然后声明display函数,车辆类car即完成。
- class Car
- {
- public:
-
- //属性设置
- void setcar(int ID,string model, int power, double price, string color)
- {
- m_ID = ID;
- m_Model = model;
- m_Power = power;
- m_Price = price;
- m_Color = color;
- }
-
-
- //属性获取
- string getModel()
- {
- return m_Model;
- }
-
- string getColor()
- {
- return m_Color;
- }
-
- int getID()
- {
- return m_ID;
- }
-
- int getPower()
- {
- return m_Power;
- }
-
- double getPrice()
- {
- return m_Price;
- }
-
- private:
- int m_ID;//编号
- string m_Model;//型号
- int m_Power;//功率
- double m_Price;//价格
- string m_Color;//颜色
-
- public:
- void Display()
- {
- cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率为" << m_Power << "马力,价格为 " << m_Price << "元\n";
- }
- };
对于计算价格的最大值和平均值,分别声明一个平均值函数(average)和求解最大值(max)函数,然后返回。
- double average(double a, double b, double c)//求平均值
- {
- double val = 0.0;
- val = (a + b + c) / 3;
- return val;
- }
-
- double max(double a, double b, double c) //求最大值
- {
- double d = (a > b) ? a : b;
- double e = (d > c) ? d : c;
- return e;
- }
主函数中,首先要声明对象,然后建立用户输入界面。这里声明的car类对象是c1,c2,c3,调用setcar函数访问并设置属性。值得一提的是,这里又另外定义了三个double变量a,b,c,用来记录price,从而计算出平均值和最大值。
- int main()
- {
- int ID = 0;
- int power = 0;
- double price = 0;
- string model ;
- string color;
-
- double a, b, c;//用来记录三辆车的价格
-
- cout << "请输入第一辆车的车辆信息:(编号、型号、功率、价格、颜色)" << endl;
- cin >> ID >> model >> power >> price >> color;
- Car c1;
- c1.setcar(ID, model, power, price, color);
- a = price;
-
- cout << "请输入第二辆车的车辆信息:(编号、型号、功率、价格、颜色)" << endl;
- cin >> ID >> model >> power >> price >> color;
- Car c2;
- c2.setcar(ID, model, power, price, color);
- b = price;
-
- cout << "请输入第三辆车的车辆信息:(编号、型号、功率、价格、颜色)" << endl;
- cin >> ID >> model >> power >> price >> color;
- Car c3;
- c3.setcar(ID, model, power, price, color);
- c = price;
-
- c1.Display();
- c2.Display();
- c3.Display();
-
- cout << "平均价格是" << average(a, b, c) << endl;
- cout << "最高价格是" << max(a, b, c) << endl;
- }
初学类与对象,感觉它和结构体比较像,但是两者在访问权限上有所不同。让我感到困难的地方是类中各种函数的声明和调用,以及参数传递(形参、缺省参数)。这大概是因为前一章函数的基础还没有打好,需要再敲敲代码、写写博客加深理解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。