第九十二天学习记录:C++核心:类和对象Ⅰ(五星重要)

news2024/11/18 4:47:37

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

C++认为万事万物都皆为对象,对象上有其属性和行为

封装

封装的意义

封装是C++面向对象三大特性之一
封装的意义:
1、将属性和行为作为一个整体,表现生活中的事物
2、将属性和行为加以权限控制

封装意义一:

在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名{访问权限:属性/行为};

简单的例子1:圆类

#include<iostream>
using namespace std;

//圆周率
const double PI = 3.14159;

//设计一个圆类,求圆的周长
//圆求周长的公式:2*PI*半径
//class 代表设计一个类,类后面紧跟着的就是类名称
class Circle
{
	//访问权限
public:
	//属性
	int m_r;
	//行为
	//获取圆的周长
	double calculateZC()
	{
		return 2 * PI*m_r;
	}
};

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

简单的例子2:人类

#include<iostream>
using namespace std;
#include<string>

//设计一个人类,属性有姓名,性别,年龄,身高,体重
//设计人类
class People
{
public:
	//属性
	string m_Name;//姓名
	string m_sex;//性别
	int m_age;//年龄
	int m_height;//身高
	int m_weight;//体重
	//行为
	//显示个人信息
	void showPeople()
	{
		cout << "姓名:" << m_Name << " 性别:" << m_sex << " 年龄:" << m_age
			<< " 身高:" << m_height << " 体重:" << m_weight << endl;
	}
	//给姓名赋值
	void setName(string name)
	{
		m_Name = name;
	}
};

int main()
{
	//创建一个具体的人类 实例化对象
	People p1;
	//给p1对象 进行属性的赋值操作
	//p1.m_Name = "张三";
	p1.setName("张三");
	p1.m_sex = "男";
	p1.m_age = 33;
	p1.m_height = 170;
	p1.m_weight = 70;
	People p2;
	//给p2对象 进行属性的赋值操作
	//p2.m_Name = "李四";
	p2.setName("李四");
	p2.m_sex = "女";
	p2.m_age = 26;
	p2.m_height = 162;
	p2.m_weight = 50;
	//显示人类信息
	p1.showPeople();
	p2.showPeople();
	return 0;
}

类中的属性和行为 我们统一称为 成员
属性 成员属性 成员变量
行为 成员函数 成员方法

封装意义二:

类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:

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

#include<iostream>
using namespace std;
#include<string>

//访问权限
//1、public 公共权限         成员类内可以访问         类外可以访问
//2、protected 保护权限   成员类内可以访问         类外不可以访问  儿子也可以访问父亲中的保护内容
//3、private 私有权限       成员类内可以访问         类外不可以访问   儿子不可以访问父亲的私有内容
class People
{
public:
	//属性
	string m_Name;//姓名
protected:
	string m_sex;//性别
private:
	int m_age;//年龄
	int m_height;//身高
	int m_weight;//体重

public:
	void func()
	{
		m_Name = "张三";
		m_sex = "男";
		m_age = 33;
		m_height = 170;
		m_weight = 70;
	}

private:
	void func2()
	{
		m_Name = "李四";
		m_sex = "女";
		m_age = 26;
		m_height = 162;
		m_weight = 50;
	}
};

int main()
{
	People p1;
	p1.m_Name = "赵四";
	//p1.m_sex = "女";保护权限的内容在类外访问不到
	//p1.m_age = 26;私有权限内容,类外访问不到
	People p2;
	p2.func();
	//p2.func2();无法访问
	return 0;
}

struct和class区别

在C++中struct和class唯一的区别就在于默认的访问权限不同
区别:
1、struct默认权限为公共
2、class默认权限为私有

#include<iostream>
using namespace std;

class C1
{
	int m_A;//默认权限是私有
};

struct C2
{
	int m_A;//默认权限是公共
};

int main()
{
	C1 c1;
	//c1.m_A;//无法访问
	C2 c2;
	c2.m_A = 10;
	return 0;
}

成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性(比如检测年龄是否正常)

#include<iostream>
using namespace std;
#include<string>

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;
	cout << "年龄为:" << p.getAge() << endl;
	p.setLover("苍井");
	return 0;
}

封装案例

封装案例1

设计立方体
类名:Cube
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等。
在这里插入图片描述

#include<iostream>
using namespace std;

