0
点赞
收藏
分享

微信扫一扫

c++---类和对象---封装

小典典Rikako 2022-04-14 阅读 64
c++

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;
}
举报

相关推荐

0 条评论