当前位置: 首页 > news >正文

C++ 封装的用法

C++(七)封装

封装,可以达到,对外提供接口,屏蔽数据,对内开放数据。

权限控制

struct 中所有行为和属性都是 public 的(默认),此举也是为了 C++兼容 C 语言,
因为 C 语言中没有权限的概念。

C++中的 class 可以指定行为和属性的访问方式,默认为 private,此举要求你必
须指定权限,不然就没有办法外部访问。

访问属性属性对象内部对象外部
public公有可访问可访问
private私有可访问不可访问

初步使用封装:

#include <iostream>
#include <string.h>
using namespace std;class Stack{
public:void init();bool isEmpty();bool isFull();void push(int data);int pop();
private:int space[1024];int top;
};void Stack::init()
{memset(space,0,sizeof(space));top = 0;
}
bool Stack::isEmpty()
{return top == 0;
}
bool Stack::isFull()
{return top == 1024;
}
void Stack::push(int data)
{space[top++] = data;
}
int Stack::pop()
{return space[--top];
}int main(){Stack s;s.init();if(!s.isFull())s.push(10);if(!s.isFull())s.push(20);if(!s.isFull())s.push(30);if(!s.isFull())s.push(40);while(!s.isEmpty())cout<<s.pop()<<endl;return 0;
}

class

构造器constructor

构造器是类的初始化函数,当对象被创建时,系统自动调用构造器进行初始化。

无返回值 可以有参数

构造器可以有默认参数,可以被重载

系统提供的默认构造器,当没有自定义构造器时,系统会自动生成一个默认构造器。

无论重载还是默认参数,都应该将无参的空体构造器包含进来

生成的无参的对象,是一种比较常见的现象,对象数组;

#include <iostream>
#include <string.h>
using namespace std;class Stack{
public:Stack(){top = 0;size = 1024;space = new int[1024];memset(space, 0, sizeof(int)*1024);}Stack(int size){top = 0;this->size = size;space = new int[size];memset(space, 0, sizeof(int)*size);}//默认参数会在现在的代码中冲突
//    Stack(int size=1024){
//        top = 0;
//        this->size = size;
//        space = new int[size];
//        memset(space, 0, sizeof(int)*size);
//    }bool isEmpty();bool isFull();void push(int data);int pop();
private:int *space;int top;int size;
};bool Stack::isEmpty()
{return top == 0;
}
bool Stack::isFull()
{return top == size;
}
void Stack::push(int data)
{space[top++] = data;
}
int Stack::pop()
{return space[--top];
}int main(){Stack s(2);if(!s.isFull())s.push(10);if(!s.isFull())s.push(20);if(!s.isFull())s.push(30);if(!s.isFull())s.push(40);while(!s.isEmpty())cout<<s.pop()<<endl;return 0;
}

initial list 初始化列表

C++11 引入了初始化列表,可以用来初始化类成员变量。

*** 注意: 初始化的顺序与成员变量的声明顺序相同。与列表中赋值顺序无关。***
不能使用列表中初始化的成员,去初始化其他成员,做法很容易引发错误

必须用此格式来初始化引用数据。

必须用此格式来初始化非静态 const 数据成员(C++98)。

//列表只能初始化类成员变量,不能初始化局部变量Stack(int size): top(0), size(size), space(new int[size]){memset(space, 0, sizeof(int)*size);}Stack(int size): top(0), size(size), space(new int[size]{0}){}

析构器destructor

析构器是类的析构函数,

~开头与类名同的函数,在类对象销毁时(栈/堆对象),自动调用,

无返回值 不能有参数

析构器不能被重载

系统提供的默认析构器,当没有自定义析构器时,系统会自动生成一个默认析构器。


#include <iostream>
#include <string.h>
using namespace std;class Stack{
public:Stack(){top = 0;size = 1024;space = new int[1024];memset(space, 0, sizeof(int)*1024);}~Stack(){delete[] space;}private:int *space;int top;int size;
};

层次管理


#include <iostream>
#include <string.h>
using namespace std;
class Student
{
public:Student(int a, char* n ){cout<<"Constructor called"<<endl;_age  = a;_name = new char[strlen(n)];strcpy(_name,n);}~Student(){cout<<"Destructor called"<<endl;delete []_name;}private:char *_name;int _age;
};
int main()
{Student s(10,"hello");Student *ps  = new Student(10,"hello");delete ps;return 0;
}

分文件编程

myStack.h

