用程序语言来表示现实事物
C语言思想: 数据与方法分开
//人
typedef struct
{
char name[32];
int age;
}Person;
//动物
typedef struct
{
char name[32];
int age;
int type;
}Dog;
void PersonEat(Person *p)
{
cout<<p->name<<"正在吃饭"<<endl;
}
void DogEat(Dog *d)
{
cout<<d->name<<"正在吃狗粮"<<endl;
}
void test01()
{
Person person = {"小明",43};
Dog dog={"泰迪",6};
PersonEat(&person);
DogEat(&dog);
// 出现一个问题(数据 方法独立 容易造成 方法 调用错误数据)
DogEat((Dog *)&person);
}
封装
封装特性包含两个方面,一个是属性和变量合成一个整体,一个是给属性和函数增加访问权限。
- 把变量(属性)和函数(操作)合成一个整体,封装在一个类中
- 对变量和函数进行访问控制
访问权限: - 在类的内部(作用域范围内),没有访问权限之分,所有成员可以相互访问
- 在类的外部(作用域范围外),访问权限才有意义:public,private,protected
- 在类的外部,只有 public 修饰的成员才能被访问,在没有涉及继承与派生时, private 和 protected 是同等级的,外部不允许访问
类
class 类名{//抽象的概念 系统不会为其分配空间
private://私有 类的外部不可直接访问
protected://保护 类的外部不可直接访问
数据
public://公有 类的外部可以直接访问
方法
//在类的内部 没有权限之分 都可以相互访问
};
class默认是私有的,数据私有,方法公有;
用户可以借助公有方法,间接的操作私有数据。
面向对象程序设计案例
Person类的设计
设计一个Person类,可以添加人的姓名以及年龄,在外界通过公有放法对姓名年龄进行修改
#include <iostream>
#include <string.h>
using namespace std;
class Person
{
private:
char m_name[32];
int m_age;
public:
void initPerson(char *name,int age)//Person的初始化
{
if(name != NULL)
strcpy(m_name,name);
if(age >0 && age <100)
m_age = age;
}
void setName(char *name)//对名字的写操作
{
if(name != NULL)
strcpy(m_name,name);
}
char* getName(void)//对名字的读操作
{
return m_name;
}
void setAge(int age)//对年龄的写操作
{
if(age >0 && age <100)
m_age = age;
else
cout << "age无效" << endl;
}
int getAge(void)//对年龄的读操作
{
return m_age;
}
void showPerson(void)//遍历
{
cout << "姓名:" << m_name << ",年龄:" << m_age << endl;
}
};
int main(int argc, char *argv[])
{
Person lucy;
lucy.initPerson("lucy",18);
lucy.showPerson();
cout << "姓名:" << lucy.getName() << endl;
cout << "年龄:" << lucy.getAge() <<endl;
lucy.setAge(20);
lucy.showPerson();
return 0;
}
设计立方体类
设计立方体类,求出立方体面积和体积,分别用全局函数和成员函数判断两个立方体是否相等;
#include <iostream>
using namespace std;
class Cube
{
private:
int m_l;
int m_w;
int m_h;
public:
//写操作 长宽高
void setL(int l)
{
m_l = l;
}
void setW(int w)
{
m_w = w;
}
void setH(int h)
{
m_h = h;
}
//读操作 长宽高
int getL(void)
{
return m_l;
}
int getW(void)
{
return m_w;
}
int getH(void)
{
return m_h;
}
//立方体面积
int cubeS(void)
{
return 2*(m_l*m_w+m_l*m_h+m_w*m_h);
}
//立方体体积
int cubeV(void)
{
return m_l*m_w*m_h;
}
//类的内部比较
bool myCompareCube2(Cube &ob)
{
if(m_l == ob.getL() && m_w == ob.getW() && m_h == ob.getH())
{
return true;
}
else
{
return false;
}
}
};
//全局函数比较
bool myCompareCube1(Cube &c1,Cube &c2)
{
if(c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
{
return true;
}
else
{
return false;
}
}
int main(int argc, char *argv[])
{
Cube cube1;
cube1.setL(10);
cube1.setW(10);
cube1.setH(10);
cout << "面积:" << cube1.cubeS() << endl;
cout << "体积:" << cube1.cubeV() << endl;
Cube cube2;
cube2.setL(15);
cube2.setW(10);
cube2.setH(10);
if(myCompareCube1(cube1,cube2) == true)
{
cout << "相等" << endl;
}
else
{
cout << "不相等" << endl;
}
Cube cube3;
cube3.setL(10);
cube3.setW(10);
cube3.setH(10);
if(cube3.myCompareCube2(cube1) == true)
{
cout << "相等"<< endl;
}
else
{
cout << "不相等" << endl;
}
return 0;
}
点和圆 类的设计
设计一个圆类和一个点类,计算点和圆的关系
#include <iostream>
using namespace std;
//点类的设计
class Point
{
private:
int m_x;
int m_y;
public:
//坐标的写操作
void setX(int x)
{
m_x = x;
}
void setY(int y)
{
m_y = y;
}
//坐标的读操作
int getX(void)
{
return m_x;
}
int getY(void)
{
return m_y;
}
};
//圆类的设计
class Circle
{
private:
int m_r;
Point m_p;
public:
//圆的半径和圆心的写操作
void setR(int r)
{
m_r = r;
}
void setP(int x,int y)
{
m_p.setX(x);
m_p.setY(y);
}
//圆的半径和圆心的读操作
int getR(void)
{
return m_r;
}
Point getP(void)
{
return m_p;
}
//判断点与圆的位置关系
void isPointOnCircle(Point &ob)
{
int mydistance = (m_p.getX()-ob.getX())*(m_p.getX()-ob.getX())+\
(m_p.getY()-ob.getY())*(m_p.getY()-ob.getY());
if(mydistance == m_r*m_r)
{
cout<<"点在圆上"<< endl;
}
else if(mydistance > m_r*m_r)
{
cout<<"点在圆外"<< endl;
}
else {
cout<< "点在圆内"<< endl;
}
}
};
int main(int argc, char *argv[])
{
Circle c1;//实例化一个圆
c1.setR(5);//设置圆的半径
c1.setP(0,0);//设置圆心
Point p1;//实例化一个点
p1.setX(4);
p1.setY(0);
c1.isPointOnCircle(p1);
return 0;
}