《C++进阶--4.封装》

Godot 4.2+ 集成 Spine 骨骼动画:C++ Runtime + GDExtension 实战指南 骨骼动画是2D游戏表现力的核心技术,其本质是通过层级骨骼驱动蒙皮网格实现高效变形。Spine 作为行业级骨骼动画工具,需依赖 Runtime 执行骨骼计算、蒙皮合成与状态机更新等底层逻辑。在 Godot 4.x 中,官方仅提供实验性支持,真正稳定落地必须绕过 JS/C# 等托管层,选用零依赖、高性能的 C++ Runtime,并通过 GDExtension 构建轻量胶水层,实现与 Godot 渲染管线和资源系统的深度协同。该方案兼顾移动端性能(实测 CPU 耗时降低37%)、跨平台稳定性(规避 .NET A 阅读详情

目录

4. 封装

4.1 封装的意义

4.2 struct和class区别

4.3 成员属性设置为私有

4.4 练习案例


4. 封装

4.1 封装的意义

封装是C++面向对象三大特性之一

封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物

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

封装意义一:

在设计类的时候,属性和行为写在一起,表现事物

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

示例1:设计一个圆类,求圆的周长

示例代码:

//圆周率
const double PI = 3.14;
​
//1、封装的意义
//将属性和行为作为一个整体,用来表现生活中的事物
​
//封装一个圆类,求圆的周长
//class代表设计一个类,后面跟着的是类名
class Circle
{
public:  //访问权限  公共的权限
​
    //属性---变量
    int m_r;//半径
​
    //行为---函数
    //获取到圆的周长
    double calculateZC()
    {
        //2 * pi  * r
        //获取圆的周长
        return  2 * PI * m_r;
    }
};
​
int main() {
    //实例化:通过一个类 创建一个对象的过程
    //通过圆类,创建圆的对象
    // c1就是一个具体的圆
    Circle c1;
    c1.m_r = 10; //给圆对象的半径 进行赋值操作(访问类的属性)
​
    //2 * pi * 10 = = 62.8
    cout << "圆的周长为: " << c1.calculateZC() << endl;//访问类的行为
​
    system("pause");
​
    return 0;
}

示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号

示例2代码:

//学生类
class Student {
public:
    void setName(string name) {
        m_name = name;
    }
    void setID(int id) {
        m_id = id;
    }
​
    void showStudent() {
        cout << "name:" << m_name << " ID:" << m_id << endl;
    }
public:
    string m_name;//姓名
    int m_id;//学号
};
​
int main() {
​
    Student stu;
    stu.setName("德玛西亚");
    stu.setID(250);
    stu.showStudent();
​
    system("pause");
​
    return 0;
}

类中的属性和行为 统一称为“成员”

属性:成员属性 / 成员变量

行为:成员函数 / 成员方法

封装意义二:

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

访问权限有三种:

  1. public 公共权限

  2. protected 保护权限

  3. private 私有权限

示例:

//三种权限
//公共权限  public     类内可以访问  类外可以访问
//保护权限  protected  类内可以访问  类外不可以访问
//私有权限  private    类内可以访问  类外不可以访问
​
//私有和保护在继承中有所区别,其中protected:儿子可以访问父亲中的保护内容;private:儿子不可以访问父亲的私有内容
​
class Person
{
    //姓名  公共权限
public:
    string m_Name;
​
    //汽车  保护权限
protected:
    string m_Car;
​
    //银行卡密码  私有权限
private:
    int m_Password;
​
public:
    void func()
    {
        m_Name = "张三";
        m_Car = "拖拉机";
        m_Password = 123456;
    }
};
​
int main() {
​
    Person p;//实例化一个具体的对象
    p.m_Name = "李四";
    //p.m_Car = "奔驰";  //保护权限类外访问不到
    //p.m_Password = 123; //私有权限类外访问不到
​
    system("pause");
​
    return 0;
}

4.2 struct和class区别

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

区别:

  • struct 默认权限为公共

  • class 默认权限为私有

示例:

class C1
{
    int  m_A; //默认是私有权限
};
​
struct C2
{
    int m_A;  //默认是公共权限
};
​
int main() {
​
    C1 c1;
    c1.m_A = 10; //错误,class访问权限默认是私有,类外不可以访问
​
    C2 c2;
    c2.m_A = 10; //正确,struct访问权限默认是公共
​
    system("pause");
​
    return 0;
}

4.3 成员属性设置为私有

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

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

示例:

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) {//设置权限,检测数据的有效性
            cout << "你个老妖精!" << endl;
            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(50);
    cout << "年龄: " << p.getAge() << endl;
​
    //情人设置
    p.setLover("苍井");
    //cout << "情人: " << p.m_Lover << endl;  //只写属性,不可以读取
​
    system("pause");
​
    return 0;
}