//
// Created by gophe on 24-7-28.
//#ifndef CDEMO_MYSTACK_H
#define CDEMO_MYSTACK_Hclass myStack {
public:myStack();//myStack(int size);myStack(int size=10);//参数默认值只能在这定义,初始化列表在.cpp中定义~myStack();bool isEmpty();bool isFull();void push(int data);int pop();
private:int *space;int top;int size;
};#endif //CDEMO_MYSTACK_H

myStack.cpp

//
// Created by gophe on 24-7-28.
//#include "Headers/myStack.h"myStack::myStack(){top = 0;size = 100;space = new int[100];
}
//  上下两种均可
myStack::myStack():size(10),top(0),space(new int[10]){}myStack::myStack(int s)
{top = 0;size = s;space = new int[s];
}
//  上下两种均可
//初始化列表在.cpp中定义
myStack::myStack(int s):size(s),top(0),space(new int[s])
{
}myStack::~myStack()
{delete[] space;
}bool myStack::isEmpty()
{return top == 0;
}
bool myStack::isFull()
{return top == size;
}
void myStack::push(int data)
{space[top++] = data;
}
int myStack::pop()
{return space[--top];
}

main.cpp

#include <iostream>
#include "Headers/myStack.h"using namespace std;int main(){myStack s(2);if(!s.isFull())s.push(10);if(!s.isFull())s.push(20);if(!s.isFull())s.push(30);if(!s.isFull())s.push(40);while(!s.isEmpty())cout<<s.pop()<<endl;return 0;
}

相关文章:

C++ 封装的用法

C(七)封装 封装&#xff0c;可以达到&#xff0c;对外提供接口&#xff0c;屏蔽数据&#xff0c;对内开放数据。 权限控制 struct 中所有行为和属性都是 public 的(默认)&#xff0c;此举也是为了 C兼容 C 语言&#xff0c; 因为 C 语言中没有权限的概念。 C中的 class 可以…...

【C++11:异常】

目录 抛异常标准书写格式 抛异常如何执行&#xff1f; 指定抛出异常类型&#xff1a; noexcept 关键字&#xff1a;throw 抛异常标准书写格式 抛异常如何执行&#xff1f; 当212行的异常被抛出&#xff0c;程序会重新返回函数func中&#xff0c;在函数中去寻找catch 语句的…...

Dify中HTTP请求节点的常见操作

HTTP节点包括API请求类型&#xff08;GET、POST、HEAD、PATCH、PUT、DELETE&#xff09;&#xff0c;鉴权类型&#xff08;无、API-Key基础、API-Key Bearer、API-Key自定义&#xff09;&#xff0c;HEADERS键值设置&#xff0c;PARAMS键值设置&#xff0c;BODY&#xff08;non…...

《大语言模型(赵鑫)》知识框图

...

【Android】性能实践—编码优化与布局优化学习笔记

编码优化 使用场景 如果需要拼接字符串&#xff0c;优先使用StringBuffer和StringBuilder进行凭借&#xff0c;他们的性能优于直接用加号进行拼接&#xff0c;因为使用加号连接符会创建多余的对象一般情况下使用基本数据类来代替封装数据类型&#xff08;比如int优于Integer&…...

如何合规与安全地利用专业爬虫工具,构建企业数据竞争优势

摘要&#xff1a; 本文深入探讨了在当今大数据时代&#xff0c;企业如何通过合规且安全的方式运用专业爬虫工具&#xff0c;有效收集并分析海量信息&#xff0c;进而转化为企业独有的数据优势。我们不仅会介绍最佳实践&#xff0c;还会讨论关键技术和策略&#xff0c;帮助企业…...

自动驾驶三维车道线检测系列—OpenLane数据集介绍

文章目录 1. 背景介绍2. OpenLane数据集详细描述2.1 数据集特点2.2 坐标系定义 3. 使用方法4. 结论 1. 背景介绍 自动驾驶技术的发展日新月异&#xff0c;而3D车道感知是其核心之一。本文将深入介绍OpenLane数据集——迄今为止规模最大、最接近真实世界的3D车道数据集。我们将…...

CMakeList学习笔记

设置项目&#xff1a;project project(planning VERSION 1.0.0 LANGUAGES CXX) # 项目的名字 版本 1.1.0 编程语言 CXX 设置包含目录&#xff1a;include_directories、targer_include_directories 设置编译类型&#xff1a;add_executable、add_library add_executable(demo d…...

将git默认的编辑器设置为vin

git默认编辑器现状 如下&#xff0c;很多linux发行版&#xff0c;未加修改的情况下&#xff0c;git的默认编辑器使用起来不太方便 Signed-off-by: root <rootxxx.COM># Please enter the commit message for your changes. Lines starting # with # will be ignored, a…...

