C++类和对象--封装

news2024/12/28 20:45:43

目录

 1.封装

1.1封装的意义一--将属性和行为作为一个整体

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

 1.2封装的意义二--将属性和行为加以控制,公共权限,保护权限,私有权限

1.3struct和class区别

1.4成员属性设置为私有的优点

 1.4.1可以自己控制读写权限

1.4.2对于写可以检测数据的有效性

1.5案例练习

1.5.1练习1--设计立方体

1.5.2练习二--点和圆的关系

1.5.2.1在类中可以让另一个类作为本类的成员

1.5.2.2如何把一个类拆到不同的文件中.h,.cpp


 1.封装

1.1封装的意义一--将属性和行为作为一个整体

#include<iostream>
using namespace std;

const double PI = 3.14;

//设计圆类,求圆的周长
//圆求周长的公式:2*PI*半径

//class达标设计一个类,类后面紧跟着的就是类名
class Circle
{
	//访问权限
	//公共权限,不管是在类内还是类外都可以访问
public:

	//属性,通常是一些变量
	int m_r;//半径

	//行为,在代码中通常用函数去代表它
	//获取圆的周长
	double calculateZC()
	{
		return 2 * PI * m_r;
	}

};
int main()
{
	//通过圆类 创建具体的圆,具体的圆我们称为对象
	//实例化(通过一个类 创建一个对象的过程称为实例化)
	Circle c1;
	//给圆对象的属性进行赋值
	c1.m_r = 10;
	cout << "圆的周长为:" << c1.calculateZC() << endl;

	//将半径和求周长封装在一起
	system("pause");//按任意键继续
	return 0;
}

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

#include<iostream>
using namespace std;

const double PI = 3.14;

//设计学生类
class Student
{
	//类中的属性和行为 我们统一称为 成员
	//属性也称为成员属性,成员变量
	//行为也称为成员函数 成员方法
	

	//公共权限
public:

	//属性,通常是一些变量
	string name;
	int number;

	//行为,在代码中通常用函数去代表它
	//显示姓名和学号
	void showStudent()
	{
		cout <<"姓名:"<< name << " "
			<<"学号:"<< number << endl;
	}

	//可以通过行为给属性赋值
	//给姓名赋值
	void setName(string m_name)
	{
		name = m_name;
	}
	//给学号赋值
	void setNumber(int m_number)
	{
		number = m_number;
	}
};
int main()
{
	//创建一个具体学生 实例化(通过一个类 创建对象的过程)对象
	Student s;
	//给s对象 进行属性赋值操作
	s.name = "张三";
	s.number = 201640;
	s.showStudent();

	Student s1;
	s1.setName("李四");
	s1.setNumber(2017022);
	s1.showStudent();


	system("pause");//按任意键继续
	return 0;
}

 1.2封装的意义二--将属性和行为加以控制,公共权限,保护权限,私有权限

#include<iostream>
using namespace std;

//访问权限
//公共权限 public 成员类内可以访问,类外也可以访问
//保护权限 protected 成员类内可以访问,类外不可以访问 儿子可以访问父亲中的保护内容
//私有权限 private 成员类内可以访问,类外不可以访问 儿子不可以访问父亲中的私有内容

class person
{
	//公共权限
public:
	string m_Name;//姓名

	//保护权限
protected:
	string m_Car;//汽车

	//私有权限
private:
	int m_Password;//银行卡密码

private:
	void func()
	{
		m_Name = "张三";
		m_Car = "拖拉机";
		m_Password = 123456;
	}
};

int main()
{
	//实例化具体对象
	person p1;
	p1.m_Name = "李四";
	//p1.m_car = "奔驰";//保护权限的内容,在类外访问不到
	//p1.m_Password = 123;//私有权限的内容,在类外访问不到
	//p1.func();私有权限的内容,在类外访问不到
    


	system("pause");//按任意键继续
	return 0;
}

1.3struct和class区别

#include<iostream>
using namespace std;

class C1
{
	//默认权限就是public啥的都没写
	int m_A;//默认权限是私有
};

struct C2
{
	int m_A;//默认权限 是公告
};
int main()
{
	//struct和class的区别
	//struct 默认权限是 公共 public
	//class 默认权限是 私有 private

	C1 c1;
	//c1.m_A = 100;//报错

	C2 c2;
	c2.m_A = 100;//在struct中默认权限为公共,可以访问


	system("pause");//按任意键继续
	return 0;
}

