C++核心编程学习4--类和对象--封装

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

封装

  • 将属性和行为作为一个整体。
  • 将属性和行为加以权限控制。

例子1:设计一个圆类

#include <iostream>
using namespace std;// 设计一个圆类,求圆的周长
// 圆周率:3.14
const double PI = 3.14;class Circle {
public:// 属性int m_r;    //  半径// 行为// 获取圆的周长double calculateZC() {return 2*PI*m_r;}
};int main() {// 通过圆类创建一个具体的圆(对象)// c就是一个具体的圆(对象)      // 通过一个类创建一个圆对象的过程叫做实例化Circle c;      //创建对象 局部变量 放在栈上c.m_r = 10;     // 给圆对象的半径赋值cout << c.calculateZC() << endl;return 0;
}

例子二 可以通过类的行为 对属性赋值。

#include <iostream>
using namespace std;class Student {
public:// 属性string s_name;int m_id;// 行为// 给姓名和学号进行赋值操作 可以通过类的行为 对属性赋值。void setName(string name) {s_name = name;}void setId(int id) {m_id = id;}// 显示姓名和学号void showInfo() {cout << s_name << " " << m_id << endl;}};int main() {Student s1{"张三", 001};s1.showInfo();Student  s2;s2.setName("homo");s2.setId(111);s2.showInfo();
}

封装的访问权限

  • public: 公有属性,类外可以访问
  • private: 私有属性,类外不可以访问
  • protected: 保护属性,类外不可以访问,类内可以访问,子类可以访问
#include <iostream>
using namespace std;class Person {// 姓名 公共权限public:string m_name;// 汽车 保护权限protected:string m_car;// 银行密码 私有权限private:int m_password;// 行为public:void func() {m_name = "张三";m_car = "保时捷";m_password = 123456;}void showInfo() {cout << "姓名:" << m_name << endl;cout << "汽车:" << m_car << endl;cout << "密码:" << m_password << endl;}
};int main() {Person p1;p1.m_name = "homo";cout << p1.m_name << endl;// p1.m_car = "拖拉机"; 报错,保护权限类外无法访问// cout << p1.m_car << endl;// p1.m_password = 987654; 报错,私有权限类外无法访问// cout << p1.m_password << endl;Person p2;p2.func();cout << p2.m_name << endl;// cout << p2.m_car << endl; 同样报错,只能通过公开函数访问// cout << p2.m_password << endl; 同样报错,只能通过公开函数访问p2.showInfo();      // 正确,通过公开函数访问
}

Struct和Class的区别

Struct默认为公有
Class默认为私有

成员属性设置为私有

将所有成员属性私有化,无论是想让他可读可写还是只读状态。
可读可写的成员属性可以在类内实现一个赋值的函数。该赋值函数放在公有权限中,实现类内访问修改值。只读的可以直接写个返回函数,实现读取。
set() get()

#include <iostream>
#include <string>using namespace std;class Person {// 公有方法对私有属性进行控制
public:// 姓名:可读可写// 姓名的写操作:设置姓名void setName(string name) {m_Name = name;}// 姓名的读操作:获取姓名string getName() {return m_Name;}// 年龄设置可读可写// 获取年龄int getAge() {return m_Age;}// 年龄设置可读可写void setAge(int age) {if (age >= 0 && age <= 150)m_Age = age;else {cout << "年龄需要在0-150之间" << endl;return;   // 年龄输入有误,返回}}// 情人设置可写void setLover(string lover) {m_lover = lover;}
private:string m_Name;  // 姓名 可读可写int m_Age = 18;  //  年龄 可读可写,但只能在0-150之间string m_lover; // 情人 只写};int main() {Person p;// 写姓名p.setName("aj");// 读姓名cout << "姓名:" << p.getName() << endl;// 写年龄p.setAge(20);// 读年龄cout << "年龄:" << p.getAge() << endl;return 0;
}

立方体案例

