C++学习笔记(十一)

一、类和对象

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

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

例如:人可以作为对象,属性有姓名、年龄、身高......,行为有走、吃、睡觉

           车也可以作为对象,属性有轮胎、方向盘、车灯......,行为有载人

           具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类

1.1 封装

1.1.1 封装的意义

① 将属性(成员属性、成员变量)和行为(成员函数、成员方法)作为一个整体(成员),表现生活中的事物

② 将属性和行为加以权限控制

封装意义一:

#include <iostream>using namespace std;#define PI 3.14class Circle
{
public:int c_r;double calculate_zc(){return 2 * PI * c_r;}
};int main(int argc, char* argv[])
{Circle circle1;circle1.c_r = 10;cout << "圆的周长为:" << circle1.calculate_zc() << endl;
}

封装意义二:

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

访问权限有三种:

1. public 公共权限:成员 类内可以访问 类外可以访问        

2. protected 保护权限:成员 类内可以访问 类外不可以访问 子类可以访问父类中的保护内容        

 3. private 私有权限:成员 类内可以访问 类外不可以访问 子类不可以访问父类中的私有内容

1.1.2 struct和class的区别

在C++中struct和class唯一的区别就在于默认的访问权限不同

struct默认权限为公共,class默认权限为私有

1.1.3 成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,可以检测数据的有效性

#include <iostream>
#include <string>using namespace std;class Student
{
private:string stu_Name; // 可读可写string stu_Num = "23S101111"; // 只读int stu_Age; // 只写public:void setName(string name) {stu_Name = name; // 可写}string getName(){return stu_Name; // 可读}string getNum(){return stu_Num; // 只读}void setAge(int age){if (age < 0 || age>150) // 检测数据有效性{cout << "年龄输入有误,已重置为0" << endl;stu_Age = 0;return;}stu_Age = age; // 只写}
};int main(int argc, char* argv[])
{Student stu;stu.setName("张三");cout << stu.getName() << endl;// stu.stu_Num = "23S101111"; 报错,不可写cout << stu.getNum() << endl; stu.setAge(150);stu.setAge(151);// cout << stu.stu_Age << endl;  报错,不可读
}
#include <iostream>using namespace std;// 立方体类设计
// 1. 创建立方体类
// 2. 设计立方体属性 获取立方体的长宽高
// 3. 设计立方体行为 获取立方体面积和体积
// 4. 分别利用全局函数和成员函数 判断两个立方体是否相等class Cube
{
private:double cube_L, cube_W, cube_H;public:void setL(double length){cube_L = length;}double getL(){return cube_L;}void setW(double width){cube_W = width;}double getW(){return cube_W;}void setH(double height){cube_H = height;}double getH(){return cube_H;}double calculate_S(){return  2 * (cube_L * cube_W + cube_L * cube_H + cube_W * cube_H);}double calculate_V(){return cube_L * cube_W * cube_H;}bool isSameByClass(Cube &cube){if (cube_L == cube.getL() && cube_W == cube.getW() && cube_H == cube.getH()){return	true;}return false;}
};bool isSame(Cube &cube_one, Cube &cube_two)
{if (cube_one.getL() == cube_two.getL() && cube_one.getW() == cube_two.getW() && cube_one.getH() == cube_two.getH()){return	true;}return false;
}int main(int argc, char* argv[])
{Cube cube_one;cube_one.setL(10);cube_one.setW(10);cube_one.setH(10);cout << "该立方体的表面积为:" << cube_one.calculate_S() << endl;cout << "该立方体的体积为:" << cube_one.calculate_V() << endl;Cube cube_two;cube_two.setL(10);cube_two.setW(10);cube_two.setH(11);cout << "该立方体的表面积为:" << cube_two.calculate_S() << endl;cout << "该立方体的体积为:" << cube_two.calculate_V() << endl;bool issame = isSame(cube_one, cube_two);issame == 1 ? cout << "全局函数判断两个立方体相同" : cout << "全局函数判断两个立方体不相同";cout << endl;bool issameByClass = cube_one.isSameByClass(cube_two);issameByClass == 1 ? cout << "成员函数判断两个立方体相同" : cout << "成员函数判断两个立方体不相同";cout << endl;
}

案例:判断点和圆的关系(在一个类中将另一个类作为成员,将不同的类拆成不同的文件)

#include <iostream>
#include <cmath>using namespace std;class Point
{
private:double point_X;double point_Y;
public:void set_X(double x){point_X = x;}double get_X(){return point_X;}void set_Y(double y){point_Y = y;}double get_Y(){return point_Y;}
};class Circle
{
private:Point circleCenter;double circleR;
public:void setR(double r){circleR = r;}double getR(){return circleR;}void setCircleCentre(Point p){circleCenter = p;}Point getCircleCentre(){return circleCenter;}
};void isInCircle(Circle c, Point p)
{double distance;distance = sqrt(pow(c.getCircleCentre().get_X() - p.get_X(), 2) + pow(c.getCircleCentre().get_Y() - p.get_Y(), 2));if (distance == c.getR()){cout << "点在圆上" << endl;}else if (distance < c.getR()){cout << "点在圆内" << endl;}else{cout << "点在圆外" << endl;}
}int main(int argc, char* argv[])
{Point p;p.set_X(10);p.set_Y(11);Point centre;centre.set_X(10);centre.set_Y(0);Circle circle;circle.setCircleCentre(centre);circle.setR(10);isInCircle(circle, p);return 0;
}

