C++编程:进阶阶段—4.1封装

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

具有相同性质的对象,抽象为类

4.1 封装

封装的意义:将属性和行为作为一个整体,表现生活中的事物,并将属性和行为加以权限控制。

4.1.1 类的定义及实例化对象

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

类中的属性和行为统称为成员,属性也可以称为成员属性或成员变量,行为也可以称为成员函数或成员方法。

代码如下:

#include <iostream>
using namespace std;//设计一个圆类,求圆的周长
const double PI=3.14;//class代表设计一个类,类后面紧跟的是类名称
class Circle
{//访问权限
public://公共权限//属性//半径int r;//行为:获取圆的周长double calculateZC(){return 2*PI*r;}};int main()
{//实例化:通过圆类,创建具体的圆(对象)Circle c1;//给圆对象的属性进行赋值c1.r=10;cout<<"圆的周长为:"<<c1.calculateZC()<<endl;return 0;
}

输出如下:

4.1.2 访问权限

访问权限分为三种:

  • 公共权限:类内外都可以访问成员
  • 保护权限:类内可以访问成员,类外不能访问
  • 私有权限:类内可以访问成员,类外不能访问

代码如下:

#include <iostream>
using namespace std;class Person
{//公共权限
public:string name;//保护权限
protected:string car;//私有权限
private:int passwd;
public:void func(){name="ddd";car="bench";passwd=4444;}
};
int main()
{//实例化一个对象Person p1;//给圆对象的属性进行赋值p1.name="dddd";//p1.car="paosij";//p1.passwd=1234;return 0;
}

错误示例:修改保护权限和私钥权限的属性。

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

代码如下:

#include <iostream>
using namespace std;class Person
{
public://设置姓名void setName(string name){m_name=name;}//获取姓名string getName(){return m_name;}//获取年龄int getAge(){return m_age;}//设置偶像void setIdol(string idol){m_idol=idol;}private:string m_name;//姓名 可读可写int m_age=18;//年龄 只读string m_idol;//偶像 只写};
int main()
{//实例化一个对象Person p;//设置姓名p.setName("ddd");//获取姓名cout<<"姓名:"<<p.getName()<<endl;//设置年龄,不存在该函数//p.setAge("ddd");//报错 不存在该成员setAge//p.m_age=23;//报错 无法访问//获取年龄cout<<"年龄:"<<p.getAge()<<endl;//设置偶像p.setIdol("huge");//获取偶像,没有获取函数//cout<<"偶像:"<<p.getIdol()<<endl;//报错 不存在该成员getIdol//cout<<"偶像:"<<p.m_idol()<<endl;//报错 无法访问return 0;
}

错误示例:

4.1.3 struct 与 class

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

错误示例:访问class中默认权限下的成员。

4.1.4 案例1:立方体类

题目:设计立方体类,求出立方体的面积和体积,分别用全局函数和成员函数判断两个立方体是否相等

代码如下:

#include <iostream>
using namespace std;class Cube
{
private://属性:长宽高int l;int w;int h;public://设置\获取属性void setLong(int ll){l=ll;}int getLong(){return l;}void setWidth(int ww){w=ww;}int getWidth(){return w;}void setHeight(int hh){h=hh;}int getHeight(){return h;}//方法:计算面积、体积、判断两个立方体是否相等int getSquare(){return 2*(l*h+h*w+h*w);}int getVolume(){return l*w*h;}//利用成员函数判断两个立方体是否相等void isEqual(Cube &c){if(l==c.getLong() && w==c.getWidth() && h==c.getHeight()){cout<<"两个立方体相同"<<endl;}else{cout<<"两个立方体不同"<<endl;}}
};//利用全局函数判断两个立方体是否相等
void isSame(Cube &c1,Cube &c2)
{if(c1.getLong()==c2.getLong() && c1.getWidth()==c2.getWidth() && c1.getHeight()==c2.getHeight()){cout<<"两个立方体相同"<<endl;}else{cout<<"两个立方体不同"<<endl;}
}int main()
{//创建对象Cube c1;c1.setLong(1);c1.setWidth(2);c1.setHeight(3);cout<<"c1的面积为:"<<c1.getSquare()<<endl;cout<<"c1的体积为:"<<c1.getVolume()<<endl;Cube c2;c2.setLong(1);c2.setWidth(2);c2.setHeight(3);//判断两个立方体是否相等isSame(c1,c2);c1.isEqual(c2);c2.setLong(2);isSame(c1,c2);c1.isEqual(c2);return 0;
}

输出如下:

4.1.5 案例2:点和圆(分文件)

题目:设计一个圆形类和一个点类,计算点和圆的关系。

代码如下:

#include <iostream>
using namespace std;//点类
class Point
{
private:int p_x;int p_y;public://设置/获取X,Yvoid setX(int x){p_x=x;}int getX(){return p_x;}void setY(int y){p_y=y;}int getY(){return p_y;}
};//圆类
class Circle
{
private:    int c_r;//半径Point center;//圆心public://设置/获取半径圆心void setR(int r){c_r=r;}int getR(){return c_r;}void setCer(Point cer){center=cer;}Point getCer(){return center;}
};//判断点和圆的关系
void isInCircle(Circle &c,Point &p)
{int dist=(c.getCer().getX()-p.getX()) * (c.getCer().getX()-p.getX())+(c.getCer().getY()-p.getY()) * (c.getCer().getY()-p.getY());int rdist=c.getR() * c.getR();if(dist==rdist){cout<<"点在圆上"<<endl;}else if(dist>rdist){cout<<"点在圆外"<<endl;}else{cout<<"点在圆内"<<endl;}
}int main()
{//创建点对象和圆对象Point p;Circle c;Point center;//设置点的坐标p.setX(0);p.setY(0);//设置园的半径及圆心的坐标c.setR(10);center.setX(10);center.setY(0);c.setCer(center);//判断点与圆的关系isInCircle(c,p);return 0;
}

输出如下:

分文件编写:

point.h

#pragma once//防止头文件重复包含
#include <iostream>
using namespace std;//点类
class Point
{
private:int p_x;int p_y;public://设置/获取X,Yvoid setX(int x);int getX();void setY(int y);int getY();};

point.cpp

#include "point.h"//点类//设置/获取X,Y
void Point::setX(int x)//Point::的作用是声明该函数是Point作用域下的成员函数
{p_x=x;
}
int Point::getX()
{return p_x;
}void Point::setY(int y)
{p_y=y;
}
int Point::getY()
{return p_y;
}

circle.h

#pragma once
#include <iostream>
using namespace std;
#include "point.h"//圆类
class Circle
{
private:    int c_r;//半径Point center;//圆心public://设置/获取半径圆心void setR(int r);int getR();void setCer(Point cer);Point getCer();};

circle.cpp

#include "circle.h"//圆类//设置/获取半径圆心
void Circle::setR(int r)
{c_r=r;
}
int Circle::getR()
{return c_r;
}void Circle::setCer(Point cer)
{center=cer;
}Point Circle::getCer()
{return center;
}

main.cpp

#include <iostream>
using namespace std;
#include "point.h"
#include "circle.h"//判断点和圆的关系
void isInCircle(Circle &c,Point &p)
{int dist=(c.getCer().getX()-p.getX()) * (c.getCer().getX()-p.getX())+(c.getCer().getY()-p.getY()) * (c.getCer().getY()-p.getY());int rdist=c.getR() * c.getR();if(dist==rdist){cout<<"点在圆上"<<endl;}else if(dist>rdist){cout<<"点在圆外"<<endl;}else{cout<<"点在圆内"<<endl;}
}int main()
{//创建点对象和圆对象Point p;Circle c;Point center;//设置点的坐标p.setX(0);p.setY(0);//设置园的半径及圆心的坐标c.setR(10);center.setX(10);center.setY(0);c.setCer(center);//判断点与圆的关系isInCircle(c,p);return 0;
}

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

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

相关文章

运行OpenManus项目(使用Conda)

部署本项目需要具备一定的基础&#xff1a;Linux基础、需要安装好Anaconda/Miniforge&#xff08;Python可以不装好&#xff0c;直接新建虚拟环境的时候装好即可&#xff09;&#xff0c;如果不装Anaconda或者Miniforge&#xff0c;只装过Python&#xff0c;需要确保Python是3.…

spring boot + vue 搭建环境

参考文档&#xff1a;https://blog.csdn.net/weixin_44215249/article/details/117376417?fromshareblogdetail&sharetypeblogdetail&sharerId117376417&sharereferPC&sharesourceqxpapt&sharefromfrom_link. spring boot vue 搭建环境 一、浏览器二、jd…

MPPT与PWM充电原理及区别详解

MPPT&#xff08;最大功率点跟踪&#xff09;和PWM&#xff08;脉宽调制&#xff09;是太阳能充电控制器中常用的两种技术&#xff0c;它们在原理、效率和适用场景上有显著区别。以下是两者的详细对比&#xff1a; 1. 工作原理 PWM&#xff08;脉宽调制&#xff09; 核心机制…

slam学习笔记9---ubuntu2004部署interactive_slam踩坑记录

背景&#xff1a;interactive_slam是一款可用于离线优化点云地图算法。部署安装容易出问题&#xff0c;这里记录一下。 一、安装基本流程 绝大部分跟着readme走&#xff0c;g2o安装使用apt安装 interactive_slam depends on the following libraries:GL3W GLFW Dear ImGui p…

视觉图像处理

在MATLAB中进行视觉图像处理仿真通常涉及图像增强、滤波、分割、特征提取等操作。以下是一个分步指南和示例代码,帮助您快速入门: 1. MATLAB图像处理基础步骤 1.1 读取和显示图像 % 读取图像(替换为实际文件路径) img = imread(lena.jpg); % 显示原图 figure; subplot(2…

用java如何利用jieba进行分词

在Java中使用jieba进行分词&#xff0c;可以借助jieba的Java版本——jieba-analysis。jieba-analysis是一个基于jieba分词算法的Java实现&#xff0c;支持精确模式、全模式和搜索引擎模式等多种分词方式。 以下是使用jieba-analysis进行分词的详细步骤和示例代码&#xff1a; …

【含文档+PPT+源码】Python爬虫人口老龄化大数据分析平台的设计与实现

项目介绍 本课程演示的是一款Python爬虫人口老龄化大数据分析平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…

【A2DP】SBC 编解码器互操作性要求详解

目录 一、SBC编解码器互操作性概述 二、编解码器特定信息元素(Codec Specific Information Elements) 2.1 采样频率(Sampling Frequency) 2.2 声道模式(Channel Mode) 2.3 块长度(Block Length) 2.4 子带数量(Subbands) 2.5 分配方法(Allocation Method) 2…

Android双亲委派

下面是一份 Android 类加载器双亲委派机制的时序图示例&#xff0c;描述了当应用调用 loadClass() 时&#xff0c;各个加载器之间的委派过程。 #mermaid-svg-rBdlhpD2uRjBPiG8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mer…

记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)

文章目录 记录小白使用 Cursor 开发第一个微信小程序&#xff08;二&#xff09;&#xff1a;创建项目、编译、预览、发布&#xff08;250308&#xff09;一、创建项目1.1 生成提示词1.2 生成代码 二、编译预览2.1 导入项目2.2 编译预览 三、发布3.1 在微信开发者工具进行上传3…

Linux系统管理二

目录 一.远程连接管理服务SSH 1.1 了解服务端和客户端 1.2 了解端口号的设定 1.3 了解ssh服务的作用 1.4 ssh搭建服务 二.netstat 2.1 netstat简介 2.2 netstat命令参数 2.3 常用命令参考 三.进程的检测与控制 3.1 管道 3.1.1 什么是管道 3.1.2 管道的分类 3.1.3…

【Recon】Git源代码泄露题目解题方法

CTF中Git源代码泄露题目解题方法 1. 确认存在.git目录泄露2. 下载完整的.git目录3. 恢复Git仓库历史4. 查找Flag的常见位置5. 处理不完整的.git目录6. 其他技巧示例流程 在CTF中遇到Git源代码泄露题目时&#xff0c;通常可以通过以下步骤解决&#xff1a; 1. 确认存在.git目录泄…

字符串 反转函数reverse() 的错误用法

回文字符串 题目描述 如果一个字符串逆序后与正序相同&#xff0c;那么称这个字符串为回文字符串。例如abcba是回文字符串&#xff0c;abcca不是回文字符串。 给定一个字符串&#xff0c;判断它是否是回文字符串。 输入描述 一个非空字符串&#xff08;长度不超过 50&#…

C#程序加密与解密Demo程序示例

目录 一、加密程序功能介绍 1、加密用途 2、功能 3、程序说明 4、加密过程 5、授权的注册文件保存方式 二、加密程序使用步骤 1、步骤一 ​编辑2、步骤二 3、步骤三 4、步骤四 三、核心代码说明 1、获取电脑CPU 信息 2、获取硬盘卷标号 3、机器码生成 3、 生成…

专题二串联所有单词的子串

1.题目 题目分析&#xff1a; 有一个字符串s和字符串数组&#xff0c;如何字符串数组里面的元素可以组成一个字符串&#xff0c;然后要在字符串里面找到连续子串跟组成的字符串一样&#xff0c;返回起始地址。 2.算法原理 这道题可以把字符串数组的元素string看出char&#x…

scala类型检测和转换

在scala中关于类型的检测的api一共有以下三个&#xff1a; &#xff08;1&#xff09;obj.isInstanceOf[T]&#xff1a;判断 obj 是不是 T 类型。 &#xff08;2&#xff09;obj.asInstanceOf[T]&#xff1a;将 obj 强转成 T 类型。 &#xff08;3&#xff09;classOf[T]&am…

【论文阅读】VAD: Vectorized Scene Representation for Efficient Autonomous Driving

一、介绍 VAD是华科团队设计的一个端到端无人驾驶框架&#xff0c;针对传统的无人驾驶框架的模块化设计的问题&#xff0c;该算法使用向量化的策略进行了端到端的实现。传统的模块化设计使得感知模块完全依赖于感知模块的计算结果&#xff0c;这一解耦实际上从规划模块的角度损…

探索Java多线程的核心概念与实践技巧,带你从入门到精通!

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习多线程编程-"掌握线程创建、管理与安全"&#xff1a; 上一节课程我们铺垫了一系列的东西&#xff0c;引出来了我们的多…

互动多媒体项目 自行车互动

该项目为UE4 +自行车骑行速度 互动项目 结果预览 : 1. 获取自行车速度 这里使用的是Arduino单片机 + 霍尔传感器 霍尔传感器: 单片机完整代码: #define HALL_PIN 2 // 霍尔传感器连接到D2(中断引脚) volatile unsigned long lastTime = 0; // …

STM32——GPIO介绍

GPIO(General-Purpose IO ports,通用输入/输出接口)模块是STM32的外设接口的核心部分,用于感知外界信号(输入模式)和控制外部设备(输出模式),支持多种工作模式和配置选项。 1、GPIO 基本结构 STM32F407 的每个 GPIO 引脚均可独立配置,主要特性包括: 9 组 GPIO 端口…