//
// 设计立方体类(Cube),求出立方体的面积和体积。
// 分别用全局函数和成员函数判断两个立方体是否相等。
//
#include <iostream>
using namespace std;class Cube
{// 属性
private:double m_L;     //长double m_W;     //宽double m_H;     //高// 行为
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 getArea() {return 2*(m_L*m_W+m_L*m_H+m_W*m_H);}// 求立方体的体积double Volume() {return m_L*m_W*m_H;}// 成员函数判断两个立方体是否相等bool isEqualByClass(Cube & c) {if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH())return true;elsereturn false;}
};// 全局函数:判断两个立方体是否相等
// 思路:分别比较两个立方体的长宽高是否相等,如果相等则认为两个立方体相等
bool isEqual(Cube & c1, Cube & c2) {if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())return true;elsereturn false;
}int main()
{// 实例化两个立方体Cube c1;c1.setL(10);c1.setW(20);c1.setH(30);cout << "c1的面积为:" << c1.getArea() << endl;cout << "c1的体积为:" << c1.Volume() << endl;cout << "--------------------" << endl;Cube c2;c2.setL(10);c2.setW(20);c2.setH(30);cout << "c2的面积为:" << c2.getArea() << endl;cout << "c2的体积为:" << c2.Volume() << endl;cout << "--------------------" << endl;// 全局函数判断两个立方体是否相等bool a = isEqual(c1, c2);if (a)cout << "两个立方体相等" << endl;elsecout << "两个立方体不相等" << endl;cout << endl;// 成员函数判断两个立方体是否相等bool b = c1.isEqualByClass(c2);if (b)cout << "成员函数判断:两个立方体相等" << endl;elsecout << "成员函数判断:两个立方体不相等" << endl;
}

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

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

相关文章

AC身份认证实验之AAA服务器

一、实验背景某公司需要在企业的公司网络出口使用上网行为管理设备&#xff0c;以审计管理局域网的所有设备&#xff0c;同时&#xff0c;局域网内的所有设备都将上网行为代理上网&#xff0c;但是发生过访客外传一些非法信息&#xff0c;所以需要对外来人员进行实名认证&#…

数组算法之【数组中第K个最大元素】

目录 LeetCode-215题 LeetCode-215题 给定整数数组nums和整数k&#xff0c;返回数组中第k个最大元素 public class Solution {/*** 这里是基于小顶堆这种数据结构来实现的*/public int findKthLargest(int[] nums, int k) {// 实例化一个小顶堆MinHeap minHeap new MinHeap…

高亮匹配关键词样式highLightMatchString、replaceHTMLChar

replaceHTMLChar: s > s.toString().replace(/</g, <).replace(/>/g, >),// 高亮匹配关键词样式----------------------------------------highLightMatchString(originStr, matchStr, customClass ) {matchStr && (matchStr matchStr.replace(/[.*?…

HUAWEI Pura80系列机型参数对比

类别HUAWEI Pura80 UltraHUAWEI Pura80 ProHUAWEI Pura80 ProHUAWEI Pura80建议零售价&#xffe5;9999起&#xffe5;7999起&#xffe5;6499起&#xffe5;4699起颜色鎏光金、鎏光黑釉红、釉青、釉白、釉黑釉金、釉白、釉黑丝绒金、丝绒绿、丝绒白、丝绒黑外观材质设计光芒耀…

使用 PyTorch 的 torchvision 库加载 CIFAR-10 数据集

CIFAR-10是一个更接近普适物体的彩色图像数据集。CIFAR-10 是由Hinton 的学生Alex Krizhevsky 和Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含10 个类别的RGB 彩色图片&#xff1a;飞机&#xff08; airplane &#xff09;、汽车&#xff08; automobile …

蓝桥杯51单片机

这是我备考省赛的时候总结的错误点和创新点那个时候是用来提醒自己的&#xff0c;现在分享给你们看^_^一考点二注意点记得初始化&#xff39;&#xff14;&#xff0c;&#xff39;&#xff15;&#xff0c;&#xff39;&#xff16;&#xff0c;&#xff39;&#xff17;&…

【2025/07/23】GitHub 今日热门项目

GitHub 今日热门项目 &#x1f680; 每日精选优质开源项目 | 发现优质开源项目&#xff0c;跟上技术发展趋势 &#x1f4cb; 报告概览 &#x1f4ca; 统计项&#x1f4c8; 数值&#x1f4dd; 说明&#x1f4c5; 报告日期2025-07-23 (周三)GitHub Trending 每日快照&#x1f55…

【生成式AI導論 2024】第12講:淺談檢定大型語言模型能力的各種方式 学习记录

跟标准答案做对比看是否正确 选择题是不是正确 MMLU massive multitask Language Understanding MT-bench 使用语言模型来评分 还有其他任务的对比,也有特别刁钻的问题 阅读长文的能力 grep kamradt 大海捞针

嵌入式 Qt 开发:实现开机 Logo 和无操作自动锁屏

在嵌入式设备开发中&#xff0c;为设备添加开机 Logo 和无操作自动锁屏功能是提升用户体验的重要环节。本文将详细介绍如何在 Qt 嵌入式项目中实现这两个功能。我们将使用 Qt 5/6 和 Linux 环境&#xff0c;确保代码的可移植性和通用性。项目结构为了实现这两个功能&#xff0c…