class Cube
{
public:
	//设置长
	void setL(int l)
	{
		m_L = l;
	}
	//获取长
	int getL()
	{
		return m_L;
	}
	//设置宽
	void setW(int w)
	{
		m_W = w;
	}
	//获取宽
	int getW()
	{
		return m_W;
	}
	//设置高
	void setH(int h)
	{
		m_H = h;
	}
	//获取高
	int getH()
	{
		return m_H;
	}
	//获取立方体面积
	int calculateS()
	{
		return 2 * m_L*m_W + 2 * m_W*m_H + 2 * m_L*m_H;
	}
	//获取立方体体积
	int calculateV()
	{
		return m_L*m_W*m_H;
	}

	//利用成员函数判断两个立方体是否相等
	bool isSameByClass(Cube &c)
	{
		if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH())
		{
			return true;
		}
		return false;
	}
private:
	int m_L;//长
	int m_W;//宽
	int m_H;//高
};

//利用全局函数判断两个立方体是否相等
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;
	c1.setL(10);
	c1.setW(10);
	c1.setH(10);
	cout << "c1的面积为:" << c1.calculateS() << endl;
	cout << "c1的体积为:" << c1.calculateV() << endl;


	//创建第二个立方体
	Cube c2;
	c2.setL(10);
	c2.setW(10);
	c2.setH(10);

	//利用全局函数判断
	bool ret = isSame(c1, c2);

	if (ret)
	{
		cout << "c1和c2是相等的" << endl;
	}
	else
	{
		cout << "c1和c2是不相等的" << endl;
	}

	//利用成员函数判断
	ret = c1.isSameByClass(c2);

	if (ret)
	{
		cout << "成员函数判断:c1和c2是相等的" << endl;
	}
	else
	{
		cout << "成员函数判断:c1和c2是不相等的" << endl;
	}
	return 0;
}

在这里插入图片描述

封装案例2

点和圆的关系
设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。

在这里插入图片描述
在这里插入图片描述
注:上图转自黑马程序员免费教学视频

circle.h

#pragma once
#include <iostream>
using namespace std;
#include "point.h"

//圆类
class Circle
{
public:
	//设置半径
	void setR(int r);
	//获取半径
	int getR();
	//设置圆心
	void setCenter(Point &center);
	//获取圆心
	Point getCenter();
private:
	int m_R;
	Point m_Center;//圆心
};

point.h

#pragma once
#include <iostream>
using namespace std;

//点类
class Point
{
public:
	//设置x
	void setX(int x);
	//获取x
	int getX();
	//设置y
	void setY(int y);
	//获取y
	int getY();
private:
	int m_X;
	int m_Y;
};

circle.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include "circle.h"

//设置半径
void Circle::setR(int r)
{
	m_R = r;
}
//获取半径
int Circle::getR()
{
	return m_R;
}
//设置圆心
void Circle::setCenter(Point &center)
{
	m_Center = center;
}
//获取圆心
Point Circle::getCenter()
{
	return m_Center;
}

porint.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include "point.h"


void Point::setX(int x)
{
	m_X = x;
}
	//获取x
int Point::getX()
{
	return m_X;
}
	//设置y
void Point::setY(int y)
{
	m_Y = y;
}
	//获取y
int Point::getY()
{
	return m_Y;
}

test.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;
#include "circle.h"
#include "point.h"

//判断点和圆的关系
void isInCircle(Circle &c,Point &p)
{
	//计算两点之间距离的平方
	int distance =
		(c.getCenter().getX() - p.getX())*(c.getCenter().getX() - p.getX()) +
		(c.getCenter().getY() - p.getY())*(c.getCenter().getY() - p.getY());
	//计算半径的平方
	int 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 center;
	center.setX(10);
	center.setY(0);
	c.setCenter(center);
	//创建点
	Point p;
	p.setX(10);
	p.setY(10);
	//判断关系
	isInCircle(c, p);
	return 0;

}

在这里插入图片描述

自行设计一个案例

一个球类和一个点类,设计2个球,计算这2个球的关系。1、接触;2、碰撞;3、独立

在这里插入图片描述

ball.h

#pragma once
#include <iostream>
using namespace std;
#include "point.h"

class Ball
{
public:
	void setR(int r);
	void setCenter(Point center);
	int getR();
	Point getCenter();
private:
	int m_R;
	Point m_Center;
};

point.h

#pragma once
#include <iostream>
using namespace std;

class Point
{
public:
	void setX(int x);
	void setY(int y);
	void setZ(int z);
	int getX();
	int getY();
	int getZ();
private:
	int m_X;
	int m_Y;
	int m_Z;
};

ball.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include "ball.h"