ros2_control 6 自由度机械臂

系列文章目录 前言 ros2_control 是一个实时控制框架&#xff0c;专为普通机器人应用而设计。标准的 c 接口用于与硬件交互和查询用户定义的控制器命令。这些接口增强了代码的模块化和与机器人无关的设计。具体的应用细节&#xff0c;例如使用什么控制器、机器人有多少个关节以…...

Python 在自动化中的实际应用:用 Python 简化繁琐任务

文章目录 1、概述2、自动化文件和目录管理3.数据处理与分析4.网页爬虫5. 系统管理6。定时任务7.结语 1、概述 这篇文章将深入探讨Python在自动化中的实际应用&#xff0c;帮助您用Python简化繁琐任务。 我们将从多个方面入手&#xff0c;展示如何利用Python进行文件管理、数据…...

解释 Spring 框架的核心模块(如 IoC 容器、AOP )及其工作原理。描述如何使用 Spring Boot 快速搭建一个 RESTful Web服务?

Spring框架是一个广泛使用的Java企业级应用程序开发框架&#xff0c;它提供了一系列的模块来帮助开发者构建健壮、可测试、可维护的应用程序。 其中&#xff0c;最核心的模块包括IoC容器和AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;。 …...

数据分析详解

一、数据分析教程 1. 入门教程 在线课程&#xff1a;如Coursera、Udemy、网易云课堂等平台提供了大量数据分析的入门课程&#xff0c;涵盖统计学基础、Python/R语言编程、数据可视化等内容。书籍推荐&#xff1a;《Python数据分析实战》、《R语言实战》等书籍是数据分析入门的…...

SpringCloud之@FeignClient()注解的使用方式

FeignClient介绍 FeignClient 是 Spring Cloud 中用于声明一个 Feign 客户端的注解。由于SpringCloud采用分布式微服务架构&#xff0c;难免在各个子模块下存在模块方法互相调用的情况。比如订单服务要调用库存服务的方法&#xff0c;FeignClient()注解就是为了解决这个问题的…...

20.rabbitmq插件实现延迟队列

问题 前面谈到基于死信的延迟队列&#xff0c;存在的问题&#xff1a;如果第一个消息延时时间很长&#xff0c;而第二个消息延时时间很短&#xff0c;第二个消息并不会优先得到执行。 下载插件 地址&#xff1a;https://github.com/rabbitmq/rabbitmq-delayed-message-excha…...

TS如何处理js模块的类型?

现在很多插件都直接用ts开发了&#xff0c;本身包含了类型定义常见的第三方插件&#xff0c;都有’types/xxx’包&#xff0c;安装即可使用其他的&#xff0c;可通过declare module定义类型 比如&#xff1a; // someModule.js export function greet(name) {return Hello, $…...

GPS定位系统(VUE框架)

源码下载&#xff1a;小宅博客网 博主之前写的《GPS定位系统&#xff08;MVC框架&#xff09;》版本&#xff0c;并没有做到前后端分离&#xff0c;不太适合多人协作开发&#xff0c;这边博主分享一个基于asp.net web api vue3的GPS定位系统框架&#xff0c;本框架继承了MVC框…...

分布式光伏并网AM5SE-IS防孤岛保护装置介绍——安科瑞 叶西平

产品简介 功能&#xff1a; AM5SE-IS防孤岛保护装置主要适用于35kV、10kV及低压380V光伏发电、燃气发电等新能源并网供电系统。当发生孤岛现象时&#xff0c;可以快速切除并网点&#xff0c;使本站与电网侧快速脱离&#xff0c;保证整个电站和相关维护人员的生命安全。 应用…...

神奇的方法解决Navicat闪退

原因 打开Navicat操作上面的工具等就会闪退&#xff0c;原因竟然是屏幕划词&#xff01;&#xff01;&#xff01; 解决方法 看别人提到有道词典的划词功能的原因 我没有安装有道词典&#xff0c;但我安装豆包&#xff0c;它也有划词翻译的功能&#xff0c;关闭即可...

openmv学习笔记(24电赛笔记)

感光元件 openmv采用小孔摄像模式&#xff0c;将图像映射到感光原件上面&#xff0c;来传递图片&#xff0c;通过图片快速的刷新行成视频&#xff0c;在IDE中通过对感光原件的编辑可以控制视频的效果。 重置感光元件到默认状态 import sensor #导入感光元件这个库sensor.res…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...