一、类与对象——封装
类与结构体有什么区别和联系呢,感觉很相似。只是结构体里是属性,类里有属性和行为吗???那这和数据结构的数据,数据元素,数据块又有什么联系呢。
1、创建类与实例化对象
1):可以通过.操作访问给对象属性赋值
2):也可以通过行为给属性赋值
注意:类中的属性和行为都叫做成员;属性称为成员属性,成员变量;行为称为成员函数,成员方法
#include<iostream>
using namespace std;
#include<string>
class student
{
public://访问权限
//行为
string m_name;
int m_id;
void stu_set(string name="李华", int id=0)//传参
{
m_name = name;
m_id = id;
}
void show_stu()
{
cout << "姓名:" << m_name << endl;
cout << "学号:" <<m_id;
}
};
int main()
{
student s1;
//s1.m_name = "张三";
//s1.m_id = 1;
s1.stu_set("张三", 1);
s1.show_stu();
}
以上体现了封装的意义。
2、访问权限
公共权限public,成员类内可以访问类外也可以访问
保护权限protected,成员类内可以访问类外不可以访问
私有权限private,成员类内可以访问类外不可以访问
保护和私有虽然看意义一样,但是在继承的时候就会发现明显的区别
3、struct和class的区别
唯一区别默认的访问权限不同:struct默认共有,class默认私有
4、设置成员属性私有:控制成员的读写行能。如何控制:通过将成员函数设置为公有
对于写权限,保证数据的有效性。
5、案例1:设计立方体类,求出立方体的面积和体积,分别用全局函数和成员函数判断两个立方是否相等。
全局函数判断事传入两个参数,成员函数判断时传入一个未知参数即可,因为另一个在对象调用时就会得到。
类对象也可以作为函数形参
#include<iostream>
using namespace std;
#include<string>
//1、定义立方体类
//2、将成员属性设置为私有:长宽高
//3、将成员函数设置为共有:赋值,求体积,面积
//4、成员函数判断两个立方体是否相等,全局函数判断两个立方体是否相等
class cube//立方体类
{
private:
int m_l;//立方体长
int m_w;//立方体宽
int m_h;//立方体高
public:
//赋值
void set_cube(int L,int W,int H)
{
m_l = L;
m_w = W;
m_h = H;
}
//得到值
int l_cube()
{
return m_l;
}
int w_cube()
{
return m_w;
}
int h_cube()
{
return m_h;
}
//面积
int s_cube()
{
return 2 * m_l * m_w + 2 * m_l * m_h + 2 * m_w * m_h;
}
int v_cube()
{
return m_l * m_w * m_h;
}
//成员函数判断两个立方体是否相等
void issame(cube c)
{
if ((c.m_l == m_l) && (c.m_w == m_w) && (c.m_h == m_h))
{
cout << "两个立方体相等" << endl;
}
else
{
cout << "两个立方体不相等" << endl;
}
}
};
//利用全局函数判断两个立方体是否相等
void issame(cube c1,cube c2)
{
if ((c1.l_cube() == c2.l_cube()) && (c1.w_cube() == c2.w_cube()) && (c1.h_cube() == c2.h_cube()))
{
cout<<"两个立方体相等"<<endl;
}
else
{
cout << "两个立方体不相等" << endl;
}
}
int main()
{
cube c1;
c1.set_cube(10, 10, 10);
cout << "立方体1的面积" << c1.s_cube() << endl;
cout << "立方体1的体积" << c1.v_cube() << endl;
cube c2;
c2.set_cube(10, 10, 11);
c2.issame(c1);//这里我编写的时候出了错
issame(c1, c2);
}
案例2:设计一个圆形类和一个点类,判断点和圆的关系
一个类的可以作为另一个类的成员
#include<iostream>
using namespace std;
#include<string>
//判断点和圆的关系
//1、定义圆类:属性(圆心,半径)
//2、定义点类
//3、全局函数判断关系
//定义点类
class point
{
private:
int m_x;
int m_y;
public:
void set_px(int x)//设置点x
{
m_x = x;
}
int get_px()//获取点x
{
return m_x;
}
void set_py(int y)//设置点y
{
m_y = y;
}
int get_py()//获取点y
{
return m_y;
}
};
//定义圆类
class circle
{private:
int m_r;//半径
point m_center;//圆心
public:
void set_r(int r)//设置半径
{
m_r = r;
}
int get_r()//获取半径
{
return m_r;
}
//设置圆心????
void set_center(point &c)
{
m_center = c;
}
//获取圆心
point get_center()
{
return m_center;
}
};
//全局函数判断关系
void isIncircle(circle &c,point &p)
{
//计算两点之间距离的平方
//计算圆半径的平方
//判断关系
int p_distance = ((c.get_center().get_px() - p.get_px()) * (c.get_center().get_px() - p.get_px())) + ((c.get_center().get_py() - p.get_py()) * (c.get_center().get_py() - p.get_py()));
int r_distance = c.get_r() * c.get_r();
if (p_distance == r_distance)
{
cout << "点在圆上" << endl;
}
else if (p_distance < r_distance)
{
cout << "点在圆内" << endl;
}
else
{
cout << "点在圆外" << endl;
}
}
//将函数和类封装完毕后,创建对象
int main()
{
circle c1;
c1.set_r(10);
point p1;
p1.set_px(10);
p1.set_py(0);
c1.set_center(p1);
point p2;
p2.set_px (10);
p2.set_py(11);
isIncircle(c1, p2);
}
要学会分文件编译,增强大型程序的可读性
1)创建头文件,将类的声明放在里面
2)创建源文件,留下类中函数的实现。但是会报错,如下的m_x等,因为将函数的实现留在这里时相当于全局函数,那么m_x不定义就会报错。之前不报错是因为它是成员函数。改正:限制作用域point::
3)圆类类似
4)程序的实现
#include<iostream>
using namespace std;
#include<string>
#include"point.h"
#include"circle.h"
//判断点和圆的关系
//1、定义圆类:属性(圆心,半径)
//2、定义点类
//3、全局函数判断关系
//全局函数判断关系
void isIncircle(circle &c,point &p)
{
//计算两点之间距离的平方
//计算圆半径的平方
//判断关系
int p_distance = ((c.get_center().get_px() - p.get_px()) * (c.get_center().get_px() - p.get_px())) + ((c.get_center().get_py() - p.get_py()) * (c.get_center().get_py() - p.get_py()));
int r_distance = c.get_r() * c.get_r();
if (p_distance == r_distance)
{
cout << "点在圆上" << endl;
}
else if (p_distance < r_distance)
{
cout << "点在圆内" << endl;
}
else
{
cout << "点在圆外" << endl;
}
}
//将函数和类封装完毕后,创建对象
int main()
{
circle c1;
c1.set_r(10);
point p1;
p1.set_px(10);
p1.set_py(0);
c1.set_center(p1);
point p2;
p2.set_px (10);
p2.set_py(11);
isIncircle(c1, p2);
}