void Ball::setR(int r)
{
	m_R = r;
}
void Ball::setCenter(Point center)
{
	m_Center = center;
}
int Ball::getR()
{
	return m_R;
}
Point Ball::getCenter()
{
	return m_Center;
}

point.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include "point.h"

void Point::setX(int x)
{
	m_X = x;
}
void Point::setY(int y)
{
	m_Y = y;
}
void Point::setZ(int z)
{
	m_Z = z;
}
int Point::getX()
{
	return m_X;
}
int Point::getY()
{
	return m_Y;
}
int Point::getZ()
{
	return m_Z;
}

main.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include "point.h"
#include "ball.h"

void istouch(Ball &b1, Ball &b2)
{
	int distance =
		(b1.getCenter().getX() - b2.getCenter().getX())*(b1.getCenter().getX() - b2.getCenter().getX()) +
		(b1.getCenter().getY() - b2.getCenter().getY())*(b1.getCenter().getY() - b2.getCenter().getY()) +
		(b1.getCenter().getZ() - b2.getCenter().getZ())*(b1.getCenter().getZ() - b2.getCenter().getZ());
	int rDistance = (b1.getR()+b2.getR())*(b1.getR() + b2.getR());
	if (distance == rDistance)
	{
		cout << "两球接触" << endl;
	}
	else if (distance > rDistance)
	{
		cout << "两球独立" << endl;
	}
	else
	{
		cout << "两球碰撞" << endl;
	}
}

int main()
{
	Point center1;
	center1.setX(0);
	center1.setY(0);
	center1.setZ(0);
	Point center2;
	center2.setX(0);
	center2.setY(0);
	center2.setZ(10);

	Ball ball1;
	ball1.setR(7);
	ball1.setCenter(center1);
	Ball ball2;
	ball2.setR(3);
	ball2.setCenter(center2);

	istouch(ball1, ball2);

	return 0;
}

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

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

相关文章

js判断文件类型详解

js判断文件类型详解 通过file的type属性判断 <input type"file" onchange"onchangecb(this)" /> <script> function onchangecb(e) {const file e.files[0];console.log(file.type); } </script>像html中input标签&#xff0c;就是根…

地下水数值模拟-Visual modflow Flex软件应用

地下水&#xff08;ground water&#xff09;&#xff0c;是指赋存于地面以下岩石空隙中的水&#xff0c;狭义上是指地下水面以下饱和含水层中的水。在国家标准《水文地质术语》&#xff08;GB/T 14157-93&#xff09;中&#xff0c;地下水是指埋藏在地表以下各种形式的重力水。…

基于协议判断目标机器是否出网

内网渗透中时常会碰到一些不出网的主机&#xff0c;不出网的原因有很多&#xff0c;如常见的有&#xff1a;没有设置网关、系统防火墙或者其他设备设置了出入站限制&#xff0c;只允许特定协议或端口出网等&#xff0c;遇到这种情况时可以用以下命令测试目标主机允许哪些协议出…

桥接模式的学习与使用

1、桥接模式的学习 当你需要将抽象部分与实现部分解耦&#xff0c;使它们可以独立地变化&#xff0c;而又能够灵活地组合在一起时&#xff0c;可以使用桥接模式。桥接模式通过将抽象和实现部分分离&#xff0c;使它们可以独立地进行扩展和变化&#xff0c;同时又能够在运行时动…

代码随想录二战day2

977有序数组的平方 力扣 思路&#xff1a; 第一&#xff1a; 和之前一样的&#xff0c;看见数组我们的第一想法就是使用双指针去解。这道题需要额外开辟一个答案数组去储存结果。 第二&#xff1a; 头指针指向第一个元素&#xff0c;尾指针指向最后一个元素。然后对两个元素分…

RocketMQ安装(Docker)

一、RocketMQ安装之docker 1.下载RockerMQ需要的镜像 docker pull rocketmqinc/rocketmq docker pull styletang/rocketmq-console-ng 2.启动NameServer服务 创建NameServer数据存储路径 mkdir -p /home/rocketmq/data/namesrv/logs /home/rocketmq/data/namesrv/store启动…

拾起王慧文的AI梦,美团冲向“光年之外”?

“十年&#xff0c;我需要休息休息&#xff0c;下一个十年&#xff0c;就托付给兄弟们了&#xff0c;感谢你们。” 2020年底&#xff0c;王慧文在朋友圈写下这句话时&#xff0c;外界本以为这位伴随中国互联网发展而持续创业20年的人物即将告别创业舞台。但是&#xff0c;一个…

Kubernetes创建集群—使用 Minikube 创建集群

