C++基础知识学习第十四天:类与对象

 一、类与对象——封装

类与结构体有什么区别和联系呢,感觉很相似。只是结构体里是属性,类里有属性和行为吗???那这和数据结构的数据,数据元素,数据块又有什么联系呢。

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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值