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

C++ primer plus 类和对象

目录​​​​​​​

前言

一  接口的设计

二  方法的设计和使用

三  构造函数

 四  析构函数

五  析构函数和构造函数小结

总结


前言

前面已经描述了很多有关于类和对象的知识了,所以我们直接开始上手操作


一  接口的设计

首先我们要知道什么是接口
接口是一个共享框架,供两个系统(如在计算机和打印机之间或者用户或计算机程序之间)交互时使 用;例如,用户可能是您,而程序可能是字处理器。 使用字处理器时,您不能直接将脑子中想到的词传输 到计算机内存中,而必须同程序提供的接口交互
您打键盘时,计算机将字符显示到屏幕上;您移动鼠标时,计算机移动屏幕上的光标;您无意间单击鼠标时,计算机对您输入的段落进行奇怪的处理。 程序接 口将您的意图转换为存储在计算机中的具体信息。 对于类,我们说公共接口。 在这里,公众 (public) 是使用类的程序,交互系统由类对象组成,而接口由编写类的人提供的方法组成。接口让程序员能够编写与类对象交互的代码,从而让程序能够使用类对象。 例如,要计算stnng对象中包含多少个字符,您无需打开对象,而只需使用 stríng 类提供的 size()方法。 类 设计禁止公共用户直接访问类,但公众可以使用方法size()。 方法size()是用户和 string类对象之间的公共接口的组成部分。 通常,方法getline()是 istream 类的公共接口的组成部分,使用 cin 的程序不是直接与 cin 对象内部交互来读取一行输入,而是使用 getline()。 如果希望更人性化,不要将使用类的程序视为公共用户,而将编写程序的人视为公共用户。 然而,要使用某个类,必须了解其公共接口,要编写类,必须创建其公共接口

通常, C++程序员将接口(类定义)放在头文件中,并将实现(类方法的代码〉放在源代码文件中
我们要养成一个习惯,为了区分,我们类的首字母是需要大写的,接口往往就是我们设计在public里的函数,然后通过这个可以间接访问到里面private里面私密变量

下面我们就来设计一个接口

#ifndef __COOL__H__
#define __COOL__H__#include<string>class Stock {
private:std::string company;long shares;long share_vale;long total_vale;void set_tot() {total_vale = shares * share_vale;}public:void acquire(const std::string& co, long n, double pr);void buy(long num, double price);void sell(long num, double price);void updata(double price);void show();
};#endif

以上是我在cool.h里设计的一个类
那么这里的public的意思就是公用的,也就是说可以在外部进行访问
关键字publlc标识组成类的公共接口的类成员(抽象)
private就是私密的,也就是只有类里面才可以进行访问,外部是访问不到的

这个里面的数据是隐藏的
数据隐藏不仅可以防止直接访问数据,还让开发者(类的用户)无需了解数据是如何被表示的。例如, show( )成员将显示某支股票的总价格(还有其他内容),这个值可以存储在对象中(上述代码正是这样做 的),也可以在需要时通过计算得到。从使用类的角度看,使用哪种方法没有什么区别。 所需要知道的只是 各种成员函数的功能:也就是说,需要知道成员函数接受什么样的参数以及返回什么类型的值原则是将实现细节从接口设计中分离出来。如果以后找到了更好的、实现数据表示或成员函数细节的方法,可以对 这些细节进行修改,而无需修改程序接口,这使程序维护起来更容易

其实C++如果你没有设置他是public还是private的话,那么就是默认是private,只是我们在平时编写代码的时候要养成好的习惯,这样也可以增加可读性

在C++里面结构体也是可以使用方法的也就是放入函数,但是与类不一样的地方就是,结构体无论是什么数据还是方法都是公开的,但是class可以设置公开与隐藏
 

当我们在private里面设置了一个函数,这个函数就是一个内联函数,但是下面public不是内联函数,那个只是一个接口,而不是一个内联函数,如果你想把他编程内联函数的话,那么就直接在编写函数

二  方法的设计和使用

