C++:类和对象初识
C++:类和对象初识
- 前言
- 类的引入与定义
- 引入
- 定义
- 类的两种定义方法
- 1. 声明和定义全部放在类体中
- 2. 声明和定义分离式
- 类的成员变量命名规则
- 类的访问限定符及封装
- 访问限定符
- 封装
- 类的作用域与实例化
- 类的作用域
- 类实例化
- 实例化方式:
- 类对象模型
- 类对象的大小
- 存储方式
- this指针(重点)
- 引出
- 特性
- 深入理解
- 思考题?(重点中的重点)
- 解答情形1
- 解答情形2
- 原因分析
- 总结
前言
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
以我们洗衣服为例:
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
在面向对象编程(OOP)中,"类"和"对象"是最核心的概念。C++作为一门面向对象的语言,通过类和对象实现了数据抽象、封装、继承和多态等特性。理解类和对象的工作机制是掌握C++面向对象编程的关键。
类的引入与定义
引入
在C语言中,我们使用结构体(struct)来组织相关数据。C++在此基础上进行了扩展,允许结构体中不仅包含数据成员,还可以包含函数成员:
C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数。
//C++兼容C语言,同时C++中struct升级成了 类(具有类的所有特性)
struct _Stack {//成员方法void Init(int defaultCapacity = 4) {base = (int*)malloc(sizeof(int) * defaultCapacity);if (base == nullptr) {perror("malloc failed\n");return;}this->size = 0;this->capacity = defaultCapacity;}void Push() {//......}void Destroy() {free(this->base);this->base = nullptr;this->top = this->capacity;}//成员变量int* base;int top;int capacity;int size;
};
C++中结构体的名字,可以当成类名来使用。C++中的结构体具有class的所有功能(包括但不限于权限管理与this指针),只是成员的默认权限不同。
- 结构体中,
所有成员的默认访问权限是public
,结构体外可以直接访问 - C++的类中,
class所有成员的默认访问权限是private
, 不能再类外访问。
但更规范的C++做法是使用class关键字来定义类,它提供了更完善的访问控制机制。
定义
类定义的基本语法:
class className{// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
- class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
- 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
示例:
class Clock {
private: // 访问限定符int hour;int minute;int second;public:void setTime(int h, int m, int s);void showTime() {cout << hour << ":" << minute << ":" << second << endl;}
};
类的两种定义方法
1. 声明和定义全部放在类体中
例如该类:
class Clock {
private: // 访问限定符int hour;int minute;int second;public:void showTime() {cout << hour << ":" << minute << ":" << second << endl;}
};
- 声明和定义全部放在类体中,需注意:成员函数如果在类体中定义,编译器可能会将其当成内联函数处理。(相当于在函数前加上了
inline
关键字,建议编译器使其称为内联函数)
2. 声明和定义分离式
//Stack.h
class Stack {
public:void Init(int defaultCapacity = 4);//在类内定义的函数,会直接建议编译器让该函数称为内联函数,void Push() { //类内定义的函数,不管加不加 inline ,都相当于加上了 inline //.......此处省略}void Pop() {//.......}
private:int* base;int top;int capacity;
};
//Stack.cpp
//类的声明和定义分离,需要在函数名前面,加上类的作用域限定
void Stack:: Init(int defaultCapacity) { //缺省参数一般在 函数声明 给出base = (int*)malloc(sizeof(int) * defaultCapacity);capacity = defaultCapacity;top = 0;
}
需要注意的是:
声明定义分离式
,如果函数有默认参数,一般要在函数声明处给出类的默认参数
一般情况下,更期望采用第二种方式, 因为我们并不希望所有的函数都称为内联函数。
类的成员变量命名规则
我们看该类:
class Clock {
private: // 访问限定符int hour;int minute;int second;public:void setTime(int hour, int minute, int second){// 这里的hour到底是成员变量,还是函数形参?hour = hour;}
};
我们的疑问如注释中所写,为了避免这样的矛盾,我们通常这样定义类的成员变量。
private: // 访问限定符int _hour;int _minute;int _second;
public:void setTime(int hour, int minute, int second){// 这里的hour到底是成员变量,还是函数形参?_hour = hour;//这样就解决了分歧,避免了二义性。}
类的访问限定符及封装
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用
访问限定符
C++通过三个访问限定符实现封装:
public
:公有成员,类内外均可访问private
:私有成员,仅类内和友元可访问protected
:保护成员,介于两者之间(继承时使用)
特点:
public
修饰的成员在类外可以直接被访问。protected
和private
修饰的成员在类外不能直接被访问(此处protected和private是类似的)。- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
- 如果后面没有访问限定符,作用域就到}即类结束。
- class的默认访问权限为private,struct为public(因为struct要兼容C语言)。
- C++需要兼容C语言,所以C++中struct可以当成结构体使用。
- 另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。
- 注意:在继承和模板参数列表位置,struct和class也有区别,后序给大家介绍。
通常建议我们不要采用C++语法中的默认权限,不管是class还是struct,我们都应该手动控制访问权限。
封装
面向对象的三大特性:封装、继承、多态
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装是指将数据和操作数据的方法进行有机结合,并对外部隐藏实现细节。其优势体现在:
- 数据保护:通过私有化成员变量防止意外修改
- 接口统一:通过公有方法提供规范的操作方式
- 实现隔离:修改内部实现不影响外部使用
示例封装:
class BankAccount {
private:double balance; // 私有数据public:// 公开接口void deposit(double amount) {if(amount > 0) balance += amount;}bool withdraw(double amount) {if(amount <= balance) {balance -= amount;return true;}return false;}double getBalance() const { return balance; }
};
类的作用域与实例化
类的作用域
类定义了一个独立的作用域:
- 成员变量/函数的作用域在整个类体内(整个类内是一个整体)
- 外部访问需通过类名::成员或对象.成员
注意点:
- 如上文所讲,成员函数在类外定义时需要指定类域
void Clock::setTime(int h, int m, int s) {// 实现代码
}
我们可以对比一下各种作用域各有什么特点。
全局域
局部域
类作用域
命名空间域(使用时需要指定)
局部域和全局域会影响变量的生命周期, 类域和命名空间域不会影响生命周期
类实例化
用类类型创建对象的过程,称为类的实例化
- 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;
- 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
int main(){person._age = 100; // 编译失败:error C2059: 语法错误return 0;
}
Person类是没有空间的,只有Person类实例化出的对象才有具体的年龄。
做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
实例化方式:
Clock myClock; // 栈上分配
Clock* pClock = new Clock; // 堆上分配
new关键词我们将在后续讲解。
需要注意:
- 类声明不分配内存,实例化时才分配实际空间
- 同一类的不同对象拥有独立的成员变量存储空间
- 成员函数被所有对象共享(代码区存储)
类对象模型
类对象的大小
计算规则:
- 遵循结构体内存对齐原则
- 只计算成员变量大小(包括继承的)
- 空类大小为1字节(占位标识)
验证示例:
class Empty {};
class Data {int num; // 4字节double value; // 8字节char tag; // 1字节
};// 8 + 8 + 1 = 17 → vs下实际输出24(内存对齐)int main() {cout << sizeof(Empty) << endl;; // 输出1cout << sizeof(Data) << endl;; // 输出24
}
存储方式
类对象的存储采用分治策略:
- 成员变量:每个对象独立存储(栈区/堆区)
- 成员函数:所有对象共享代码区的一份拷贝
- 静态成员:存储在全局数据区
如图所示
这个模型在我们计算对象的大小时也有体现
:
- 对象中只存储成员变量。
- 成员函数存放在一个公共区域(成员函数不在对象内存储)
内存布局示例:
对象1: [成员变量区]
对象2: [成员变量区]
...
代码区: [成员函数]
结论:
- 一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐。
- 注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。
结构体内存对齐规则
//结构体内存对齐规则
//1. 第一个成员在与结构体偏移量为0的地址处。
//2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
//注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
//VS中默认的对齐数为8
//3. 结构体总大小为:最大对齐数(所有变量类型最大者 与 默认对齐参数 取较小的那个)的整数倍。
//4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
//体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
this指针(重点)
引出
我们先定义一个日期类
class Date{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout <<_year<< "-" <<_month << "-"<< _day <<endl;
}int main(){Date d1, d2;d1.Init(2025,1,11);d2.Init(2024, 2, 22);d1.Print();d2.Print();return 0;
}
对于上述类,有这样的一个问题:
Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
编译器隐式添加this指针参数:
// 编译器视角下的成员函数
//编译器编译后,会对成员函数进行处理,会给成员函数加上参数this, 访问变量时,使用this访问
void Init(Date* const this, int year, int month, int day){this->_year = year;this->_month = month;this->_day = day;}
void Print(Date* const this){cout <<this->_year<< "-" <<this->_month << "-"<< this->_day <<endl;
}int main(){Date d1, d2;//编译器视角下的函数调用,是编译器帮助我们传入的当前对象的地址d1.Init(&d1, 2025, 1, 11);d2.Init(&d2, 2024, 2, 22);d1.Print(&d1);d2.Print(&d2);return 0;
}
特性
- this指针的类型:
className* const
,const修饰指针本身,该指针不能被修改,也就是不能当左值。即成员函数中,不能给this指针赋值。 - 只能在“成员函数”的内部使用
- this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。正因如此,上文计算对象大小的时候并没有计算this指针。
- this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
- this指针在函数内部是要反复调用的, vs的编译器对this指针传递做了优化,对象地址放在ecx寄存器中,exc中存储this指针的值
- this指针是函数的形参,因此this指针存放在内存的栈区中
深入理解
思考题?(重点中的重点)
有如下类和代码,思考?
class TestThis {
public:void Print() {cout << "Print" << endl;}void PrintA() {cout << _A << endl;}
private:int _A;
};
void Test_This_1() {TestThis* p = nullptr;p->Print();
}
void Test_This_2() {TestThis* p = nullptr;p->PrintA();
}
int main(){Test_This_1();//Test_This_2();return 0;
}
思考两个函数调用的结果分别是什么?
1.编译时报错 2. 运行时崩溃 3. 正常运行
我们依次调用来看:
解答情形1
我们可以看到,中断打印Print, 并且提示:进程已退出,代码为0
,0代表正常返回,可以看到,第一种情况的结果是:正常运行。
解答情形2
观察两张图可看到,图一,光标一直在闪动,图二,程序结束时,退出代码为**-1073741819**,光标一直在闪动且退出代码为负数,显然是运行时崩溃。
原因分析
class TestThis {
public:void Print() {cout << Print() << endl;}void PrintA() {cout << _A << endl;}
private:int _A;
};
先看该类,挺简单的。两个成员函数:
Print()
,打印字符串“Print”
PrintA()
,打印成员变量_A的值
再看两个调用:
void Test_This_1() {TestThis* p = nullptr;p->Print();
}
void Test_This_2() {TestThis* p = nullptr;p->PrintA();
}
说白了讲,p是TestThis对象的空指针,通过指针p,分别调用
Print()
和PrintA()
函数
class TestThis {
public:void Print() {//this指针为空,但函数内没有对this指针解引用cout << Print() << endl;}void PrintA() {//this指针为空,但函数内访问_A,本质是this->_A//成员变量在对象内,因此发生了this指针的解引用。cout << _A << endl;}
private:int _A;
};
void Test_This_1() {TestThis* p = nullptr;//表示this指针为空p->Print();
}
void Test_This_2() {TestThis* p = nullptr;//表示this指针为空p->PrintA();
}
两种情形下,this指针都是空的。
p->Print();
,p调用Print, 不会发生解引用。因为,由上文得,Print的地址并不在对象中,p会作为实参传递给this指针,并没有发生空指针的解引用。p->PrintA();
,p调用PrintA, 不会发生解引用。但PrintA()
函数内,有cout << _A << endl;
,本质上是cout << this->_A << endl;
,变量_A
存储在对象内,因此需要去对象中找,也就发生了对象指针的解引用。此时对象指针为空,那么对空指针解引用,也就发生了运行时崩溃。
总结
- 类与对象关系:类是蓝图,对象是实体
- 访问控制:通过public/private/protected实现封装
- 存储模型:对象独立存储数据,共享函数代码
- this机制:隐式指针实现对象自治
- 设计原则:高内聚低耦合,合理使用访问限定符
理解类和对象的工作机制是掌握C++面向对象编程的基础,后续的继承、多态等特性都是建立在此基础之上的深入扩展。正确使用类和对象可以有效提高代码的可维护性和复用性。
今天的分享到此结束了,各位大佬多多支持。
一键三连,好运连连!
相关文章:
C++:类和对象初识
C:类和对象初识 前言类的引入与定义引入定义类的两种定义方法1. 声明和定义全部放在类体中2. 声明和定义分离式 类的成员变量命名规则 类的访问限定符及封装访问限定符封装 类的作用域与实例化类的作用域类实例化实例化方式: 类对象模型类对象的大小存储…...
01-SDRAM控制器的设计——案例总概述
本教程重点▷▷▷ 存储器简介。 介绍 SDRAM 的工作原理。 详细讲解SDRAM 控制的Verilog 实现方法。 PLL IP和FIFO IP 的调用,计数器设计,按键边沿捕获,数码管控制。 完成SDRAM控制器应用的完整案例。 Signal Tap 调试方法。 准备工作▷…...
笔记:蓝桥杯python搜索(3-2)——DFS剪支和记忆化搜索
目录 一、DFS剪支 二、例题 P2942 数字王国之军训军队 P3075 特殊的多边形 三、记忆化搜索 四、例题 例题 P3820 混境之地 P216 地宫取宝 一、DFS剪支 在搜索过程中,如果需要完全遍历所有情况可能需要很多时间在搜索到某种状态时,根据当前状态判断…...
处理数据及其选择关键列进行一次聚类
1. 数据加载与初步处理 # 文件路径 file_path ../data/all_database_result.csv# 读取CSV文件到DataFrame df pd.read_csv(file_path)# 选择特定的特征列 selected_features [Q10, Q12, Q13, Q14]# 缺失值处理:这里简单地删除含有任何缺失值的行 df.dropna(subse…...
Qt 支持的动画格式对比,Lottie/APNG/GIF/WEBP
Qt版本:6.7.2 , QML 一,Lottie 在qml中使用LottieAnimation即可,但有三个问题: 1.动画加载中报错: 如果图片(.json)本身存在不支持的effect 或shape type等,效果并不好:…...
FaceFusion如何设置公开链接和端口
有时候我们想在局域网内的其他设备上使用 FaceFusion,这时候需要设置公开链接和端口。 当你运行 FaceFusion 的时候,会发现有这样的一段提示: To create a public link, set shareTrue in launch().但是这个提示是错的,如果你查…...
【安当产品应用案例100集】037-强化OpenVPN安全防线的卓越之选——安当ASP身份认证系统
在当前数字化时代,网络安全已成为企业发展的重要组成部分。对于使用OpenVPN的企业而言,确保远程访问的安全性尤为重要。安当ASP身份认证系统凭借其强大的功能和便捷的集成方式,为OpenVPN的二次登录认证提供了理想的解决方案,特别是…...
RK3568实战项目(六)--开发工具介绍
目录 一、引言 二、开发工具 ------>2.1、trust_merger ------>2.2、boot_merger ------>2.3、loaderimage ------>2.4、resource_tool ------>2.5、mkimage ------>2.6、mkbootimg ------>2.7、unpack_bootimg ------>2.8、repack-bootimg …...
01.02、判定是否互为字符重排
01.02、[简单] 判定是否互为字符重排 1、题目描述 给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 在这道题中,我们的任务是判断两个字符串 s1 和 s2 是…...
尝试一下,交互式的三维计算python库,py3d
py3d是一个我开发的三维计算python库,目前不定期在PYPI上发版,可以通过pip直接安装 pip install py3d 开发这个库主要可视化是想把自己在工作中常用的三维方法汇总积累下来,不必每次重新造轮子。其实现成的python库也有很多,例如…...
DeepSeek-R1模型的数学原理(说人话)
文章目录 1、什么是GRPO2、数学原理3、比喻4、流程总结 🍃作者介绍:双非本科大四网络工程专业在读,阿里云专家博主,前三年专注于Java领域学习,擅长web应用开发,目前已转行人工智能领域。 🦅个人…...
安宝特方案 | AR助力制造业安全巡检智能化革命!
引言: 在制造业中,传统巡检常面临流程繁琐、质量波动、数据难以追溯等问题。安宝特AR工作流程标准化解决方案,通过增强现实AR技术,重塑制造业安全巡检模式,以标准化作业流程为核心,全面提升效率、质量与…...
DeepSeek和ChatGPT的对比
最近DeepSeek大放异彩,两者之间有什么差异呢?根据了解到的信息,简单做了一个对比。 DeepSeek 和 ChatGPT 是两种不同的自然语言处理(NLP)模型架构,尽管它们都基于 Transformer 架构,但在设计目标…...
AJAX项目——数据管理平台
黑马程序员视频地址: 黑马程序员——数据管理平台 前言 功能: 1.登录和权限判断 2.查看文章内容列表(筛选,分页) 3.编辑文章(数据回显) 4.删除文章 5.发布文章(图片上传࿰…...
神经网络常见激活函数 5-PReLU函数
文章目录 PReLU函数导函数函数和导函数图像优缺点pytorch中的PReLU函数tensorflow 中的PReLU函数 PReLU 参数化修正线性单元:Parametric ReLU 函数导函数 PReLU函数 P R e L U { x x > 0 α x x < 0 ( α 是可训练参数 ) \rm PReLU \left\{ \begin{array}{} x \qua…...
艾蒿染色体水平基因组-文献精读111
A chromosome-scale genome assembly of Artemisia argyi reveals unbiased subgenome evolution and key contributions of gene duplication to volatile terpenoid diversity 一项关于艾蒿(Artemisia argyi)的染色体尺度基因组组装揭示了无偏的亚基因…...
EB生成配置的过程
EB Tresos Studio,简称EB,通过图形化的模式进行配置生成,并根据选项配置生成配置代码,即 MCAL 层各个模块的配置参数。 在 MCAL 代码中,分为静态代码和配置代码。静态代码,就是 AUTOSAR 规范内容,包含对硬件的封装以及标准化接口的封装;配置代码一般用于配置初始化结构…...
使用Docker + Ollama在Ubuntu中部署deepseek
1、安装docker 这里建议用docker来部署,方便简单 安装教程需要自己找详细的,会用到跳过 如果你没有安装 Docker,可以按照以下步骤安装: sudo apt update sudo apt install apt-transport-https ca-certificates curl software-p…...
NFT Insider #168:The Sandbox 推出新春{金蛇礼服}套装;胖企鹅合作 LINE Minini
引言:NFT Insider 由 NFT 收藏组织 WHALE Members、BeepCrypto 联合出品, 浓缩每周 NFT 新闻,为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据,艺术新闻类,游戏新闻类,虚拟…...
字符串高频算法:无重复字符的最长子串
题目 3. 无重复字符的最长子串 - 力扣(LeetCode) 解题思路 思路 方法: 滑动窗口 [!简单思路] [^1]以示例一中的字符串 abcabcbb 为例,找出从每一个字符开始的,不包含重复字符的最长子串,其中最长的那个字符串即为答…...
集成学习(一):从理论到实战(附代码)
一、引言 在机器学习领域,打造一个独立、强大的算法是解决问题的关键。然而,集成学习提供了一种不同的视角:通过组合多个“弱”学习器来创建一个更强大的模型。本文探讨集成学习的思想、方法及其应用。 二、机器学习 vs 集成学习思想 传统…...
本地部署DeepSeek-R1模型(新手保姆教程)
背景 最近deepseek太火了,无数的媒体都在报道,很多人争相着想本地部署试验一下。本文就简单教学一下,怎么本地部署。 首先大家要知道,使用deepseek有三种方式: 1.网页端或者是手机app直接使用 2.使用代码调用API …...
轻松理解CSS中的float浮动元素
1.float:left,float:right可以让元素脱离原始文档流,也就是所谓的“浮动”,可以理解为元素漂浮在原本所占位置的上空,意思是元素漂浮起来了,不占原始文档流的空间。但是,别的元素可以感知到浮动元素的存在&…...
SOME/IP--协议英文原文讲解5
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 这一章节…...
如何优化频繁跳槽后的简历?
大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | A…...
存储异常导致的Oracle重大生产故障
📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...
从家庭IP到全球网络资源的无缝连接:Cliproxy的专业解决方案
数字化时代,家庭IP作为个人或家庭接入互联网的门户,其重要性日益凸显。然而,要实现从家庭IP到全球网络资源的无缝连接,并享受高效、安全、稳定的网络访问体验,往往需要借助专业的代理服务。Cliproxy,作为业…...
java项目之金华学校社团管理系统源码(ssm+mysql)
项目简介 金华学校社团管理系统实现了以下功能: 金华学校社团管理系统的主要使用者管理员对系统用户、公告信息进行管理。对社团信息进行管理,审核报名,统计社团报名结果等。学生维护个人信息,查看本校的社团信息,对…...
链表(LinkedList) 1
上期内容我们讲述了顺序表,知道了顺序表的底层是一段连续的空间进行存储(数组),在插入元素或者删除元素需要将顺序表中的元素整体移动,时间复杂度是O(n),效率比较低。因此,在Java的集合结构中又引入了链表来解决这一问…...
一、OSG学习笔记-编译开发环境
一、准备工作 1、osg3.6.4源码下载; openscenegraph/OpenSceneGraph at OpenSceneGraph-3.6.4 还有osg中所依赖的第三方库 2、cmake 下载安装好 3、Visual Studio 2019下载安装好 二、cmake 编译构建项目 这里下方1,2,两个先点击1&am…...
【Redis】Linux、Windows、Docker 环境下部署 Redis
一、Linux环境部署Redis 1、卸载 # 查看 Redis 是否还在运行 [appuserlocalhost redis]$ ps -ef|grep redis appuser 135694 125912 0 14:24 pts/1 00:00:00 ./bin/redis-server *:6379 appuser 135731 125912 0 14:24 pts/1 00:00:00 grep --colorauto redis# 停止…...
OSPF基础(3):区域划分
OSPF的区域划分 1、区域产生背景 路由器在同一个区域中泛洪LSA。为了确保每台路由器都拥有对网络拓扑的一致认知,LSDB需要在区域内进行同步。OSPF域如果仅有一个区域,随着网络规模越来越大,OSPF路由器的数量越来越多,这将导致诸…...
第436场周赛:按对角线进行矩阵排序、将元素分配给有约束条件的组、统计可以被最后一个数位整除的子字符串数目、最大化游戏分数的最小值
Q1、按对角线进行矩阵排序 1、题目描述 给你一个大小为 n x n 的整数方阵 grid。返回一个经过如下调整的矩阵: 左下角三角形(包括中间对角线)的对角线按 非递增顺序 排序。右上角三角形 的对角线按 非递减顺序 排序。 2、解题思路 遍历所…...
DeepSeek vs. ChatGPT:不同的诞生时间,对人工智能发展的不同影响
DeepSeek vs. ChatGPT:不同的诞生时间,对人工智能发展的不同影响 ChatGPT 和 DeepSeek 诞生于不同的时间节点,代表了人工智能不同阶段的发展方向。它们在技术、应用以及对AI发展趋势的影响方面各有侧重。 1. 诞生时间与背景 ChatGPT&#x…...
chrome-base 如何实现一个BindOnce
考虑一个问题: worker_thread.task_runner()->PostDelayedTask(FROM_HERE, base::BindOnce(&Ref::Foo, ref, 1), base::Milliseconds(1000)); BindOnce 是如何实现的呢? 翻看源码:base\functional\bind.h 写的 非常简洁 // Bind a…...
代码随想录算法训练营day38
代码随想录算法训练营 —day38 文章目录 代码随想录算法训练营前言一、322. 零钱兑换二维dp数组 二、279.完全平方数二维dp数组 三、139. 单词拆分多重背包背包问题总结问题类型递推公式遍历顺序 前言 今天是算法营的第38天,希望自己能够坚持下来! 今日…...
对接DeepSeek
其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日࿰…...
【学术投稿-第六届新材料与清洁能源国际学术会议(ICAMCE 2025)】组织与结构:HTML中的<fieldset>与<legend>标签解析
官网:www.icceam.com 简介 第六届新材料与清洁能源国际学术会议(ICAMCE 2025)将于2025年2月21-23日在郑州隆重举行。清洁能源、新材料是当今工业发展中最重要、最有潜力的领域之一。而新型材料又是新能源的基础和保证。本会议主要围绕“清洁…...
网络安全行业的冬天
冬天已经来了,春天还会远吗?2022年10月28日,各个安全大厂相继发布了财报,纵观2022年前三季度9个月,三六零亏了19亿,奇安信亏了11亿,深信服亏了6亿,天融信亏了4亿,安恒亏了…...
PlantUml常用语法
PlantUml常用语法,将从类图、流程图和序列图这三种最常用的图表类型开始。 类图 基础语法 在 PlantUML 中创建类图时,你可以定义类(Class)、接口(Interface)以及它们之间的关系,如继承&#…...
【开源免费】基于SpringBoot+Vue.JS网上服装商城(JAVA毕业设计)
本文项目编号 T 185 ,文末自助获取源码 \color{red}{T185,文末自助获取源码} T185,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
力扣LeetCode: 80 删除有序数组中的重复项Ⅱ
题目: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件…...
Linux之kernel(4)netlink通信
Linux内核(04)之netlink通信 Author: Once Day Date: 2023年1月3日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可查看专栏: Linux内核知识_Once-Day的博客-…...
autMan奥特曼机器人-对接deepseek教程
一、安装插件ChatGPT 符合openai api协议的大模型均可使用此插件,包括chatgpt-4/chatgpt-3.5-turbo,可自定义服务地址和模型,指令:gpt,要求Python3.7以上,使用官方库https://github.com/openai/openai-pyt…...
Java 大视界 -- Java 大数据在智能政务中的应用与服务创新(78)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
RestTemplate Https 证书访问错误
错误信息 resttemplate I/O error on GET request for “https://21.24.6.6:9443/authn-api/v5/oauth/token”: java.security.cert.CertificateException: No subject alternative names present; nested exception is javax.net.ssl.SSLHandshakeException: java.security.c…...
自动化测试
import os import pyautogui# 将鼠标移动到屏幕坐标 (100, 100) 位置,移动时间为 1 秒 pyautogui.moveTo(100, 100, duration1)# 将鼠标从当前位置向右移动 50 像素,向下移动 50 像素,移动时间为 0.5 秒 pyautogui.moveRel(50, 50, duration0…...
【C编程问题集中营】使用数组指针时容易踩得坑
【C编程问题集中营】使用数组指针时容易踩得坑 文章目录 【C编程问题集中营】使用数组指针时容易踩得坑一、获取数组首地址二、应用场景举例2.1 正常场景2.2 异常场景 三、总结 一、获取数组首地址 一维数组的首地址即数组第一个元素的指针,常用的获取一维数组首地…...
【分布式理论8】分布式调用之:四种IO模型
文章目录 一. 四种IO模型1. 同步阻塞 IO(Blocking IO)2. 同步非阻塞 IO(Non-blocking IO)3. IO 多路复用(IO Multiplexing)4. 异步 IO(Asynchronous IO)在 RPC 中的作用5. 总结 选择…...
MySQL 库建表数量有限制吗?
问:MySQL 库建表数量有限制吗? 答:无限制 官方文档: MySQL has no limit on the number of databases. The underlying file system may have a limit on the number of directories. MySQL has no limit on the number of tabl…...