如何把不同的类写入不同的文件

在头文件中创建一个point.h,源文件中创建一个point.cpp

point.h

#pragma once
#include <iostream>using namespace std;class Point
{
private:double point_X;double point_Y;
public:void set_X(double x);double get_X();void set_Y(double y);double get_Y();};

point.cpp

#include "point.h"void Point::set_X(double x)
{point_X = x;
}
double Point::get_X()
{return point_X;
}
void Point::set_Y(double y)
{point_Y = y;
}
double Point::get_Y()
{return point_Y;
}

在头文件中创建一个circle.h,源文件中创建一个circle.cpp

circle.h

#pragma once
#include <iostream>
#include "point.h"using namespace std;class Circle
{
private:Point circleCenter;double circleR;
public:void setR(double r);double getR();void setCircleCentre(Point p);Point getCircleCentre();
};

circle.cpp

#include "circle.h"void Circle::setR(double r)
{circleR = r;
}
double Circle::getR()
{return circleR;
}
void Circle::setCircleCentre(Point p)
{circleCenter = p;
}
Point Circle::getCircleCentre()
{return circleCenter;
}

main.cpp

#include <iostream>
#include <cmath>
#include "circle.h"
#include "point.h"using namespace std;void isInCircle(Circle c, Point p)
{double distance;distance = sqrt(pow(c.getCircleCentre().get_X() - p.get_X(), 2) + pow(c.getCircleCentre().get_Y() - p.get_Y(), 2));if (distance == c.getR()){cout << "点在圆上" << endl;}else if (distance < c.getR()){cout << "点在圆内" << endl;}else{cout << "点在圆外" << endl;}
}int main(int argc, char* argv[])
{Point p;p.set_X(10);p.set_Y(9);Point centre;centre.set_X(10);centre.set_Y(0);Circle circle;circle.setCircleCentre(centre);circle.setR(10);isInCircle(circle, p);return 0;
}

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

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

相关文章

官网IDM下载和安装的详细步骤

目录 一、IDM是什么 二、下载安装 三、解决下载超时的问题 四、谷歌浏览器打开IDM插件 谷歌浏览器下载官网&#x1f447; 五、测试 六、资源包获取 一、IDM是什么 IDM&#xff08;internet download manager&#xff09;是一个互联网下载工具插件&#xff0c;常见于用…

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 29 章:ChatGPT 插件

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南—第 29 章&#xff1a;ChatGPT 插件 这是 ChatGPT 的另一个圣杯。它将彻底改变你使用 ChatGPT 的方式。ChatGPT 插件本质上是将 ChatGPT 的功能扩展到文本输出之外。它允许你上传图片、视频、音频和 CSV 文件&…

资深IT经理分享如何选择商用远控软件三:评估产品方案匹配度

作为企业必要的IT管理和远程办公工具&#xff0c;远程控制解决方案的挑选和采购是需要IT部门慎重考虑的。 对于具体如何在诸多产品中选择合适的商用远程控制解决方案&#xff0c;此前我们就分享了一位资深IT经理的相关经验&#xff0c;目前已经涵盖初期的业务需求调研&#xf…

【ESP32 IDF】ESP32移植u8g2库,实现oled界面显示

ESP32移植u8g2库&#xff0c;实现oled界面显示 1. 简单描述2. 环境准备1. 硬件准备2. 软件准备 3. IIC屏幕 【基于 ssd1362 256*64 】4. SPI屏幕 【基于 ssd1306 128*32】 1. 简单描述 开发方式为 IDF5.0参考连接为 iic基于esp-idf移植使用u8g2 spi基于esp-idf移植使用u8g2 …

探索创意无限的Photoshop CC 2020Mac/Win版

作为一款功能强大的图像处理软件&#xff0c;Photoshop CC 2020&#xff08;简称PS 2020&#xff09;在全球范围内备受设计师、摄影师和艺术家的喜爱和推崇。它不仅为用户提供了丰富多样的工具和功能&#xff0c;还不断推出新的创意特效和改进的功能&#xff0c;让用户的创意无…

【数据结构和算法】拥有最多糖果的孩子

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 三、代码 四、复杂度分析 前言 这是力扣的1431题&#xff0c;难度为简单&#xff0c;解题方案有很多种&…

C# Solidworks二次开发:选择管理器相关的API介绍

今天在讲述主要内容之前&#xff0c;先说一个不太相关的问题。 我之前在其他文章中看到有一些朋友在问为什么获取到的点位数据需要乘以1000进行单位转换&#xff0c;其实原因是这样的&#xff0c;在所有使用的API中如果没有特殊说明&#xff0c;所有的长度单位都是米&#xff…

苹果Vision Pro即将量产