#include<iostream>
#include"cool.h"//表示公司首次购买股票
void Stock::acquire(const std::string& co, long n, double pr) {company = co;if (n < 0) {std::cout << "Number of shares can't be negative;"<< company << "shares set to 0.\n";shares = 0;}else {shares = n;share_vale = pr;set_tol();}
}//增加股票
void Stock::buy(long num, double price) {if (num > 0) {std::cout << "Number of shares can't be negative;"<< "Transaction is aborted.\n";}else {shares += num;share_vale = price;set_tol();}
}//减少股票
void Stock::sell(long num, double price) {using std::cout;if (num < 0) {std::cout << "Number of shares can't be negative;"<< "Transaction is aborted.\n";}else if (num > shares) {cout << "You can't sell more than you have!"<< "Transaction is aborted.\n";}else {shares -= num;share_vale = price;set_tol();}
}//更新
void Stock::update(double price) {share_vale = price;set_tol();
}//展示
void Stock::show() {std::cout << "compay: " << company<< "shares:" << shares << '\n'<< "share price: $" << share_vale<< "total worth: $" << total_vale << '\n';
}

 这个就是我们根据类来进行编写这个成员函数,这个成员函数是可以简介访问private里的值的
 

接下来就是书写就是这个使用这个方法

#include<iostream>
#include"cool.h"
using namespace std;int main() {Stock cat;cat.acquire("zhang", 1, 19.25);cat.show();cat.buy(3, 19.23);cat.show();cat.sell(1, 20);cat.show();return 0;
}

一般来说数据是放到private里,public一般放的是方法 

三  构造函数

1  构造函数
由于我们很多变量都是需要初始化的,比如我们定义一个变量要对他进行初始化,但是再类里面,我们要对private里面的变量进行初始化,我们通过直接的访问进行初始化肯定是不行的,但是我们可以通过函数来进行修改,我们知道public是可以间接访问到private里面的变量的

就比如我们上面有一个函数

void Stock::acquire(const std::string& co, long n, double pr) {company = co;if (n < 0) {std::cout << "Number of shares can't be negative;"<< company << "shares set to 0.\n";shares = 0;}else {shares = n;share_vale = pr;set_tol();}
}

但是这个不是构造函数,这个只是其中的一个成员函数
那么我们要怎么改写成构造函数
1  构造函数无返回值
2  函数名字与类的名字相同
3  形参的名字不可以跟private赋值的成员变量的名字一样

//表示公司首次购买股票
Stock::Stock(const std::string& co, long n, double pr) {company = co;if (n < 0) {std::cout << "Number of shares can't be negative;"<< company << "shares set to 0.\n";shares = 0;}else {shares = n;share_vale = pr;set_tol();}
}声明
Stock(const std::string& co, long n, double pr);

对于名称的设置



这样我们就得到了一个构造函数,但是我们要怎么使用这个构造函数呢?
使用构造函数的方式有两个
1  显式使用构造函数
2  隐式使用构造函数


1  显式  Stock food = Stock("World Cabbage" , 250 , 1.25 );
2  隐式  Stock garmnent ("Furry Mason", 50 , 2.5) ;  
等同于Stock garment = Stock(" Furry Mason" , 50 , 2.5));
每次创建类对象(甚至使用new动态分配内存)时C++都使用类构造函数。下面是将构造函数与new 一起使用的方法: Stock *pstock = new Stock("Electroshock Games ", 18 , 19 .0);

2  默认构造函数
当我们类里面没有写构造函数的话,那么编译器是会给类一个默认构造函数,但是编译器给的默认构造函数里面是空的,什么都没有,就像下面这个例子一样
Stock: :Stock() { }

我们该怎么创建构造函数呢?
下面有两个方法
方法一:基于上述构造函数在函数的声明里面加入默认值

Stock(const std::string& co = "no name", long n = 0, double pr = 0);

 这样我们就可以设置默认值了

方法二:写一个没有任何参数的默认构造函数
这个是通过函数的重载写的,由于只能有一个默认构造函数,因此不要同时采用这两种方式

我们需要区分默认构造和构造,还要学会使用构造 

 构造函数的陷阱