一、使用 Minikube 创建集群 1、Kubernetes 集群 Kubernetes 协调一个高可用计算机集群&#xff0c;每个计算机作为独立单元互相连接工作。 Kubernetes 中的抽象允许你将容器化的应用部署到集群&#xff0c;而无需将它们绑定到某个特定的独立计算机。为了使用这种新的部署模型…

keepalived安装与使用(Nginx高可用)

一、Keepalived 简介&#x1f349; 1.什么是Keepalived &#xff1f;&#x1f95d; Keepalived一个基于VRRP 协议来实现的 LVS 服务高可用方案&#xff0c;可以利用其来解决单点故障。一个LVS服务会有2台服务器运行Keepalived&#xff0c;一台为主服务器&#xff08;MASTER&a…

Learn Mongodb DB功能命令索引等搜索 ⑤

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; PHP MYSQL &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

layui框架学习(31:下拉菜单模块)

Layui的下拉菜单组件模块dropdown支持动态构建下拉菜单及右键菜单&#xff0c;不同于之前学习的页面元素中的菜单&#xff0c;后者主要是在页面中搭建菜单结构&#xff0c;然后通过设置layui提供的菜单相关的预设类对菜单结构进行样式渲染&#xff0c;而通过dropdown模块则是基…

【单片机】STM32单片机,RTC实时时钟,STM32F103C8T6,程序,万年历,数字时钟

文章目录 基础介绍rtc.hrtc.cmain.c 基础介绍 我以STM32F103C8T6为例&#xff0c;但STM32F103的RTC是通用的&#xff0c;STM32F103C8T6有一个原理图&#xff1a; https://qq742971636.blog.csdn.net/article/details/131288390 用纽扣电池给VBAT供电&#xff08;要共地&…

基于matlab使用多类掩码区域的卷积神经网络对人和汽车的各个实例进行分段(附源码)

一、前言 此示例展示了如何使用基于多类掩码区域的卷积神经网络 &#xff08;R-CNN&#xff09; 对人和汽车的各个实例进行分段。实例分割是一种计算机视觉技术&#xff0c;您可以在其中检测和定位对象&#xff0c;同时为每个检测到的实例生成分割图。 此示例首先演示如何使用…

shardingsphere-proxy 实现postgresql的单库分表

1、docker 安装zookeeper 1、拉取镜像 docker pull zookeeper2、运行容器 docker run -d -e TZ"Asia/Shanghai" -p 2181:2181 -v /home/sunyuhua/docker/zookeeper:/data --name zookeeper --restart always zookeeper3、查看容器是不是运行成功 docker exec -i…

Spring Boot 中的 @SendTo 注解

Spring Boot 中的 SendTo 注解 在 Spring Boot 中&#xff0c;SendTo 注解是一个非常有用的注解&#xff0c;它可以用于实现 WebSocket 的消息转发功能。本文将介绍 SendTo 注解的原理、使用方法和示例代码。 什么是 SendTo 注解 SendTo 注解是 Spring Boot 中用于将消息发送…

个人和企业如何有效保护IP地址?

随着互联网的快速发展&#xff0c;个人和企业对于保护IP地址的重要性越来越清晰。为了帮助读者更好地了解如何有效保护IP地址&#xff0c;以下将介绍几种方法&#xff0c;并提供一些相关的数据和专家意见。 使用防火墙是保护IP地址的一个重要手段。防火墙可以监控和过滤网络流量…

react native 使用Native Module、Intent、广播接收器 实现两个app之间的相互通信

一、react native版本环境: “react”: “18.1.0”, “react-native”: “0.70.6”, “node”: "14.18.2 二、发送端步骤: 在A app中注册一个Native Module模块,使用Intent 连接B app,sendBroadcast 发送广播传递数据。 (1)首先在 /android/app/src/main/java/com/j…

ASP.NET Core MVC从入门到精通[PDF版]

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

three.js点材质(PointsMaterial)常用属性设置

一、前景回顾 上一章节简单介绍了下怎么使用点材质和点对象创建物体点对象和点材质介绍 点材质和点对象基本运用示例代码&#xff1a; import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/Orbit…

A核与M核异构通信过程解析

现在越来越多的产品具有M core和A core的异构架构&#xff0c;既能达到M核的实时要求&#xff0c;又能满足A核的生态和算力。比如NXP的i.MX8系列、瑞萨的RZ/G2L系列以及TI的AM62x系列等等。虽然这些处理器的品牌及性能有所不同&#xff0c;但多核通信原理基本一致&#xff0c;都…