1.4成员属性设置为私有的优点

 1.4.1可以自己控制读写权限

#include<iostream>
using namespace std;

//成员属性设置为私有
//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;

	//p.m_Age = 18;//只读
	//p.setAge(18);//只读
	cout << "年龄为:" << p.getAge() << endl;

	//设置情人为苍井女士
	p.setLover("苍井");
	//cout << "情人为:" << p.m_Lover << endl;
	//cout << "情人为:" << p.getLover() << endl;
	system("pause");//按任意键继续
	return 0;
}

1.4.2对于写可以检测数据的有效性

#include<iostream>
using namespace std;

//成员属性设置为私有
//1、可以控制读写权限
//2、对于写可以检测数据的有效性

class Person
{
public:
	//设置姓名
	void setName(string name)
	{
		m_Name = name;//对外提供一个公共的成员函数,来侧面给它的成员属性进行赋值操作
	}
	//获取姓名
	string getName()
	{
		return m_Name;
	}
	//获取年龄,可读可写,如果想修改(年龄的范围必须是0-150之间)
	int getAge()
	{
		return m_Age;
	}
	//设置年龄
	void setAge(int age)
	{
		if (age < 0 || age>150)
		{
			cout << "年龄有误" << endl;
			m_Age = 0;
		}
		else
		{
			m_Age = age;
		}
		/*还可以这样写
		if (age < 0 || age>150)
		{
			cout << "年龄有误" << endl;
			m_Age = 0;
			return;
		}
		m_Age = 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;

	p.setAge(18);
	cout << "年龄为:" << p.getAge() << endl;

	//设置情人为苍井女士
	p.setLover("苍井");
	//cout << "情人为:" << p.m_Lover << endl;
	//cout << "情人为:" << p.getLover() << endl;
	system("pause");//按任意键继续
	return 0;
}

1.5案例练习

1.5.1练习1--设计立方体

#include<iostream>
using namespace std;

//立方体类
class Cube
{
public:
	void setL(double l)//设置长
	{
		m_L = l;
	}
	double getL()//获取长
	{
		return m_L ;
	}
	void setW(double w)
	{
		m_W = w;
	}
	double getW()
	{
		return m_W;
	}
	void setH(double h)
	{
		m_H = h;
	}
	double getH()
	{
		return m_H;
	}
	double getS()//返回面积
	{
		return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_H * m_W;
	}
	double getV()//返回面积
	{
		return m_L * m_W * m_H;
	}
	//利用成员函数判断是否相等
	/*void judge(double l, double w, double h)
	{
		if (m_L == l && m_W == w && m_H == h)
		{
			cout << "相等" << endl;
		}
		else
		{
			cout << "不相等" << endl;
		}
	}*/
	bool isSamebyClass(Cube &c)//成员函数传一个就好,会用已知到去调用这个函数,传入一个未知的
	{
		if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH())
		{
			return true;
		}
		return false;
	}
private:
	double m_L, m_W, m_H;
};

//利用全局函数判断是否相等
/*void Qjudge(double a1, double a2, double a3, double b1, double b2, double b3)
{
	if (a1 == b1 && a2 == b2 && a3 == b3)
	{
		cout << "相等" << endl;
	}
	else
	{
		cout << "不相等" << endl;
	}
}*/
bool isSame(Cube &c1, Cube &c2)//值传递会拷贝出来一份数据,引用传递不拷贝,会用原始的
{
	if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
	{
		return true;
	}
	return false;
}

int main()
{
	//创建立方体对象
	Cube c1, c2;
	c1.setL(10);
	c1.setW(10);
	c1.setH(10);
	c2.setL(20);
	c2.setW(20);
	c2.setH(20);
	cout << "c1面积" << c1.getS() << endl;
	cout << "c1体积:" << c1.getV() << endl;
	//利用成员函数判断
	//c1.judge(c2.getL(), c2.getW(), c2.getH());
	//利用全局函数判断
	//Qjudge(c1.getL(), c1.getW(), c1.getH(), c2.getL(), c2.getW(), c2.getH());
	

	//利用全局函数判断
	bool ret = isSame(c1, c2);
	if (ret)
	{
		cout << "c1、c2相等" << endl;
	}
	else
	{
		cout << "c1、c2不相等" << endl;

	}
	//利用成员函数判断
	bool ret1 = c1.isSamebyClass(c2);
	if (ret1)
	{
		cout << "c1、c2相等" << endl;
	}
	else
	{
		cout << "c1、c2不相等" << endl;

	}
	system("pause");//按任意键继续
	return 0;
}