首先我们创建一个构造函数的时候,则编译器不会再给我提供默认构造函数,所以当我们创建一个变量,没有调用自定义的构造函数将变量进行初始化的话,那么就会报错,因为没有初始值

 四  析构函数

当我们在使用完类的时候,我们的对象是需要"释放"的
就比如我们在写了一个角色的时候,角色的重生是利用构造函数,角色的死亡是利用析构函数
当我们在没有写析构函数的时候,计算机是会给我们默认析构函数,这个默认的析构函数就类似于我们默认的构造函数,这个编译器是空的参数列表并且代码块是空的,如果我们用默认构造函数去用new创建一个对象,然后我们就使用析构函数使用delete来释放这个new释放的对象

析构函数是无返回值和没有类型的声明的

什么时候调用析构函数呢?
这个是由我们编译器决定的
如果是静态的,析构函数是在程序结束的时候被调用
如果是自动的,析构函数是在这个代码块执行完被调用
如果是new创建的,析构函数是在delete释放之后被调用

我们来改进一下我们之前的代码,加入我们的析构函数
首先我们更改一下我们的头文件

#ifndef __COOL__H__
#define __COOL__H__#include<string>class Stock {
private:std::string company;long shares;long share_vale;long total_vale;void set_tol() {total_vale = shares * share_vale;}public:Stock(const std::string& co = "no name", long n = 0, double pr = 0);~Stock();void buy(long num, double price);void sell(long num, double price);void update(double price);void show();
};#endif

工具函数 

#include<iostream>
#include"cool.h"//表示公司首次购买股票
Stock::Stock(const std::string& co, long n, double pr) {company = co;if (n < 0) {std::cout << "Number of shares can't be negative;"<< company << "shares set to 0.\n";shares = 0;}else {shares = n;share_vale = pr;set_tol();}
}Stock::~Stock() {std::cout << "bey bey" << std::endl;
}//增加股票
void Stock::buy(long num, double price) {if (num < 0) {std::cout << "Number of shares can't be negative;"<< "Transaction is aborted.\n";}else {shares += num;share_vale = price;set_tol();}
}//减少股票
void Stock::sell(long num, double price) {using std::cout;if (num < 0) {std::cout << "Number of shares can't be negative;"<< "Transaction is aborted.\n";}else if (num > shares) {cout << "You can't sell more than you have!"<< "Transaction is aborted.\n";}else {shares -= num;share_vale = price;set_tol();}
}//更新
void Stock::update(double price) {share_vale = price;set_tol();
}//展示
void Stock::show() {std::cout << "compay: " << company << " "<< "shares:" << shares << '\n'<< " share price: $" << share_vale<< " total worth: $" << total_vale << '\n';
}

主函数

#include<iostream>
#include"cool.h"
using namespace std;int main() {Stock cat("cat", 10, 100.19);cat.show();Stock dog("dog", 5, 105.19);dog.show();
}

然后我们就直接写好了,我们运行一下看看结果是什么

我们可看到这个结果这个dog是在上面的,但是这个cat是在下面的,这就说明了这个对象的存储是按照栈的顺序进行存储的

在C++11 中,可将列表初始化语法用于类吗?
可以,只要提供与某个构造函数的参数列表匹配的内容, 并用大括号将它们括起:

Stock hot_tip = {"erivatives Plus Plus", 100, 45 .0}; 
Stock j ock {" Sport Age Storage, Inc" }; 
Stock temp {}; 

 这种方法不推荐,但是要知道有这个方式

const成员函数
下面我们来看一个样例

const Stock land = Stock("Kludgehorn Properties") ; 
land.show () ;

这个是不被允许的,为什么?因为我们这个成员是const的常量,然后我们来看看我们show函数里面的代码

void Stock::show() {std::cout << "compay: " << company << " "<< "shares:" << shares << '\n'<< " share price: $" << share_vale<< " total worth: $" << total_vale << '\n';
}

 其实这个代码里面并没有常量指针进行接受,或者常量引用来进行接受,那么就会导致编译器认为,你这个是不安全的,不可以保护company这个常量,所以就会报错,因为编译器认为不安全

