4类和对象
c++面向对象的三大特性为:封装、继承、多态
万物都有对象,对象上有其属性和行为
4.1封装
4.1.1封装的意义
封装是c++面向对象三大特性之一
封装的意义:
1)将属性和行为作为一个整体,表现生活中的事物
2)将属性和行为加以权限控制
封装的意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法: class 类名{ 访问权限: 属性 / 行为 };
实例1:设计一个圆类,求圆的周长
(半径作为圆的一个属性)
const double pi = 3.14;
class circle//clas代表设计一个类,类后面紧跟着的就是类的名称
{
//访问权限
public://公共权限
//属性
int r;//半径
//行为,通常用一个函数表示
double calculateZC()
{
return 2 * pi * r;
}
};
int main()
{
//通过圆类,创建具体的圆(即对象)
circle c1;//实例化:通过一个类,来创建一个对象的过程
c1.r = 10;//给圆对象的属性赋值
cout << "圆的周长为:" << c1.calculateZC() << endl;
实例化:通过一个类,来创建一个对象的过程
案例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,也可以显示学生的姓名和学号
class student
{
//访问权限
public://公共权限
//属性
string name;
int number;
//行为,通常用一个函数表示
void showstu()
{
cout << "姓名:" << name << " 学号:" << number << endl;
}
};
int main()
{
student s1;
s1.name = "ccc";
s1.number = 54263;
s1.showstu();
student s2;
s2.name = "zzz";
s2.number = 54363;
s2.showstu();
class student
{
public://公共权限
string m_name;
int m_number;
void showstu()
{
cout << "姓名:" << name << " 学号:" << number << endl;
}
//给姓名赋值
void setname(string name)
{
m_name = name;
}
};
int main()
{
student s1;
//s1.m_name = "ccc";
s1.setname("ccc")//效果相同
s1.m_number = 54263;
类中的属性和行为统称为成员
属性 : 成员属性 或 成员变量
行为 :成员函数 或 成员方法
封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
1、public 公共权限 :成员 类内外都可以访问
2、protected 保护权限 : 成员 类内可以访问,类外不可以访问 子类可以访问父类中的保护内容
3、private 私有权限 : 成员 类内可以访问,类外不可以访问 子类不可以访问父类的私有内容
类内指在创建的类函数之内,类外反之!
4.1.2struct和class区别
唯一区别在于默认的访问权限不同
struct默认权限为公共权限
class默认权限为私有权限
4.1.3成员属性设置为私有
优点:1)将所有成员属性设置为私有,可以自己控制读写权限;
2)对于写权限,我们可以检测数据的有效性;
//设计人类
class person
{
public:
//设置姓名
void setname(string name)
{
m_name = name;
}
//获取姓名
string getname()
{
return m_name;
}
//获取年龄 只读
int getage()
{
m_age = 0;//初始化为0岁
return m_age;
}
void setlover(string lover)
{
m_lover = lover;
}
private:
//姓名 可读可写
string m_name;
//年龄 只读
int m_age;
//情人 只写
string m_lover;
};
int main()
{
person p;
p.setname("张三");//写姓名
cout << "姓名为: " << p.getname() << endl;//读姓名
cout << "年龄为: " << p.getage() << endl;
p.setlover("李四");//数据不可以访问
案例一:设计立方体类
设计立方体类(Cube)
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等
class cube
{
public:
void setH(int h)
{
m_H = h;
}
int getH()
{
return m_H;
}
void setL(int l)
{
m_L = l;
}
int getL()
{
return m_L;
}
void setW(int w)
{
m_W = w;
}
int getW()
{
return m_W;
}
int caclulateS()
{
return 2 * m_H * m_L + 2 * m_H * m_W + 2 * m_L * m_W;
}
int caclulateV()
{
return m_H * m_L * m_W;
}
//成员函数比较:类内本有的(c1)与传进来的(c2)进行比较
bool issame(cube& c)
{
if (getH() == c.getH() && getL() == c.getL() && getW() == c.getW())//或m_H() == c.getH() && m_L() == c.getL() && m_W() == c.getW()
{
return true;
}
return false;
}
private:
int m_H;
int m_L;
int m_W;
};
//全局函数比较
bool isSame(cube& c1, cube& c2)
{
if (c1.getH() == c2.getH() && c1.getL() == c2.getL() && c1.getW() == c2.getW())
{
return true;
}
return false;
}
int main()
{
cube c1;
c1.setH(10);
c1.setL(10);
c1.setW(10);
cube c2;
c2.setH(10);
c2.setL(10);
c2.setW(10);
bool ret1 = isSame(c1,c2);
if (ret1)
{
cout << "全局函数两立方体相等" << endl;
}
else
{
cout << "全局函数两立方体不相等" << endl;
}
bool ret2 = c1.issame(c2);
if (ret2)
{
cout << "成员函数两立方体相等" << endl;
}
else
{
cout << "成员函数两立方体不相等" << endl;
}
案例二:点和圆的关系
设计一个圆类(circle)和一个点类(point),计算点和圆的关系
class circle
{
public:
void setX(int x)
{
m_X = x;
}
int getX()
{
return m_X;
}
void setY(int y)
{
m_Y = y;
}
int getY()
{
return m_Y;
}
void setR(int r)
{
m_R = r;
}
int getR()
{
return m_R;
}
private:
int m_X;
int m_Y;
int m_R;
};
class point
{
public:
void psetX(int x)
{
n_X = x;
}
int pgetX()
{
return n_X;
}
void psetY(int y)
{
n_Y = y;
}
int pgetY()
{
return n_Y;
}
private:
int n_X;
int n_Y;
};
void think(circle& r1, point& r2)
{
int c = (r1.getX() - r2.pgetX()) * (r1.getX() - r2.pgetX()) + (r1.getY() - r2.pgetY()) * (r1.getY() - r2.pgetY());
int d = sqrt(c);
if (d > r1.getR())
{
cout << "点在圆外" << endl;
}
else if (d == r1.getR())
{
cout << "点在圆上" << endl;
}
else
{
cout << "点在圆内" << endl;
}
}
int main()
{
circle r1;
r1.setX(10);
r1.setY(10);
r1.setR(5);
point r2;
r2.psetX(10);
r2.psetY(10);
think(r1, r2);