类和对象的概念
- 类是自定义数据类型,是C语言的结构体进化而成的
- 对象是类实例化出的,用数据类型定义一个变量
#include <iostream>
using namespace std;
class Person//这个是类
{
public:
int a;//成员属性(成员变量)
void func()//成员方法(成员函数)
{
cout << "func" << endl;
}
};
int main()
{
Person m;//m就是对象
return 0;
}
类的封装
- 封装是把属性(变量)和方法(函数)封装到类内,然后给这些数据赋予权限
- 为什么要有封装
- 防止乱掉用函数和变量,出现错误
- 维护代码更方便
- 权限
//封装:1,把属性和方法放到类中,2.给这些数据赋予权限
#include <iostream>
using namespace std;
class Person
{
public://公有权限
void set(string Name,int Id)
{
id = Id;
name = Name;
}
void printPerson()
{
cout << "id=" << id << " name=" << name << endl;
}
private://私有
int id;
string name;
protected://保护
int a;
};
//继承
class Student:public Person
{
void func()
{
a = 20;//子类的类内可以方法父类的保护权限的成员
}
};
//类外不能访问私有权限的成员
//类外可以访问公有权限的成员
//类外不能访问保护权限的成员
//子类的类内可以方法父类的保护权限的成员
//类内是没有权限之分
void test()
{
Person m;
m.set("小花",1);
m.printPerson();
}
int main()
{
test();
return 0;
}
- 尽量把属性设置为私有权限
- 可以控制属性的读写权限
- 可以赋予客户端访问数据的一致性
- 可以保护属性的合法性
类和结构体的区别
结构体的默认权限使公有的,类的默认权限使私有的
立方体案例
- 抽象立方体:属性,长宽高,方法:设置和获取属性的方法,判断两个立方体是否相等的方法
- 一个对象必须要初始化成员变量
- 成员函数中隐藏了一个本类的对象
#include <iostream>
using namespace std;
// 立方体类
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(40);
c1.setW(30);
c1.setH(60);
c2.setL(40);
c2.setW(50);
c2.setH(60);
cout << "c1的面积:" << c1.caculateS() << " ,c1的体积:" << c1.caculateV() << endl;
cout << "c2的面积:" << c2.caculateS() << " ,c2的体积:" << c1.caculateV() << endl;
// 比较两个立方体是否相等
if (cubCompare(c1, c2))
{
cout << "c1和c2相等" << endl;
}
else
{
cout << "c1和c2不相等" << endl;
}
// 成员函数比较两个立方体是否相等
if (c1.cubCompare(c2))
{
cout << "c1和c2相等" << endl;
}
else
{
cout << "c1和c2不相等" << endl;
}
}
int main()
{
test();
return 0;
}
点和圆的案例
- 抽象点:属性有点的坐标,方法:设置和获取坐标的方法
- 抽象圆:属性有圆心和半径,方法:设置和获取圆心的方法,设置和获取半径的方法,判断圆和点的关系的方法
- 用圆心和点之间的距离的平方,和半径的平方比较来确定之间的关系,公式为:r²=(x₁-x₂)²+(y₁-y₂)²
- 三角型中,两边的平方和等于斜边的平方
#include <iostream>
using namespace std;
//点类
class Point {
public:
void setX(int x) { mX = x; }
void setY(int y) { mY = y; }
int getX() { return mX; }
int getY() { return mY; }
private:
int mX;
int mY;
};
//圆类
class Circle {
public:
void setP(int x, int y)
{
mP.setX(x);
mP.setY(y);
}
void setR(int r) { mR = r; }
Point& getP() { return mP; }
int getR() { return mR; }
//判断点和圆的关系
void IsPointInCircle(Point& point)
{
int distance = (point.getX() - mP.getX()) * (point.getX() - mP.getX()) + (point.getY() - mP.getY()) * (point.getY() - mP.getY());
int radius = mR * mR;
if (distance < radius)
{
cout << "Point(" << point.getX() << "," << point.getY() << ")在圆内!" << endl;
}
else if (distance > radius)
{
cout << "Point(" << point.getX() << "," << point.getY() << ")在圆外!" << endl;
}
else
{
cout << "Point(" << point.getX() << "," << point.getY() << ")在圆上!" << endl;
}
}
private:
Point mP; //圆心
int mR; //半径
};
void test() {
//实例化圆对象
Circle circle;
circle.setP(20, 20);
circle.setR(5);
//实例化点对象
Point point;
point.setX(25);
point.setY(20);
circle.IsPointInCircle(point);
}
int main()
{
test();
return 0;
}
持续更新中,欢迎大家讨论和参考。