这个时候我们除了用const指针和const引用的方法,还有一个方法就是在这个函数的末尾加上const来进行表示

void show () const; 
/ / promises not to change invoking object void stock::show() const 
/ / promises not to change invoking object 

我们在函数的声明和函数的末尾都需要加上const来承诺这个是不可以改变的
以这种方式声明和定义的类函数被称为 const成员函数。就像应尽可能将const引用和指针用作函数形 参一样,只要类方法不修改调用对象,就应将其声明为 const,这种方式被称为常量成员函数

五  析构函数和构造函数小结

下面我们来小结一下结构函数和析构函数

结构函数
结构函数的名字和类的名字是一样的,前面也要记得加上类名字和作用域
首先结构函数分为结构函数和默认结构函数

结构函数就是我们自定义的,需要传参数进行初始化赋值的,如果我们创建了之后,编译器就不会出现再给我们提供默认构造函数了,如果你不调用进行初始化,那么就会报错,报错为找不到默认函数,所以我们创建了就要进行初始化
1  显式  Stock food = Stock("World Cabbage" , 250 , 1.25 );
2  隐式  Stock garmnent ("Furry Mason", 50 , 2.5) ;  

默认构造函数
默认构造函数就是我们不进行传参数,然后直接进行赋值
默认构造函数是只有隐式
1  隐式  就是定义变量就好了,为什么没有显示,上面有

析构函数
析构函数就是我们需要注意它的存储方式
还有就是析构函数就是我们需要注意传参是const的时候,再函数声明和函数加上const的,或者需要利用常量引用和常量指针

如果我们只有一个参数的时候,我们可以直接这么初始化

Bozo FUFU = 32

直接用等于号


总结

我们学习了怎么设计类,头文件应该放什么,方法应该放到哪里,还有就是析构函数和构造函数需要注意的

相关文章:

C++ primer plus 类和对象

目录​​​​​​​ 前言 一 接口的设计 二 方法的设计和使用 三 构造函数 四 析构函数 五 析构函数和构造函数小结 总结 前言 前面已经描述了很多有关于类和对象的知识了&#xff0c;所以我们直接开始上手操作 一 接口的设计 首先我们要知道什么是接口 接口是一个…...

k8s 修改节点驱逐阈值

编辑 /var/lib/kubelet/config.yaml 文件 kind: KubeletConfiguration evictionHard:nodefs.available: "5%" # 降低磁盘压力触发阈值imagefs.available: "10%" # 调整容器镜像存储触发阈值nodefs.inodesFree: "3%...

HiPixel开源AI驱动的图像超分辨率的原生macOS 应用程序,使用 SwiftUI 构建并利用 Upscayl 强大的 AI 模型

一、软件介绍 文末提供程序和源码下载 HiPixel是一个开源程序基于SwiftUI构建的macOS原生应用程序&#xff0c;用于AI驱动的图像超分辨率&#xff0c;并利用Upscayl的强大AI模型。 二、软件特征 具有 SwiftUI 界面的原生 macOS 应用程序使用 AI 模型进行高质量图像放大通过 G…...

使用 .NET Core 实现 RabbitMQ 消息队列的详细教程

RabbitMQ 是一个流行的消息队列中间件&#xff0c;它允许应用程序通过异步消息的方式进行通信。RabbitMQ 支持 AMQP 协议&#xff0c;可以通过多种方式与应用程序交互。在本教程中&#xff0c;我们将深入探讨如何在 .NET Core 环境中使用 RabbitMQ 来实现消息队列。我们将学习如…...

深度学习——同一台电脑使用ssh配置多个github账号

如果一台电脑只有一个github账号&#xff0c;那么进行默认的ssh配置&#xff0c;通过git拉取和提交代码即可&#xff0c;但在实际的工作中&#xff0c;有时候需要在一台电脑登录多个github账号&#xff0c;将不同的项目代码提交到不同的github账号&#xff0c;这个时候如果仅仅…...

windows常用cmd命令

