c++面对对象的三大特性:封装,继承,多态
c++认为万事万物皆为对象,对象上有其属性和行为
1、封装
意义:
- 将属性和行为作为一个整体,表现生活中的事物
- 将属性和行为加以权限控制
语法:class 类名{访问权限:属性/行为};
//设计一个圆类,计算其周长
class Circle
{
//访问权限
public:
int m_r;
double calculate()
{
return 2 * 3.14 * m_r;
}
};
int main()
{
Circle c1;
c1.m_r = 10;
cout << "圆的周长 = " << c1.calculate() << endl;
return 0;
}
案例1
class student
{
//访问权限
public:
string s_name;
int num;
void setname(string name)
{
s_name = name;
}
void setid(int id)
{
num = id;
}
void print1()
{
cout << "名字叫:" << s_name << ",学号是:" << num << endl;
}
};
int main()
{
student stu1;
stu1.setname("lisi");
stu1.setid(2020520180);
stu1.print1();
return 0;
}
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
- public:公共权限
- private:私有权限
- protected:保护权限
class student
{
//访问权限
//public:公共权限,成员类内可以访问,类外可以访问
public:
string s_name;
int num;
//private:私有权限,类内可以访问,类外不可以访问,子类不可以访问父类
private:
int m_password;
//protected:保护权限,类内可以访问,类外不可访问,子类可以访问父类
protected:
string m_car;
public:
void setname(string name)
{
s_name = name;
}
void setid(int id)
{
num = id;
}
void print1()
{
cout << "名字叫:" << s_name << ",学号是:" << num << endl;
}
};
int main()
{
student stu1;
stu1.s_name = "liuzhi";
//stu1.m_car = "" 报错不可访问
//stu1.m_password 报错不可访问
return 0;
}
2、struct和class的区别
在c++中,struct和class唯一区别就是:默认的访问权限不同
区别:
- struct默认访问权限是公共
- class默认访问权限是私有
//struct和class的区别
struct teacher
{
string name;
};
class student
{
string s_name;
int num;
private:
int m_password;
protected:
string m_car;
};
int main()
{
teacher tea1;
tea1.name = "wanglaoshi";//可以访问
student stu1;
stu1.s_name = "liuzhi";//报错,不可以访问
return 0;
}
3、将成员属性设置为私有
优点:
- 将所有成员属性设置为私有,可以自己控制读写权限
- 对于写权限,我们可以检测数据的有效性
//成员属性设计为私有
class person
{
public:
void setname(string name)
{
s_name = name;
}
string getname()
{
return s_name;
}
//获取年龄,可读可写,但是年龄范围在0~150
int getage()
{
//age = 0;
return age;
}
void setage(int age1)
{
if (age1 < 0 || age1 > 150)
{
age = 0;
cout << "错误" << endl;
}
else {
age = age1;
}
}
void setlover(string name)
{
m_lover = name;
}
private:
string s_name;//可读可写权限
int age;//只读权限
string m_lover;//只写权限
};
int main()
{
person p1;
p1.setname("liuzhi");
p1.setlover("苍井空");
cout << "名字叫" << p1.getname() << endl;
p1.setage(200);
cout << "年龄=" << p1.getage() << endl;
return 0;
}
案例1 设置一个立方体类
class Cube
{
int m_l;
int m_h;
int m_w;
public:
void setlong(int l)
{
m_l = l;
}
int getlong()
{
return m_l;
}
void sethight(int h)
{
m_h = h;
}
int gethight()
{
return m_h;
}
void setwight(int w)
{
m_w = w;
}
int getwight()
{
return m_w;
}
int getares()
{
return 2 * m_l * m_h + 2 * m_l * m_w + 2 * m_h * m_w;
}
int getV()
{
return m_l * m_w * m_h;
}
//利用成员函数判断是否相等
bool isSame(Cube &c)
{
if (2 * m_l * m_h + 2 * m_l * m_w + 2 * m_h * m_w == c.getares() && m_l * m_w * m_h == c.getV())
{
return true;
}
else {
return false;
}
}
};
//利用全局函数判断两个立方体面积体积是否相等
bool isSame(Cube &c1, Cube &c2)
{
if (c1.getares() == c2.getares() && c1.getV() == c2.getV())
{
return true;
}
else {
return false;
}
}
int main()
{
Cube c1;
c1.sethight(10);
c1.setlong(20);
c1.setwight(30);
cout << "c1面积 = " << c1.getares() << endl;
cout << "c1体积 = " << c1.getV() << endl;
Cube c2;
c2.sethight(20);
c2.setlong(30);
c2.setwight(10);
bool a = isSame(c1, c2);
cout << a << endl;
bool b = c1.isSame(c2);
cout << b << endl;
return 0;
}
c1面积 = 2200
c1体积 = 6000
1
1
D:\Microsoft Visual Studio\project\01c++书写helloworld\Debug\01c++书写helloworld.exe (进程 2428)已退出,返回代码为: 0。
按任意键关闭此窗口...
案例2、设计一个圆和点,判断圆和点的关系
//判断点和圆的关系
class Circle
{
private:
int c_R;
int c_x;
int c_y;
public:
void setx(int x)
{
c_x = x;
}
int getx()
{
return c_x;
}
void sety(int y)
{
c_y = y;
}
int gety()
{
return c_y;
}
void setR(int R)
{
c_R = R;
}
int getR()
{
return c_R;
}
};
class Point
{
int p_x;
int p_y;
public:
void setx(int x)
{
p_x = x;
}
int getx()
{
return p_x;
}
void sety(int y)
{
p_y = y;
}
int gety()
{
return p_y;
}
};
void isInCircle(Circle &c, Point &p)
{
int dis = (c.getx() - p.getx()) * (c.getx() - p.getx()) + (c.gety() - p.gety()) * (c.gety() - p.gety());
if (dis == c.getR() * c.getR()) {
cout << "点在圆上" << endl;
}
else if (dis > c.getR() * c.getR()) {
cout << "点在圆外" << endl;
}
else {
cout << "点在圆内" << endl;
}
}
int main()
{
Circle c1;
c1.setx(10);
c1.sety(5);
c1.setR(10);
Point p1;
p1.setx(10);
p1.sety(10);
isInCircle(c1, p1);
return 0;
}