4.4 练习案例

练习案例1:设计立方体类

设计立方体类(Cube)

求出立方体的面积和体积

分别用全局函数和成员函数判断两个立方体是否相等。

练习案例2:点和圆的关系

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

log4cpp深度封装 简介关于log4cpp的介绍与好处就不再赘言了,百度一搜一大把。主要是对于log4cpp的使用如果不封装一下,感觉还是挺麻烦的,例如不少函数名挺长的。所以自己动手把它的日常使用进行了封装,可以让使用log4cpp就像调用一句printf()函数一样简单快捷。封装目标 不需要用一次就调用一次getInstance,只需要在main文件中引入一次即可 封装成需要使用时只需简短的一举logError(“s 阅读详情

相关推荐

LLaMA、llama.cpp与Ollama:从模型到本地化部署的完整指南

本文全面解析了LLaMA大语言模型家族及其本地化部署方案。详细介绍了Meta开源的LLaMA模型作为基础,llama.cpp如何通过C++实现和量化技术实现模型轻量化,以及Ollama如何提供一键式部署与管理,大幅降低本地运行AI模型的门槛,并提供了从入门到进阶的实践指南。

yhn4567890的博客 2400

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

语法:class 类名{访问权限:属性/行为};类中的属性和行为统称为成员,属性也可以称为成员属性或成员变量,行为也可以称为成员函数或成员方法。//设计一个圆类,求圆的周长//class代表设计一个类,类后面紧跟的是类名称//访问权限public://公共权限//属性//半径int r;//行为:获取圆的周长int main()//实例化:通过圆类,创建具体的圆(对象)Circle c1;//给圆对象的属性进行赋值c1.r=10;

qq_52737907的博客 634

C++跨平台基于log4cpp二次单例封装

项目因为切换日志库,选型log4cpp,为了使用方便,进行了二次封装 log4cpp.h #ifndef __LOG_4_CPP__ #define __LOG_4_CPP__ #include<iostream> #include <string.h> //strrchr()函数所需头文件 #include <stdio.h> #include &l...

Map的博客 831

C++进阶4(类和对象——封装)

封装意义1 //类和对象 //C++面向对象的三大特性为:封装,继承,多态 //C++认为万事万物皆为对象,对象上有其属性和行为 //例如: //​ 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌… //​ 车也可以作为对象,属性有轮胎、方向盘、车灯…, 行为有载人、放音乐、放空调… //​ 具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类 /*封装是C++面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体,表现生活中的事物 将属性和行为加以权限控制*

henu@wyx南念 117

log4cpp 封装

最近学习log4cpp,试着封装了下,mark下。#include<iostream> #include<log4cpp/Category.hh>#include<log4cpp/Appender.hh> #include<log4cpp/FileAppender.hh> #include<log4cpp/RollingFileAppender.hh> #include<log4cpp/Ostrea

sinat_26003209的博客 1826

RabbitMQ C++ 客户端封装与实战

本文介绍了基于 AMQP-CPP 库的 RabbitMQ C++ 客户端开发实践。首先分析了 AMQP-CPP 的优势:完全异步、灵活网络层、现代 C++ 兼容和轻量级特性。然后详细讲解了 RabbitMQ 服务端安装配置和 C++ 客户端库的安装步骤,包括解决 SSL 版本冲突问题。文章重点剖析了一个线程安全的 MQClient 封装类,该类基于 libev 实现异步事件循环,提供了声明交换机/队列、发布消息和订阅消费三大核心功能,并确保线程安全性。最后展示了构造函数如何初始化 AMQP 连接、通道并启动

zrt123456i的博客 1748

C++进阶 | [4.4] 红黑树封装 map 和 set

摘要:实现红黑树的迭代器,用红黑树封装 map 和 set

fantastic_13_7的博客 1083

C++编程全面学习:C++ Primer中文版(第4版)解析

C++是现代编程语言的基石之一,以其性能高效和灵活性著称。本章将概述C++的核心特性,为深入学习奠定基础。C++ 提供了多种条件语句和循环语句,包括 if-else、switch、while、do-while 和 for。掌握这些控制流语句的高效使用方法,对于编写清晰、高效的代码至关重要。条件语句是程序中做出决策的关键部分。if语句和else分支能够实现简单的条件判断,而switch语句则更适用于多个固定值的条件选择。在使用switch时,应当注意每个case语句后的。

weixin_42452483的博客 1125

2021-8-1 C++进阶学习 -> 4.1类和对象--封装

4.1.1封装的意义 class代表要设计一个类,后面紧跟着类的名字 类中的属性和行为都叫做成员 属性 成员属性 成员变量<-->行为 成员函数 成员方法 实例化(通过一个类,来创建一个对象的过程 #include <iostream> #include <string> using namespace std; const double PI = 3.14; //class代表要设计一个类,后面紧跟着类的名字 class circle { //访问权限

ice_cream_moon的博客 210

基于log4cpp封装的日志记录类设计与实现

Log4cpp的日志级别用于标识日志信息的严重程度,通常按照优先级从低到高排列为:DEBUG < INFO < WARN < ERROR < FATAL。不同级别的日志适用于不同的场景,开发者可以根据需要选择合适的日志级别来控制输出内容。Log4cpp允许开发者通过继承类实现自定义的Appender,满足特定业务需求,如将日志发送到远程服务器、数据库或消息队列。通过的方法,可以灵活定制日志格式。例如以下格式字符串包含更丰富的信息:输出示例:格式符号含义%F。

weixin_42596246的博客 763

使用ADS进行LNA低噪放设计的详细教程

详细介绍了通过ADS软件进行LNA设计的过程,从晶体管的选型到稳定性系数分析、再到输入输出端匹配,完整的讲解了低噪放的设计流程,可以使新手小白以及学习射频放大器的朋友可以快速的了解掌握ADS的使用方法和LNA的设计方法。

weixin_41831333的博客 3448

LOG4CXX编译,使用,简单封装

1.下载下面三个文件放在同级目录下解压: http://apr.apache.org/download.cgi apr-1.4.6-win32-src.zip apr-util-1.5.1-win32-src.zip http://logging.apache.org/log4cxx/download.html apache-log4cxx-0.10.0.zip 2. 将apr-

Keep It Simple, Stupid 2061

【STM32】STM32F103C8T6多串口通信实战:3个USART并行收发与中断处理优化

本文详细介绍了STM32F103C8T6多串口通信的实战技巧,包括3个USART模块的并行配置、中断优先级优化及数据收发冲突规避策略。通过硬件初始化步骤、中断优先级设置和双缓冲区实现等方案,有效解决了多串口通信中的数据错乱问题,提升系统稳定性与效率。

weixin_42526417的博客 168

怎样在本地高效部署Gemma-4-31B-JANG_4M-CRACK-GGUF:5个实战技巧与系统集成方案

Gemma-4-31B-JANG_4M-CRACK-GGUF是一个经过特殊优化的大语言模型部署方案,它将Google原版Gemma-4-31B模型的强大能力与JANG v2混合精度量化技术相结合,为本地AI部署提供了全新的选择。这个模型通过CRACK处理移除了安全限制,让开发者能够更灵活地探索AI应用边界,同时通过智能量化策略大幅降低了硬件门槛。 ## 项目概述与价值主张 Gemma-4-31

gitblog_07100的博客 484

薛定谔虚拟筛选实战:如何用PDB文件快速构建受体格点(避坑指南)

本文提供了薛定谔虚拟筛选实战指南,聚焦于如何从PDB文件快速、精准地构建受体格点。文章详细解析了可变残基的理性处理策略、基于配体尺寸的盒子量化设置方法,并分享了高级约束与排除体积的实战技巧,旨在帮助用户避开常见陷阱,提升虚拟筛选的成功率与效率。

weixin_28419039的博客 252

数据结构与算法——7-2 一元多项式的乘法与加法运算 (20分)

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出样例: 15 24 -25 22 30 21 -10 2

qazwsxxxxxasd的博客 1484

libv4l2cpp:一款强大的V4L2 C++封装库

libv4l2cpp:一款强大的V4L2 C++封装库 项目介绍 libv4l2cpp 是一款基于C++的V4L2封装库,旨在简化V4L2接口的使用,使得开发者能够更轻松地进行视频设备的捕获和输出操作。该项目源自 mpromonet/libv4l2cpp,并在其基础上进行了扩展和优化。主要改进包括增加了更多的打印信息、解决了视频设备可能拥有多个视频资源的问题,并添加了对OpenCV Mat BGR...

gitblog_00916的博客 1726

AutoCAD中圆弧折线化方法与实现

在AutoCAD中,圆弧折线化是将圆弧曲线转换为由一系列线段组成的折线曲线的过程。本文将介绍如何使用LISP编写代码来实现圆弧折线化,并提供相应的源代码。上述示例代码将生成一个以坐标原点为圆心、起点为(5.0, 0.0, 0.0)、终点为(0.0, 5.0, 0.0)、半径为5.0、角度为90度的圆弧的折线表示。通过使用上述的LISP代码,你可以在AutoCAD中实现将圆弧转换为折线的功能。你可以根据需要修改代码中的参数来适应不同的圆弧转换需求。函数,并传入圆弧的起点、终点、圆心、半径和角度参数。

VcuOcaml的博客 1417

封装log4cpp

 log4cpp 是参考 log4j 所写的 c++ 版本的写 log 的库。可以在这里下载 http://log4cpp.sourceforge.net/ 我的使用方法是:1,定义了一个 _LOG4CPP 宏,用来打开或关闭 log4cpp 的调用,以便在完全不需要 log 的情况下可以运行,例如进行性能测试时;又比如 log4cpp 可能有内存泄露,关闭使用它,可以检查

3818

YOLO26改进策略【Head】| (独家改进)轻量化检测头:利用 EfficientNet 中的移动倒置瓶颈模块 MBConv 改进检测头

本文记录的是基于移动倒置瓶颈 MBConv 的 YOLO26 的检测头轻量化改进方法研究。采用了独特的倒置瓶颈结构,通过的操作以及,在高效提取特征的同时极大地降低了计算量。本文将的设计优势融入j检测头中,使其在目标检测任务中不仅能够更精准地识别各类目标,还能在计算资源有限的情况下快速响应,展现出更为卓越的实时检测能力。EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks的实现代码如下: 首先在代码中加入如下代码: 其

Limiiiing的博客 286

智能车图像处理12-进阶篇4--环岛辅助判断条件

主函数: 第6行: 含义是当前需要不在坡道和车库状态 第11-12行 : 寻找一下环岛的双断点(在辅助函数中) 第16-66行: 当左右线的方差满足一边很大,一边很小时,truepianfangflag /truepianfangflagforleft 置1,在环岛的判断中使用。 辅助函数: 双断点函数(左与右相似,以做为例): 第13-28行: 第一处断点 第29-40行: 第一处断点后 连续边线 第41-52行: 第一处连续后,第二处断点 第53-64行: 第二处断点后,第二处

taiyuezyh的博客 1万+

基于log4cpp封装日志类

基于log4cpp封装日志类,包括log4cpp的安装和使用。

本人的技术和文笔有限,正在努力成长中,请各位朋友多多指正与包涵! 1160

Vue - 超强实现网页禁止浏览器缩放功能,浏览器缩放时保持网页不变形、元素不会被挤压等,屏蔽浏览器鼠标滚轮缩放页面(提供详细示例代码,一次引入整个网站无人可以搞乱你的页面布局及样式)

vue,nuxt,禁止浏览器缩放,如何用户缩放浏览器导致页面变形,网页缩放后页面变形了怎么办,怎么解决网站被缩放后元素乱套错乱,vue怎么禁止网页不被缩放,vue如何禁止浏览器缩放,vue缩放网页变形影响布局怎么办,vue电脑分辨率及缩放导致页面变形的问题,前端页面解决浏览器或者系统被放大和缩小导致的显示问题,Vue中页面自适应缩放,如何防止Vue页面缩放时变形/调整大小,Vue项目中,防止页面被缩放和放大,vue等比例缩放网页,网页缩放后界面变形咋办,禁止页面缩放,vue禁止浏览器改变窗口大小,Vue项目

🏆 前端领域优质创作者 1万+

log4cpp单例类封装

body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1p...

dfuw13072的博客 431

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C/C++编程:log4cpp使用学习

简介 Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。 Log4cpp有如下优点: 提供了可扩展的多种日志记录方式; 提供了NDC(嵌套诊断上下文),可用于多线程、多场景的跟踪调试; 提供了完整的日志动态优先级控制,可随时调整需要记录的日志优先级 可通过配置文件完成所有配置并动态加载; 性能优秀,内存

OceanStar的博客 4019

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

AMQP-CPP二次封装

AMQP-CPP他不提供底层网络通信的过程,也没有网络IO监控。他只是进行了内部的一个应用层协议的定义,以及根据 amqp 协议它内部的核心概念所支持的这些功能的一个支持。所以它就需要我们自己用户自己来去来定义这块的一个网络底层的一个网络通信。但是它将一些知名的网络通信框架集成到了它的这个呃它的 sdk 当中,也就是说如果我们需要使用某种某种知名的这种网络通信框架来进行一个底层网络通信,它也是支持的。人家已经把内部的这些最基础的一个适配功能是已经完成了。

2301_77412625的博客 1699

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 《C++进阶--3.函数提高》
下一篇: 《C++进阶--5.对象的初始化和清理》
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿!=程序员

感谢来过,感谢有你!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值