Windows 命令提示符&#xff08;CMD&#xff09;提供了许多实用的命令&#xff0c;用于管理文件、目录、网络、系统配置等。以下是一些常用的 CMD 命令及其用途&#xff1a; 文件和目录操作 dir: 列出当前目录下的文件和子目录。 dircd: 切换当前目录。 cd C:\Users cd .. # 返…...

C语言中的流程控制语句

一.流程控制语句的分类&#xff1a; 1.顺序结构 概念&#xff1a;从上往下依次执行&#xff0c;也是程序默认的执行顺序 2.分支结构 概念&#xff1a;程序在执行的过程中出现了岔路&#xff08;我们只能选择一条支线进行执行&#xff09; &#xff08;1&#xff09;.if语句…...

C语言【数据结构】:理解什么是数据结构和算法(启航)

引言 启航篇&#xff0c;理解什么是数据结构和算法 在 C 语言编程领域&#xff0c;数据结构和算法是两个核心且紧密相关的概念 一、数据结构 定义 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合&#xff08;比如数组&#xff09;&#xff0c;它是组织和存储数…...

WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)深度解析与实战复现

0x00 漏洞概述 CVE-2017-10271 是Oracle WebLogic Server WLS Security组件中的远程代码执行漏洞。攻击者通过构造恶意XML请求&#xff0c;利用XMLDecoder反序列化机制绕过安全验证&#xff0c;最终实现服务器权限接管。 影响版本 WebLogic 10.3.6.0WebLogic 12.1.3.0WebLog…...

【动态规划篇】746.使用最小花费爬楼梯

746.使用最小花费爬楼梯 题目链接&#xff1a; 746.使用最小花费爬楼梯 题目叙述&#xff1a; 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 …...

类和对象:

1. const运算符重载&#xff1a; 1. const成员函数&#xff1a; 我们来看我们的下面的代码&#xff1a; 我们来看这个&#xff0c;我们的对象使用const进行修饰&#xff0c;然后我们对象d1调用我们的成员函数&#xff0c;然后我们取d1的地址然后传过去&#xff0c;这时候我们的…...

研究整除的性质——最大公约数(GCD)和最小公倍数(LCM)

最大公约数&#xff08;GCD&#xff09;和最小公倍数&#xff08;Least Common Multiple&#xff0c;LCM&#xff09;研究整除的性质&#xff0c;非常古老&#xff0c;在2000多年前就得到了很好的研究。由于简单易懂&#xff0c;有较广泛的应用&#xff0c;它们是竞赛中频繁出现…...

jenkins 配置邮件问题整理

版本&#xff1a;Jenkins 2.492.1 插件&#xff1a; A.jenkins自带的&#xff0c; B.安装功能强大的插件 配置流程&#xff1a; 1. jenkins->系统配置->Jenkins Location 此处的”系统管理员邮件地址“&#xff0c;是配置之后发件人的email。 2.配置系统自带的邮件A…...

FastAPI复杂查询终极指南:告别if-else的现代化过滤架构

title: FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 date: 2025/3/14 updated: 2025/3/14 author: cmdragon excerpt: 本文系统讲解FastAPI中复杂查询条件的构建方法,涵盖参数验证、动态过滤、安全防护等18个核心技术点。通过引入策略模式、声明式编程等技术,彻…...

MySQL行列转化

初始化表结构&#xff1a; CREATE TABLE student_scores (student_id int NOT NULL,student_name varchar(50) DEFAULT NULL,math_score int DEFAULT NULL,english_score int DEFAULT NULL,science_score int DEFAULT NULL,PRIMARY KEY (student_id) ) ENGINEInnoDB DEFAULT C…...

施磊老师c++(六)

继承与多态-多重继承 文章目录 继承与多态-多重继承1.虚基类和虚继承本节内容 2.菱形继承---怎么解决?本节内容**面试问题: 怎么理解多重继承的?**---重点 3.c提供的四种类型转换本节内容 1.虚基类和虚继承 本节内容 多重继承? 代码复用, 一个派生类 有多个基类 抽象类—有…...

c++:AVL树

