C++类和对象之封装(注意事项,案例分析)

56 篇文章 0 订阅
35 篇文章 0 订阅

类和对象介绍

C++面向对象的三大特性:封装,继承,多态

C++认为万事万物都可以成为对象,对象有着对象的属性和行为

具有相同性质的对象,我们可以将其抽象为类

封装的意义

意义:

  • 将属性和行为作为整体,表现生活中的事物
  • 将属性和行为加以权限控制

语法:class 类名{ 访问权限 : 属性/行为};

案例需求1:设计一个圆类,求圆的周长

#include<iostream>
using namespace std;
//class代表要设计一个类,类后面紧跟着的就是类的名称
class circle
{
 //公共权限
public:
    //类的行为
    //构造函数
	circle(float r1)
	{
		r = r1;
	}
	float C_circle()
	{
		float C;
		C = 2 * 3.14 * r;
		return C;
	}
 //私有权限
private:
    //类的属性
	float r;
};
int main()
{
	cout << "请输入圆的半径" << endl;
	float a;
	cin >> a;
    //创建类的对象,并且通过构造函数进行初始化
	circle c1(a);
    //调用公共权限内的行为(函数)
	float c = c1.C_circle();
	cout << "周长=" << c << endl;
	return 0;
}

案例需求2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示姓名和学号

#include<iostream>
using namespace std;
#include<string>
//学生类
class student
{
public:
    //学号赋值
	void Set_score(int score)
	{
		s_score = score;
	}
    //姓名赋值
	void Set_name(string name)
	{
		s_name = name;
	}
    //学号输出
	void Print_score()
	{
		cout << "学生学号" << s_score << endl;
	}
    //姓名输出
	void Print_name()
	{
		cout << "学生姓名" << s_name << endl;
	}
private:
    //属性设置为私有,通过公共接口调用
	int s_score;
	string s_name;
	
};
int main()
{
	student s1;
	cout << "请输入学生的姓名" << endl;
	string name;
	cin >> name;
	cout << "请输入学生的学号" << endl;
	int score;
	cin >> score;
	s1.Set_name(name);
	s1.Set_score(score);
	cout << "该学生信息为" << endl;
	s1.Print_name();
	s1.Print_score();
	return 0;
}

类中的属性和行为,我们统一称为成员

成员属性,成员变量,成员函数,成员方法

访问权限

类在设计的时候,可以把属性和行为放在不同的权限下,加以控制

访问权限有三种:

  • public 公共权限

    成员类内可以访问,成员类外也可以访问

  • private 私有权限

    成员类内可以访问,成员类外不可以访问

  • protected 保护权限

    成员类内可以访问,成员类外不可以访问

保护权限和私有权限

子类可以继承访问父类的保护权限

子类不可以继承访问父类的私有权限

C++中类和结构体的区别

在C++中结构体和类的唯一的区别就在于默认访问权限的不同

结构体的默认权限是公共

类的默认权限是私有

class c1
{
    int m_A; //默认权限为私有权限
};
struct c2
{
	int m_A; //默认权限为公共权限
};

一般类的创建方法技巧与规范

将成员属性设置为私有

  • 将所有成员属性设置为私有,可以自己控制读写权限
  • 对于写权限,我们可以检测数据的有效性

通过开放公共接口来操作私有属性

方便设置逻辑进行判断输入是否合理

案例1

需求案例:设计立方体类,求出立方体的面积和体积,分别用全局函数和成员函数判断这俩个立方体是否相等

#include<iostream>
using namespace std;
#include<string>
class cube
{
public:
	//构造函数初始化三个棱长
	cube(int x, int y, int z)
	{
		m_x = x;
		m_y = y;
		m_z = z;
	}
	//计算表面积的成员函数
	int count_s()
	{
		int s;
		s = m_x * m_y * 2 + m_x * m_z * 2 + m_z * m_y * 2;
		return s;
	}
	//计算体积的成员函数
	int count_v()
	{
		int v;
		v = m_x * m_y * m_z;
		return v;
	}
private:
	int m_x;
	int m_y;
	int m_z;
};
int main()
{
	cout << "请输入三边长" << endl;
	int a, b, c;
	cin >> a >> b >> c;
	cube c1(a, b, c);
	int s1 = c1.count_s();
	int v1 = c1.count_v();
	cout << s1 << " " << v1 << endl;
	//函数声明
	int count_s(int x, int y, int z);
	int count_v(int x, int y, int z);
	int s2 = count_s(a, b, c);
	int v2 = count_v(a, b, c);
	cout << s2 << " " << v2 << endl;
	if (s1 == s2 && v1 == v2)
	{
		cout << "测试成功" << endl;
	}
	else
	{
		cout << "测试失败" << endl;
	}
	return 0;
}
//计算表面积的全局函数
int count_s(int x,int y,int z)
{
	int s;
	s = x * y * 2 + x * z * 2 + z * y * 2;
	return s;
}
//计算体积的全局函数
int count_v(int x, int y, int z)
{
	int v;
	v = x * y * z;
	return v;
}

案例2

设计一个圆类和一个点类,计算点和圆的关系

#include<iostream>
using namespace std;
#include<string>
#include<math.h>
class circle
{
public:
	//构造函数进行初始化
	circle(int x, int y, int r)
	{
		c_x = x;
		c_y = y;
		c_r = r;
	}
	//判断与圆的关系
	void judge(int p_x,int p_y)
	{
		int d = sqrt((p_x-c_x)* (p_x - c_x)+ (p_y - c_y)* (p_y - c_y));
		if (d > c_r)
		{
			cout << "在圆外" << endl;
		}
		else if (d < c_r)
		{
			cout << "在圆内" << endl;
		}
		else
		{
			cout << "在圆上" << endl;
		}
	}
private:
	//将圆心的坐标和半径放入私有成员属性中
	int c_x;
	int c_y;
	int c_r;
};
class point
{
public:
	//构造函数进行初始化
	point(int x, int y)
	{
		p_x = x;
		p_y = y;
	}
	//获取坐标
	int get_x()
	{
		return p_x;
	}
	int get_y()
	{
		return p_y;
	}
private:
	int p_x;
	int p_y;
};
int main()
{
	cout << "请输入圆心的坐标和圆的半径" << endl;
	int x, y, r;
	cin >> x >> y >> r;
	circle c1(x, y, r);
	cout << "请输入点的坐标" << endl;
	int x1, y1;
	cin >> x1 >> y1;
	point p1(x1, y1);
	c1.judge(p1.get_x(), p1.get_y());
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宴师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值