1.5.2练习二--点和圆的关系

1.5.2.1在类中可以让另一个类作为本类的成员

#include<iostream>
using namespace std;

//点类
class Point
{
public:
	//设置x
	void setX(double x)
	{
		m_X = x;
	}
	//获取x
	double getX()
	{
		return m_X;
	}
	//设置y
	void setY(double y)
	{
		m_Y = y;
	}
	//获取y
	double getY()
	{
		return m_Y;
	}
private:
	double m_X;
	double m_Y;
};
//圆类
class Circle
{
public:
	//设置半径
	void setR(double r)
	{
		m_R = r;
	}
	//获取半径
	double getR()
	{
		return m_R;
	}
	//设置圆心
	void setC(Point center)
	{
		m_Center = center;
	}
	//获取圆心
	Point getC()
	{
		return m_Center;
	}
private:
	double m_R;

	//在类中可以让另一个类 作为本类中的成员
	Point m_Center;
};

//判断点和圆之间的位置关系
void isInCircle(Circle &c, Point &p)
{
	//计算两点之间距离的平方
	double distance= (p.getX() - c.getC().getX())* (p.getX() - c.getC().getX())
		+ (p.getY() - c.getC().getY()) * (p.getY() - c.getC().getY());
	//计算半径的平方
	double rDistance= c.getR() * c.getR();
	if (distance == rDistance)
	{
		cout << "点在圆上" << endl;
	}
	else if (distance > rDistance)
	{
		cout << "点在圆外" << endl;
	}
	else
	{
		cout << "点在圆内" << endl;
	}
}
int main()
{
	//创建圆
	Circle c;
	c.setR(10);
	Point cp;
	cp.setX(10);
	cp.setY(0);
	c.setC(cp);
	//创建点
	Point p1,p2,p3;
	p1.setX(10);
	p1.setY(9);
	p2.setX(10);
	p2.setY(10);
	p3.setX(10);
	p3.setY(11);
	isInCircle(c, p1);
	isInCircle(c, p2);
	isInCircle(c, p3);
	system("pause");//按任意键继续
	return 0;
}

1.5.2.2如何把一个类拆到不同的文件中.h,.cpp

 

 