1.概念 由于二叉搜索树不能确保为近似完全二叉树的结构&#xff0c;节点相同的情况下&#xff0c;高度可能会很高&#xff0c;高度有可能会很低&#xff0c;所以搜索次数不能稳定维持在logn级别。我们在二叉搜索树的基础上进行平衡调整就可以控制搜索次数稳定在logn级别。 而AV…...

HTML编辑MP4保存名称

上图是HTML的界面&#xff0c;需要点击EDIT_MP4的选项&#xff0c;然后就出现文本框输入MP4名称。输入对应的MP4文件名称后&#xff0c;则点击Add_MP4按钮就可以把MP4的名称修改到json文件里面&#xff0c;json文件是network_detail.json文件。 HTML和CGI程序的交互 上图是htm…...

以太坊AI代理与PoS升级点燃3月市场热情,2025年能否再创新高?

币热网深度报道&#xff1a;以太坊AI代理与PoS升级引爆3月热潮&#xff0c;2025年能否再攀历史新高&#xff1f; 原文来源&#xff1a;币热网 - 区块链信息资讯平台 以太坊升级&#xff0c;市场热情高涨 近期&#xff0c;以太坊市场犹如被一股神秘力量点燃&#xff0c;掀起了…...

IDEA2024又一坑:连接Docker服务连不上,提示:Cannot run program “docker“: CreateProcess error=2

为新电脑安装了IDEA2024版&#xff0c;因为局域网中安装有Docker,所以这台电脑上没有安装&#xff0c;当运行时发现死活连不上Docker报&#xff1a;Cannot run program “docker“: CreateProcess error2 分析&#xff1a; Docker服务有问题 其它电脑都能连&#xff0c;排除 网…...

css基本功

为什么 ::first-letter 是伪元素&#xff1f; ::first-letter 的作用是选择并样式化元素的第一个字母&#xff0c;它创建了一个虚拟的元素来包裹这个字母&#xff0c;因此属于伪元素。 grid布局 案例一 <!DOCTYPE html> <html lang"zh-CN"><head&…...

ALSA vs OSS:Linux 音频架构的演变与核心区别

在 Linux 音频系统的发展过程中&#xff0c;OSS&#xff08;Open Sound System&#xff09; 和 ALSA&#xff08;Advanced Linux Sound Architecture&#xff09; 曾分别在不同阶段承担着音频管理的角色。OSS 是 Linux 早期的音频架构&#xff0c;而 ALSA 作为其继任者&#xf…...

双指针算法介绍+算法练习(2025)

一、介绍双指针算法 双指针&#xff08;或称为双索引&#xff09;算法是一种高效的算法技巧&#xff0c;常用于处理数组或链表等线性数据结构。它通过使用两个指针来遍历数据&#xff0c;从而减少时间复杂度&#xff0c;避免使用嵌套循环。双指针算法在解决诸如查找、排序、去重…...

第八节:红黑树(初阶)

【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red和 Black 。 通过对 任何…...

【C++标准库类型】深入理解C++中的using声明:从基础到实践

目录 一、using声明基础 1.1 基本语法形式 1.2 典型应用场景 1.3 作用域规则 二、关键注意事项 2.1 命名冲突处理 2.2 头文件使用规范 2.3 与typedef的对比 三、面向对象中的应用 3.1. 解除派生类名称隐藏&#xff08;核心应用&#xff09; 3.2. 构造函数继承&#…...

蓝桥杯2024年第十五届省赛真题-回文数组

题目描述 小蓝在无聊时随机生成了一个长度为 n 的整数数组&#xff0c;数组中的第 i 个数为ai&#xff0c;他觉得随机生成的数组不太美观&#xff0c;想把它变成回文数组&#xff0c;也是就对于任意i ∈ [1, n] 满足 ai an−i1 。小蓝一次操作可以指定相邻的两个数&#xff0c…...

多数元素——面试经典150题(力扣)

题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&#xff1a;3 …...

QT中委托QStyledItemDelegate的使用

目录 一、子类化委托 二、委托方法实现 1)createEditor 2)setEditorData 3)setModelData 4)updateEditorGeometry 三、委托使用 四、总结 Qt的数据容器控件采用模型/视图(model/view)架构设计。模型用于存放控件的数据,视图则用于显示编辑数据,而委托则是…...