【AI智能体】Dify 开发与集成MCP服务实战操作详解

目录 一、前言 二、Dify 介绍 2.1 Dify是什么 2.2 MCP 介绍 2.2.1 什么是MCP 2.2.2 MCP核心特性 2.3 Dify中开发与使用MCP介绍 2.3.1 MCP Server开发与使用 2.4 dify 开发MCP Server优势 三、Dify开发与集成MCP操作过程 3.1 Dify MCP 插件说明 3.2 安装mcp-server插…

django filter按两个属性 去重

在Django中&#xff0c;如果你想基于两个属性去重&#xff0c;可以使用distinct()方法并结合annotate()和Count()来实现。这种方法通常用在查询集中&#xff0c;尤其是在你需要统计基于某些字段的唯一值时。 示例 假设你有一个Person模型&#xff0c;它有两个字段&#xff1a;f…

PHP高级进阶:突破编程边界,开启技术新征程

目录一、PHP 高级函数的深度剖析1.1 回调函数的高级应用1.2 递归函数的优化技巧二、面向对象编程的深化2.1 抽象类与接口的实际运用2.2 设计模式在 PHP 中的实现三、PHP 与数据库交互的高级技术3.1 数据库连接池的使用3.2 事务处理与数据一致性四、性能优化与调试4.1 代码性能分…

cx_Freeze python 打包详解

优点&#xff1a;有时比 PyInstaller 更好处理外部 .pyd做法&#xff1a;安装 cx_Freezeshpip install cx_Freeze新建 setup.py&#xff1a;pythonfrom cx_Freeze import setup, Executablebuild_exe_options {"packages": ["apscheduler.triggers.interval&qu…

Java字符串不可变性:从安全哲学到性能艺术的完美平衡

目录 引言 一、什么是String的不可变性&#xff1f; 二、解剖String的“防弹衣”&#xff1a;底层实现机制 1. final的三重防御体系 2. 方法实现的精妙设计 3. 构造函数的防御性编程 三、为什么String必须不可变&#xff1f;设计哲学的五大支柱 1. 字符串常量池&#x…

多服务器批量发布软件

当需要同时发布程序到多个服务器的时候&#xff0c;常规是通过jekins了但是喜欢了手动档&#xff0c;直接写了个简单批量发布软件&#xff0c;程序编译发布后&#xff0c;直接加载配置&#xff0c;选择对应的服务器&#xff0c;直接电机发布即可&#xff0c;基本可以媲美jekins…

基于.Net Core开源的库存订单管理系统

今天给大家推荐一套开源的库存订单管理系统。 项目简介 该项目是基于Asp.Net Core Mvc开发的库存订单管理系统&#xff0c;主要实现模块有仓库、产品、供应商、客户、采购订单、销售订单、发货、收货等等&#xff0c;该项目是单体架构&#xff0c;技术栈也不是最新的&#xf…

Django学习之旅--第13课:Django模型关系进阶与查询优化实战

在Django开发中&#xff0c;模型关系设计与查询性能直接决定了系统的扩展性和效率。当业务场景从简单的数据存储升级为复杂的关联分析&#xff08;如订单统计、用户行为分析&#xff09;时&#xff0c;基础的模型关系和查询方式已无法满足需求。本节课将深入讲解模型关系的高级…

简单理解现代Web应用架构:从简单到企业级

在开发Web应用程序时&#xff0c;理解如何构建一个既安全又高效的系统至关重要。本文将通过介绍从简单的三层架构到复杂的企业级架构的演变过程&#xff0c;帮助您更好地理解这些概念。1. 基础架构&#xff1a;React Node.js MySQL前端&#xff08;React&#xff09;&#xf…

修改 Lucide-React 图标样式的方法

修改 Lucide-React 图标样式的方法 使用 lucide-react 时&#xff0c;你可以通过多种方式修改图标的样式。以下是几种常用的方法&#xff1a; 1. 通过 className 属性 import { Home } from lucide-react;function MyComponent() {return <Home className"text-blue-50…

神经架构搜索革命:从动态搜索到高性能LLM的蜕变之路

本文将揭示如何通过神经架构搜索技术&#xff08;NAS&#xff09;自动发现最优网络结构&#xff0c;并将搜索结果转化为新一代高性能大型语言模型的核心技术。我们的实验证明&#xff0c;该方法在同等计算资源下可实现80%的性能飞跃&#xff01;第一部分&#xff1a;神经架构搜…