/*point.h代码
#pragma once//防止头文件重复包含
//在头文件中声明
#include<iostream>
using namespace std;
//把成员函数和属性声明
class Point
{
public:
	void setX(double x);

		//获取x
	double getX();

		//设置y
	void setY(double y);

		//获取y
	double getY();

private:
	double m_X;
	double m_Y;
};

*/
/*c.h代码
#pragma once//防止头文件重复包含
#include<iostream>
using namespace std;
#include"point.h"
class Circle
{
public:
	//设置半径
	void setR(double r);
	//获取半径
	double getR();
	//设置圆心
	void setC(Point center);
	//获取圆心
	Point getC();//将point头文件加进来,让它知道有这么一个类
private:
	double m_R;

	//在类中可以让另一个类 作为本类中的成员
	Point m_Center;
};

*/
/*circle.cpp代码
#include"c.h"
//在头文件中写声明,在cpp中写实现
//设置半径
void Circle::setR(double r)
{
	m_R = r;
}
//获取半径
double Circle::getR()
{
	return m_R;
}
//设置圆心
void Circle::setC(Point center)
{
	m_Center = center;
}
//获取圆心
Point Circle::getC()
{
	return m_Center;
}


*/
/*P.cpp代码
#include"point.h"
//只需要留函数的所有实现

//如果只写setX他是全局函数,
// 但我们知道它是一个成员函数
// 需要告诉他是哪个作用域下的
	//设置x
void Point::setX(double x)//Point作用域下的成员函数
{
	m_X = x;
}
//获取x
double Point::getX()
{
	return m_X;
}
//设置y
void Point::setY(double y)
{
	m_Y = y;
}
//获取y
double Point::getY()
{
	return m_Y;
}

*/
#include<iostream>
using namespace std;
#include"point.h"
#include"c.h"
//判断点和圆之间的位置关系
void isInCircle(Circle &c, Point &p)
{
	//计算两点之间距离的平方
	double distance= (p.getX() - c.getC().getX())* (p.getX() - c.getC().getX())
		+ (p.getY() - c.getC().getY()) * (p.getY() - c.getC().getY());
	//计算半径的平方
	double rDistance= c.getR() * c.getR();
	if (distance == rDistance)
	{
		cout << "点在圆上" << endl;
	}
	else if (distance > rDistance)
	{
		cout << "点在圆外" << endl;
	}
	else
	{
		cout << "点在圆内" << endl;
	}
}
int main()
{
	//创建圆
	Circle c;
	c.setR(10);
	Point cp;
	cp.setX(10);
	cp.setY(0);
	c.setC(cp);
	//创建点
	Point p1,p2,p3;
	p1.setX(10);
	p1.setY(9);
	p2.setX(10);
	p2.setY(10);
	p3.setX(10);
	p3.setY(11);
	isInCircle(c, p1);
	isInCircle(c, p2);
	isInCircle(c, p3);
	system("pause");//按任意键继续
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物联网-异步控制多个设备

物联网-异步控制设备 背景 在这个万物互联的时代&#xff0c;物联网设备起到了关键性的作用&#xff0c;那我们怎么去联动一个个物联网设备。比如一个家庭&#xff0c;里面有很多的设备&#xff0c;比如洗衣机&#xff0c;加湿器、空调、除湿机、灯光等等这些智能设备。假如在…

攻击类型分布

执行摘要 从 1987 年 9 月 14 日&#xff0c;中国向世界发出第一封电子邮件到如今&#xff0c;中国的互联网 发展已过去整整 31 个年头。从消费互联、产业互联到万物互联&#xff0c;互联网正在加速改变我们的交流方式和交易方式&#xff0c;一次次 004.重塑了国家的经济形态和…

【Flutter 组件】001-关于 Widget 的一切

【Flutter 组件】001-关于 Widget 的一切 文章目录【Flutter 组件】001-关于 Widget 的一切一、概述1、Widget 基本概述2、Flutter Framework 里的 Widget架构图说明3、根 Widget二、Widget 类1、Widget 的功能2、Widget 类源码说明Widget 的标识符&#xff1a;KeyFlutter 中如…

【云原生 | Kubernetes 实战】10、K8s 控制器 Deployment 入门到企业实战应用(上)

目录 一、Deployment 控制器&#xff1a;概念、原理解读 1.1 Deployment 概述 1.2 Deployment 工作原理&#xff1a;如何管理 rs 和 Pod&#xff1f; 补充&#xff1a;什么叫做更新节奏和更新逻辑呢&#xff1f; 二、Deployment 资源清单文件编写技巧 三、Deployment 使…

Java线程 (使用Callable实现多线程),看完你发现多线程多么简单!

1.Thread 与 Runnable 的关系 2.Callable实现多线程 3.线程运行状态 1.Thread 与 Runnable 的关系 经过一系列的分析之后可以发现&#xff0c;在多线程的实现过程之中已经有了两种做法&#xff1a;Thread类、Runnable接口&#xff0c;如果从代码结构本身来讲&#xff0c;使…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(一级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;一级A卷&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 下面哪个积木能够调节左右声道的音…

疯狂加持,腾讯大佬的“百万级”JVM学习笔记,从思维图+核心+架构让你一步到位

前言 毫不夸张地说&#xff0c;JVM是现代软件工程最成功的案例之一。因为它自带GC&#xff0c;又有无数可以微调的参数&#xff0c;且运行极其稳定可靠&#xff0c;所以&#xff0c;许多厂商的核心业务系统&#xff0c;才敢放心地用Java编写&#xff0c;运行在JVM之上。 近几…

中英翻译《Thailand泰国》

Thailand 泰国 一、Pre-reading activity 阅前思考 1.Find Thailand in an atlas. 在地图册上找到泰国。 2.What are the names of the countries next to it? 与它相邻的国家都叫什么名字&#xff1f; 3.Is your country near Thailand? 你的国家靠近泰国吗&#xff1f; …

Java基于JSP的小区物业管理系统

经济的飞速发展,促使着城市化进程的加快,随之而来的则是人们生活水平日益提高,并促进住宅小区建设的飞速发展。大量住宅小区投入使用后,加大了管理者的工作难度,小区物业除了要对房屋本身进行修缮外,还需对场地、住户信息、附属设备、环卫绿化、收费情况、治安等方面进行专业化…

全国高校计算机能力挑战赛初赛试题全记录

今天搞了mini版蓝桥杯比赛&#xff0c;有时间的话&#xff0c;我们每天都会补充15道主观题。废话不多说&#xff0c;开整&#xff01;&#xff01;&#xff01; 2022.10.11 抽象&#xff1a;在C中&#xff0c;如果一个类并没有什么实际信息&#xff0c;那么就是一个抽象类 多态…

基于java+springboot+mybatis+vue+mysql的招生管理系统

项目介绍 招生管理系统采用java技术&#xff0c;基于springboot框架&#xff0c;vue技术&#xff0c;mysql数据库进行开发。本系统主要包括管理员和学生两个角色组成&#xff0c;主要包括以下功能&#xff1a; &#xff08;1&#xff09;前台&#xff1a;首页、专业信息、招生…

Online DDL和Cardinality

Online DDL和Cardinality前言Fast Index CreationOnline Schema ChangeOnline DDLCardinality什么是CardinalityCardinality是如何进行统计的前言 本文来聊聊关于Mysql索引管理方面的一些内容&#xff0c;首先我们先准备一张表: CREATE DATABASE IF NOT EXISTS test;USE test…

JVM,你是不是过分了?

以我的经验加上和同行们的交流&#xff0c;我认为学 JVM 最好的方法是&#xff1a; 在程序员不同的水平段&#xff0c;做精准的学习。 所谓的精准学习&#xff0c;就是学习对自己工作有巨大帮助的知识点。以工作内容带动学习&#xff0c;等到积累多了&#xff0c;再一举攻克所…

D-027 SerDes详解

SerDes详解1 SerDes简介1.1 并行总线接口1.2 SerDes接口1.3 SerDes的特点2 发送均衡技术1 SerDes简介 1.1 并行总线接口 在SerDes流行之前&#xff0c;芯片之间的互联时通过系统同步或者源同步的并行接口进行接口传输数据。 并行接口定义图片系统同步发送端和接收端都是由系…

影驰H610MK主板在MBR硬盘上安装系统(可用于安装WIN7)

记录一次MBR格式的机械硬盘安装WIN10系统。 一、进入BIOS界面 二、设置BIOS界面 1、设置系统模式&#xff1a;高级->系统模式选择&#xff0c;选择Legacy and UEFI &#xff08;默认模式为UEFI&#xff09; 2、设置CSM配置 1&#xff09;、进入CMS配置界面&#xff1a;高级…

Js实现简单的文件类型、文件大小、图片像素校验

文章目录1、简单的小Demo2、更多说明2.1 利用循环判断DOM是否渲染完成2.2 利用MutationObserver监听DOM树变化2.3 关于节点的宽高属性2.4 关于页面的宽高属性2.5 关于FileReader提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 1、简单的小Demo <!DO…

“互联网+”时代保险公司经营管理模式研究

目 录 摘 要 3 引言 4 一、公司经营管理模式的理论概述 5 &#xff08;一&#xff09;“互联网”的概念 5 &#xff08;二&#xff09;企业经营管理的主要模式 5 二、众安保险公司的基本情况 6 三、众安公司经营管理模式面临的困难 8 &#xff08;一&#xff09;经营管理方式滞…

关于SpringBoot集成ES Scroll API(滚动查询)的实践

待到秋来九月八&#xff0c;我花开后百花杀背景&#xff1a;大胆尝试实践&#xff1a;学习踩坑最终解决背景&#xff1a; 那是年初在某个交付项目&#xff0c;从用户侧获知了一个elastic search作为分布式数据库的一个瓶颈&#xff0c;那就是单次查询量超过了ES的默认单次查询…

DirectX12 - Pipeline(管线)之IA

这里是SunshineBooming&#xff0c;GPU公司一枚小小的Driver工程师&#xff0c;主要工作是写DirectX12 Driver&#xff0c;我会持续更新这个DX12 Spec系列&#xff0c;可能比较冷门&#xff0c;但是都是干货和工作中的心得体会&#xff0c;有任何GPU相关的问题都可以在评论区互…

原来服务端的退出姿势也可以这么优雅

最简单的 http 服务端 咱们来写一个简单的 http 服务器 func main() { srvMux : http.NewServeMux() srvMux.HandleFunc("/getinfo", getinfo) http.ListenAndServe(":9090", srvMux)}func getinfo(w http.ResponseWriter, r *http.Request) { fmt.Printl…