android 调用wps打开文档并感知保存事件

需求场景 在项目开发中会碰到需要调用WPS打开Word,Excel,Ppt等Office系列文档的情况&#xff0c;网上目前少有正式介绍如何调用相关API打开文档&#xff0c;并实现文档编辑后回传给三方应用&#xff0c;本人在逛WPS社区时发现 解锁WPS二次开发新世界&#xff1a;Android开发用…...

前端 Webpack 面试题

1、什么是 Webpack?它有什么作用? Webpack 是一个前端资源打包工具,用于将 JavaScript、CSS、图片等项目资源进行模块化管理和打包。它能够将复杂的项目结构转化为浏览器友好的代码,提高前端项目的开发效率和性能。 模块打包:Webpack 将项目中的各个模块及依赖打包成一个…...

05延迟任务精准发布文章(redis实现延迟任务、分布式锁)

上架不代表发布(需要发布app端才会显示文章&#xff09; 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间 延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在…...

十六、从零搭建一个 Vue 3 后台管理系统:完整实战教程

Vue 3 作为当下最为流行的前端框架之一&#xff0c;凭借其简洁的 API 以及强大的性能&#xff0c;已然成为构建后台管理系统的首选工具。本文将一步一步地引导你从零开始搭建一个 Vue 3 后台管理系统&#xff0c;内容涵盖路由、权限管理、状态管理等核心功能&#xff0c;并且会…...

never_give_up

一个很有意思的题&#xff1a; never_give_up - Bugku CTF平台 注意到注释里面有1p.html&#xff0c;我们直接在源代码界面看&#xff0c;这样就不会跳转到它那个链接的&#xff1a; 然后解码可得&#xff1a; ";if(!$_GET[id]) {header(Location: hello.php?id1);exi…...

DeepSeek结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)转载

思维速览&#xff1a; 本文将详细介绍如何利用DeepSeek结合Mermaid语法绘制各类专业图表&#xff0c;帮助你提高工作效率和文档质量。 ▍DeepSeek入门使用请看&#xff1a;deepseek保姆级入门教程&#xff08;网页端使用 本地客户端部署 使用技巧&#xff09; DeepSeek官网…...

「基于大模型的智能客服系统」语义理解、上下文记忆与反馈机制设计

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

【后端】【django】导出 API 文档的几种方法

在 Django 项目里&#xff0c;导出 API 文档是很常见的需求&#xff0c;一般可以借助第三方库来实现。 使用 drf-yasg 导出 Swagger/OpenAPI 格式文档 drf-yasg 是一个用于 Django REST framework 的工具&#xff0c;能够自动生成 Swagger 和 OpenAPI 格式的 API 文档。 步骤…...

【HarmonyOS Next之旅】DevEco Studio使用指南(二)

目录 1 -> 工程模板介绍 2 -> 创建一个新的工程 2.1 -> 创建和配置新工程 2.1.1 -> 创建HarmonyOS工程 2.2.2 -> 创建OpenHarmony工程 1 -> 工程模板介绍 DevEco Studio支持多种品类的应用/元服务开发&#xff0c;预置丰富的工程模板&#xff0c;可以根…...

鸿蒙Next开发与实战经验总结

文章目录 1. 鸿蒙Next概述与开发环境搭建1.1 鸿蒙Next的核心特性1.2 开发环境搭建与工具链安装步骤工具链 1.3 第一个鸿蒙Next应用代码示例流程图 2. 鸿蒙Next应用架构与设计模式2.1 应用架构解析2.2 常用设计模式2.3 组件化开发实践 3. UI开发与布局系统3.1 基础UI组件3.2 布局…...

uniapp实现 uview1 u-button的水波纹效果

说明&#xff1a; 由于uview2已经移除水波纹效果&#xff0c;这边又觉得那个效果好看&#xff0c;所以开发这个功能(原谅我不会录动图) 效果&#xff1a; 具体代码&#xff1a; <view class"ripple-container" touchstart"handleTouchStart" touchend&…...

Linux练级宝典->任务管理和守护进程