据界面新闻消息&#xff0c;苹果公司将在今年12月正式量产第一代MR&#xff08;混合现实&#xff09;产品Vision Pro。苹果公司对Vision Pro寄予了厚望&#xff0c;预计首批备货40万台左右&#xff0c;2024年的销量目标是100万台&#xff0c;第三年达到1000万台。 苹果的供应…

springboot + thymeleaf + layui 初尝试

一、背景 公司运营的同事有个任务&#xff0c;提供一个数据文件给我&#xff0c;然后从数据库中找出对应的加密串再导出来给他。这个活不算是很难&#xff0c;但时不时就会有需求。 同事给我的文件有时是给excel表格&#xff0c;每一行有4列&#xff0c;逗号隔开&#xff0c;…

编译和使用WPS-ghrsst-to-intermediate生成SST

一、下载 V1.0 https://github.com/bbrashers/WPS-ghrsst-to-intermediate/tree/masterV1.5&#xff08;使用过程报错&#xff0c;原因不详&#xff0c;能正常使用的麻烦告知一下方法&#xff09; https://github.com/dmitryale/WPS-ghrsst-to-intermediate二、修改makefile…

【CVE 复现】CVE-2022-0185 fsconfig之整数溢出

影响版本&#xff1a;Linux-v5.1~v5.16.2 测试版本&#xff1a;Linux-5.11.22&#xff0c;由于懒得搞环境&#xff0c;所以直接用的 bsauce 大佬提供的 测试环境 看看 patch&#xff1a; diff --git a/fs/fs_context.c b/fs/fs_context.c index b7e43a780a625b..24ce12f0db32…

ResNeXt(2017)

文章目录 Abstract1. Introductionformer workour work 2. Related Work多分支卷积网络分组卷积压缩卷积网络Ensembling 3. Method3.1. Template3.2. Revisiting Simple Neurons3.3. Aggregated Transformations3.4. Model Capacity 4. Experiment 原文地址 源代码 Abstract 我…

【python】vscode中选择虚拟环境venv

vscode 怎么指定 python venv&#xff1f; 在VSCode中选择Python解释器&#xff1a; 打开命令面板&#xff1a;按下 CtrlShiftP&#xff08;Windows/Linux&#xff09;或 CmdShiftP&#xff08;Mac&#xff09;。在命令面板中&#xff0c;键入 “Python: Select Interpreter”…

14.Java程序设计-基于Springboot的高校社团管理系统设计与实现

摘要 随着高校社团活动的不断丰富和社团数量的逐渐增加&#xff0c;高校社团管理面临着日益复杂的挑战。为了提高社团管理的效率和透明度&#xff0c;本研究基于Spring Boot框架设计并实现了一套高校社团管理系统。该系统旨在整合社团创建、成员管理、活动发布等多个功能&…

水位线和窗口

水位线特点 插入到数据流中的一个标记&#xff0c;可以认为是一个特殊的数据主要内容是一个时间戳水位线是基于数据的时间戳生成的&#xff0c;即事件时间水位线必须单调递增水位线可以通过设置延迟&#xff0c;来保证正确处理乱序数据一个水位线&#xff0c;表示事件时间已经…

[FPGA 学习记录] 数码管动态显示

数码管动态显示 文章目录 1 理论学习1.1 数码管动态扫描显示原理 2 实战演练2.1 实验目标2.2 程序设计2.2.1 框图绘制2.2.2 数据生成模块 data_gen2.2.2.1 波形绘制2.2.2.2 代码编写2.2.2.3 代码编译2.2.2.4 逻辑仿真2.2.2.4.1 仿真代码编写2.2.2.4.2 仿真代码编译2.2.2.4.3 波…

如何解决el-table中动态添加固定列时出现的行错位

问题描述 在使用el-table组件时&#xff0c;我们有时需要根据用户的操作动态地添加或删除一些固定列&#xff0c;例如操作列或选择列。但是&#xff0c;当我们使用v-if指令来控制固定列的显示或隐藏时&#xff0c;可能会出现表格的行错位的问题&#xff0c;即固定列和非固定列…

el-tree数据量过大,造成浏览器卡死、崩溃

el-tree数据量过大&#xff0c;造成浏览器卡死、崩溃 场景&#xff1a;树形结构展示&#xff0c;数据超级多&#xff0c;超过万条&#xff0c;每次打开都会崩溃 我这里采用的是引入新的插件虚拟树&#xff0c;它是参照element-plus 中TreeV2改造vue2.x版本虚拟化树形控件&…

2024年强烈推荐mac 读写NTFS工具Tuxera NTFS for Mac2023中文破解版

大家好啊&#xff5e;今天要给大家推荐的是 Tuxera NTFS for Mac2023中文破解版&#xff01; 小可爱们肯定知道&#xff0c;Mac系统一直以来都有一个小小的痛点&#xff0c;就是无法直接读写NTFS格式的移动硬盘和U盘。但是&#xff0c;有了Tuxera NTFS for Mac2023&#xff0c;…

正则表达式:字符串处理的瑞士军刀

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…