任务管理 进程组概念 每个进程除了进程ID以外&#xff0c;还有一个进程组&#xff0c;进程组就是一个或多个进程的集合 同一个进程组&#xff0c;代表着他们是共同作业的&#xff0c;可以接收同一个终端的各种信号&#xff0c;进程组也有其唯一的进程组号。还有一个组长进程&a…...

金融行业替换传统的FTP传输系统的必要性

在如今这个数字化飞速发展的时代&#xff0c;金融行业对于信息安全性和数据传输效率的要求简直高得离谱。可是呢&#xff0c;你可能想不到&#xff0c;很多金融机构竟然还在用传统的FTP&#xff08;文件传输协议&#xff09;来处理日常的数据交换。 FTP在过去几十年里确实是网络…...

C# backgroundworker类(后台线程)

概念 在C#程序中&#xff0c;经常会有一些耗时较长的CPU密集型运算&#xff0c;如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题。解决这类问题的主要途径是使用多线程&#xff0c;启动一个后台线程&#xff0c;把运算操作放在这个后台线程中完成。但是原生接口的线程…...

OpenAI智能体初探:使用 OpenAI Responses API 在 PDF 中实现检索增强生成(RAG)

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 欢迎关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! 引子 在信息爆炸的时代,从大量 PDF 文档中快速准确地检索信息…...

SqlServer数据库报错紧急或可疑无法访问的修复过程,亲测有效。

当 SQL Server 数据库被标记为 SUSPECT 状态时&#xff0c;表示数据库可能由于事务日志损坏、数据文件丢失或其他严重问题而无法正常启动。以下是一个详细的恢复步骤&#xff0c;基于搜索结果中的信息和常见的最佳实践&#xff1a; 恢复步骤 1. 确认数据库状态 将database-n…...

12.31[net]review

复用&#xff08;Multiplexing&#xff09;的概念 定义&#xff1a;在传输层&#xff0c;复用是指多个应用进程可以使用同一个传输层协议&#xff08;如 TCP 或 UDP&#xff09;来发送数据。从应用层的角度看&#xff0c;不同的应用进程&#xff08;如网页浏览器、邮件客户端等…...

Redis超高并发分key实现

Redis扛并发的能力是非常强的&#xff0c;所以高并发场景下经常会使用Redis&#xff0c;但是Redis单分片的写入瓶颈在2w左右&#xff0c;读瓶颈在10w左右&#xff0c;如果在超高并发下即使是集群部署Redis&#xff0c;单分片的Redis也是有可能扛不住的&#xff0c;如下图所示&a…...

Houdini学习笔记

1. Houdini中一次只能显示一个物体 如果要都显示 需要 merge 节点 粉色的是 以参考显示 2.对任意一个节点按F1 可以弹出houdini官方文档 3. 恢复视角 Space H,居中 Space G 居中选中物体...

Ubuntu 22.04使用pigz多线程快速解压/压缩文件

最近搞项目&#xff0c;资料太大&#xff0c;解压时间太久&#xff0c;于是想办法解决。 开贴记录。 1.安装pigz sudo apt install pigz 2.解压资料 解压命令为 tar --use-compress-programpigz -xvpf ***.tar.gz 将最后的部分***.tar.gz换成你自己的文件即可 例如 ti…...

子数组问题——动态规划

个人主页&#xff1a;敲上瘾-CSDN博客 动态规划 基础dp&#xff1a;基础dp——动态规划-CSDN博客多状态dp&#xff1a;多状态dp——动态规划-CSDN博客 目录 一、解题技巧 二、最大子数组和 三、乘积最大子数组 四、最长湍流子数组 五、单词拆分 一、解题技巧 区分子数组&…...

汉桑科技IPO:潜藏两大风险 公众投资者权益或受损

冰山之所以危险&#xff0c;是因为只有八分之一在水面上。 ——语出小说家海明威。 引 言 野村证券提供的一份报告显示&#xff0c;2025年前两个月&#xff0c;我国出口同比增长仅有2.3%&#xff0c;与去年四季度9.9%的增长显著下滑。与此同时&#xff0c;从2月1日开始&a…...