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

C++ | 面向对象 | 类

👻类

👾语法格式

class className{Access specifiers:				// 访问权限DataType variable;			// 变量returnType functions() { }	// 方法
};

👾访问权限

class className {public:// 公有成员protected:// 受保护成员private:// 私有成员
};

👽公有成员 public

公有成员在类外部可访问,可不使用任何成员函数来设置和获取公有变量的值

class Line {public:double length;void setLength(double len);double getLength(void);
};
double Line::getLength(void) { return length ; }
void Line::setLength(double len) { length = len; }...
Line line;
// 使用成员变量(正确,因为 length 公有) 
line.length = 10.0;
cout << line.length <<endl;
// 使用成员函数
line.setLength(6.0);
cout << line.getLength() <<endl;

👽私有成员 private

私有成员在类外部不可访问,不可查看,只有友元函数可以访问私有成员。没有使用任何访问修饰符默认私有。

class Box {public:double length;void setWidth(double wid);double getWidth(void);private:double width;
};
double Box::getWidth(void) { return width; }
void Box::setWidth( double wid ) { width = wid; }...
Box box;
// box.width = 10.0; 	// [Error] 'double Box::width' is private
box.setWidth(10.0);  	// 使用成员函数设置宽度
cout << box.getWidth() <<endl;

👽受保护成员 protected

受保护成员与私有成员相似,但有一点不同,受保护成员在**派生类(即子类)**中是可访问的。

/* 基类 */ 
class Box {protected:double width;
};/* 派生类 */
class SmallBox: Box {  public:void setSmallWidth(double wid);double getSmallWidth();
};
double SmallBox::getSmallWidth() { return width; }
void SmallBox::setSmallWidth(double wid) { width = wid; }...
SmallBox box;
box.setSmallWidth(5.0);
cout << box.getSmallWidth() << endl;

👻类成员函数

👾语法格式

  • 定义在类定义内部

    class className{returnType functions(parameter list) { ... }
    };
    
  • 单独使用范围解析运算符 :: 定义

    class className{returnType functions(parameter list);
    };
    returnType class_name::functions(parameter list){ ... }
    

👾示例代码

  • 定义在类定义内部

    class Box {public:double length;  // 长度double breadth; // 宽度double height;  // 高度double getVolume() { return length * breadth * height; }
    };
    
  • 单独使用范围解析运算符 :: 定义

    class Box {public:double length;  // 长度double breadth; // 宽度double height;  // 高度double getVolume();
    };double Box::getVolume() { return length * breadth * height; }
    

👻类构造函数

  • 类构造函数在每次创建类的新对象时执行。
  • 构造函数的名称与类的名称是完全相同的,不返回任何类型。
  • 构造函数可用于为某些成员变量设置初始值

👾无参构造函数

👽语法格式

class className{className() { ... }
};

👽示例代码

class Line {public:Line() { cout << "Object is being created" << endl; }private:double length;
};...
Line line;	// 输出:Object is being created

👾带参构造函数

👽语法格式

class className{className(parameter list) { ... }
};

👽示例代码

class Line {public:Line(double len) {length = len;cout << "Object is being created" << endl;}private:double length;
};...
Line line;	// 输出:Object is being created

👾初始化列表构造函数

👽语法格式

类有多个字段 A、B、C 等需要进行初始化:

class className{className(int a,int b,int c): A(a), B(b), C(c) { ... }
};

👽示例代码

class Line {public:Line(double len): length(len) { cout << "Object is being created" << endl; }private:double length;
};...
Line line;	// 输出:Object is being created

等同语法:

Line(double len) {length = len;cout << "Object is being created" << endl;
}

注意:初始化类成员时,是按声明的顺序初始化,而不是按初始化列表的顺序初始化,即:

class Base {public:// 按照 A -> B -> C 的顺序初始化int A;int B;int C;// 而不是按照 C -> B -> A 的顺序初始化Base(int a, int b, int c): C(c), B(b), A(a) {}
};

👻类析构函数

  • 类析构函数在每次删除所创建的对象时执行。
  • 析构函数的名称与类的名称是完全相同的,在前面加 波浪号(~) 作为前缀,不返回任何值,不能带有任何参数。
  • 析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源

👾语法格式

类有多个字段 A、B、C 等需要进行初始化:

class className{~className() { ... }
};

👾示例代码

class Line {public:Line() { cout << "Object created" << endl; }  // 构造函数声明~Line() { cout << "Object deleted" << endl; } // 析构函数声明
};...
Line line;

一个类内可以有多个构造函数(相当于重载构造函数),只有一个析构函数

class Matrix {public:Matrix(int row, int col);       //普通构造函数Matrix(const Matrix& matrix);   //拷贝构造函数Matrix();                       //构造空矩阵的构造函数~Matrix();
};

👻类拷贝构造函数

👾语法结构

class className{// obj是对象引用,用于初始化另一个对象className (const className &obj) { }
};
  • 参数 obj —— 本类的引用

    • const 类型引用 —— 既能以常量对象(初始化后值不改变的对象)作为参数,也能以非常量对象作为参数初始化其他对象

    • const 类型引用 —— 一般不使用

👾被调用情况

  • 情况1:用一个对象初始化同类的另一个对象时,调用被初始化的对象的拷贝构造函数

    Base a2(a1);	
    Base a2 = a1;
    
    class Base {public:int num;// 一般构造函数Base(int n) {num = n;cout << "General Constructor called" << endl;}// 拷贝构造函数Base(const Base& a) {num = a.num;cout << "Copy Constructor called" << endl;}
    };...// 只调用a1的一般构造函数,输出 General Constructor called
    Base a1(1);	
    // 只调用a2的拷贝构造函数,输出 Copy Constructor called
    Base a2(a1);	
    Base a2 = a1;
    // 不调用
    a2 = a1;		
    

    注意,Base a2 = a1; 是初始化语句,不是赋值语句。

    赋值语句的等号左边是一个早已有定义的变量,不会引发复制构造函数的调用,

    Base a1(1);	// 调用a1的一般构造函数
    Base a2(a1);	// 调用a2的拷贝构造函数
    a2 = a1;		// 不调用,因为 a2 早已生成且初始化,不会引发拷贝构造函数
    

    只会调用被初始化的对象的拷贝构造函数,不会调用其一般构造函数

  • 情况2:函数参数是类的对象,当函数调用时,调用对象的拷贝构造函数

    class Base {public:// 一般构造函数Base() { cout << "General Constructor called" << endl; };// 拷贝构造函数Base(Base& a) { cout << "Copy constructor called" << endl; }
    };
    void Function(Base a) {}...Base a;		// 调用a的一般构造函数,输出 General Constructor called
    Function(a);	// 调用a的拷贝构造函数,输出 Copy constructor called
    
    • 对象作为形参,函数被调用时,生成形参要用拷贝构造函数,会带来时间开销
    • 对象的引用作为形参,无时间开销,但有一定的风险,因为如果形参的值发生改变,实参值也会改变

    如果要确保实参值不改变,又希望避免拷贝构造函数的开销,解决办法是将形参声明为对象的 const 引用:

    void Function(const Base &a){...
    }
    
  • 情况3:函数返回值是类的对象,当函数返回时,调用对象的拷贝构造函数

    class Base {public:int num;// 一般构造函数Base(int n) {num = n;cout << "General Constructor called" << endl;}// 拷贝构造函数Base(const Base& a) {num = a.num;cout << "Copy constructor called" << endl;}
    };Base Func() {Base a(4);	// 调用一般构造函数,输出 General Constructor calledreturn a;
    }...int a = Func().num;	// 调用拷贝构造函数,输出 Copy constructor called
    

    有些编译器出于程序执行效率的考虑,编译时进行优化,函数返回值对象不用拷贝构造函数,不符合C++标准

👾深拷贝和浅拷贝

👽浅拷贝

  • 使用情况:基本类型数据、简单对象
  • 原理:按位复制内存
// 基本类型数据
int a = 10;
int b = a;
// 简单对象
class Base {public:Base(): m_a(0), m_b(0) { }Base(int a, int b): m_a(a), m_b(b) { }private:int m_a;int m_b;
};Base obj1(10, 20);
Base obj2 = obj1;

👽深拷贝

  • 使用情况
    • 持有其它资源的类(如动态分配的内存、指向其他数据的指针)
    • 标准模板库(STL)中 string、vector、stack 等
    • 创建对象时进行一些预处理工作,比如统计创建过的对象的数目、记录对象创建的时间等
  • 原理:显式定义拷贝构造函数
  • 过程
    • 会将原有对象的所有成员变量拷贝给新对象
    • 会为新对象再分配一块内存,并将原有对象所持有的内存也拷贝过来
  • 结果:原有对象和新对象所持有的动态内存相互独立,更改一个对象的数据不影响另一个对象
// 持有其它资源的类(如动态分配的内存、指向其他数据的指针)
#include <cstdlib>
#include <iostream>
using namespace std;class Array {public:Array(const int len) {m_len = len;m_p = (int*)calloc(m_len, sizeof(int));}Array(const Array& arr) {this->m_len = arr.m_len;this->m_p = (int*)calloc(this->m_len, sizeof(int));memcpy(this->m_p, arr.m_p, m_len * sizeof(int));}~Array() { free(m_p); }int operator[](int i) const { return m_p[i]; }int& operator[](int i) { return m_p[i]; }int length() const { return m_len; }private:int m_len;int* m_p;
};void printArray(const Array& arr) {int len = arr.length();for(int i = 0; i < len; i++) { if(i == len - 1) { cout << arr[i] << endl; } else { cout << arr[i] << ", "; } }
}...int main() {Array arr1(10);for(int i = 0; i < 10; i++)arr1[i] = i;Array arr2 = arr1;arr2[5] = 100;arr2[3] = 29;printArray(arr1); // 输出:0, 1, 2, 3, 4, 5, 6, 7, 8, 9printArray(arr2); // 输出:0, 1, 2, 29, 4, 100, 6, 7, 8, 9
}
// 创建对象时进行一些预处理工作
#include <iostream>
#include <ctime>
#include <windows.h>
using namespace std;class Base {public:Base(int a = 0, int b = 0) {m_a = a;m_b = b;m_count++;m_time = time(nullptr);}Base(const Base& obj) {this->m_a = obj.m_a;this->m_b = obj.m_b;this->m_count++;this->m_time = time(nullptr);}static int getCount() { return m_count; }time_t getTime() const { return m_time; }private:int m_a;int m_b;time_t m_time;      //对象创建时间static int m_count; //创建过的对象的数目
};int Base::m_count = 0;...int main() {Base obj1(10, 20);cout << "obj1: count = " << obj1.getCount() << ", time = " << obj1.getTime() << endl;// 输出:obj1: count = 1, time = 1740055359Sleep(3000);Base obj2 = obj1;cout << "obj2: count = " << obj2.getCount() << ", time = " << obj2.getTime() << endl;// 输出:obj2: count = 2, time = 1740055362return 0;
}

👻类静态成员

👾类静态成员变量

👽声明

使用 关键字 static 把类成员声明为静态

class Box {public:static int objectCount; // 声明静态变量Box() { objectCount++; } // 每次创建对象时调用构造函数,静态变量值加 1
};

无论创建多少个类的对象,静态成员只有一个副本,在类的所有对象中是共享的。

👽定义

在类外部通过 范围解析运算符 :: 定义静态变量

class Box {public:static int objectCount; // 声明静态变量Box() { objectCount++; } 
};
// 仅定义却不初始化 类静态成员
int Box::objectCount;

无论是否初始化,必须定义,否则报错:

(.rdata$.refptr._ZN3Box11objectCountE[.refptr._ZN3Box11objectCountE]+0x0): undefined reference to `Box::objectCount'

👽初始化

// 定义+初始化 类静态成员
int Box::objectCount = 0;

若不初始化,则在创建第一个对象时所有静态数据初始化为零

👽访问

  • 使用 范围解析运算符 :: 访问类静态变量
Box box1();    // 声明 box1
Box box2();    // 声明 box2
cout << "创建对象总数: " << Box::objectCount << endl;

👾类静态成员函数

👽声明定义

  • 使用 关键字 static 把类成员声明为静态
class Box {public:static int objectCount; // 声明静态变量Box() { objectCount++; }static int getCount() { // 声明定义静态函数return objectCount;}
};
  1. 普通成员函数有 this 指针,可以访问类中的任意成员
  2. 静态成员函数没有 this 指针,只能访问静态成员变量其他静态成员函数类外部的其他函数

👽使用

  • 使用 范围解析运算符 :: 访问类静态变量
cout << "创建对象总数: " << Box::getCount() << endl; // 对象不存在时 也能被调用
Box box1();    // 声明 box1
Box box2();    // 声明 box2
cout << "创建对象总数: " << Box::getCount() << endl;

静态成员函数即使 类对象不存在 也能被调用


👻友元

👾友元函数

  • 类的友元函数定义在类外部,但有权访问类的私有成员、保护成员
  • 尽管友元函数的原型在类的定义中出现,但友元函数不是成员函数

👽声明

使用 关键字 friend 把函数声明为友元函数

class Box {double width;public:Box(double w): width(w) {}friend void printWidth(Box box);  // 在函数前使用关键字 friend
};

👽定义

class Box {double width;public:Box(double w): width(w) {}friend void printWidth(Box box);
};/* printWidth() 不是任何类的成员函数,但因为它是 Box 的友元,可直接访问该类的任何成员 */
void printWidth(Box box) { cout << "Width of box : " << box.width <<endl;}

👽使用

Box box;
box.setWidth(10.0);
printWidth(box); 	// 使用友元函数访问Box中的私有成员

👾友元类

👽声明定义

class Box {public:Box(double w): width(w) {}friend class BigBox;private:double width;
};/* BigBox是Box的友元类,它可以直接访问Box类的任何成员 */
class BigBox {public :void printWidth(Box& box) { cout << "Width of box : " << box.width << endl; }
};

👽使用

Box box(10.0);
BigBox big;
big.printWidth(box); // 使用友元类中的方法访问Box中的私有成员

👻 this 指针

  • this 指针是一个特殊的指针,它指向当前对象的实例,每一个对象都能通过 this 指针来访问自己的地址。
  • 当一个对象的成员函数被调用时,编译器会隐式地传递该对象的地址作为 this 指针。
  • 友元函数没有 this 指针,因为友元不是类的成员
class MyClass {private:int value;public:// 可以明确地告诉编译器想访问当前对象的成员变量,而不是函数参数或局部变量,避免命名冲突void setValue(int value) { this->value = value; } void getValue() { return this->value; }
};...MyClass obj;
obj.setValue(42);
int value = obj.getValue();

相关文章:

C++ | 面向对象 | 类

&#x1f47b;类 &#x1f47e;语法格式 class className{Access specifiers: // 访问权限DataType variable; // 变量returnType functions() { } // 方法 };&#x1f47e;访问权限 class className {public:// 公有成员protected:// 受保护成员private:// 私有成员 }…...

鸿蒙-AVPlayer

compileVersion 5.0.2&#xff08;14&#xff09; 音频播放 import media from ohos.multimedia.media; import common from ohos.app.ability.common; import { BusinessError } from ohos.base;Entry Component struct AudioPlayer {private avPlayer: media.AVPlayer | nu…...

Android移动应用开发实践-1-下载安装和简单使用Android Studio 3.5.2版本(频频出错)

一、下载安装 1.Android Studio3.5.2下载地址&#xff1a;Android Studio3.5.2下载地址 其他版本下载地址&#xff1a;其他版本下载地址 2.安装教程&#xff08;可以多找几个看看&#xff09; 安装 | 手把手教你Android studio 3.5.2安装&#xff08;安装教程&#xff09;_a…...

从.m3u8到.mp4:使用批处理脚本完成视频处理的完整指南

这里介绍一个Windows批处理脚本&#xff08;Windows Batch Script&#xff09;&#xff0c;主要用于处理 .m3u8 ts 视频文件的下载和合并功能。 以下是程序的主要功能和逻辑流程&#xff1a; 功能概述 参数检查与路径处理&#xff1a; 检查是否传递了文件或文件夹路径作为参数…...

qt5的中文乱码问题,QString、QStringLiteral 为 UTF-16 编码

qt5的中文乱码问题一直没有很明确的处理方案。 今天处理进程间通信时&#xff0c;也遇到了qt5乱码问题&#xff0c;一边是设置的GBK&#xff0c;一边设置的是UTF8&#xff0c;单向通信约定采用UTF8。 发送端保证发的是UTF8字符串&#xff0c;因为UTF8在网络数据包中没有字节序…...

Gurobi 并行计算的一些问题

最近尝试用 gurobi 进行并行计算&#xff0c;即同时用多个 cpu 核计算 gurobi 的 model&#xff0c;但是发现了不少问题。总体来看&#xff0c;gurobi 对并行计算的支持并不是那么好。 gurobi 官方对于并行计算的使用在这个网址&#xff0c;并有下面的大致代码&#xff1a; i…...

Vue3 中如何实现响应式系统中的依赖收集和更新队列的解耦?

一、问题解析&#xff1a;为什么需要解耦&#xff1f; 在响应式系统中&#xff0c;依赖收集​&#xff08;追踪数据与视图的关联关系&#xff09;和更新队列​&#xff08;批量处理数据变化带来的副作用&#xff09;是两个核心但职责不同的模块。 Vue3 通过以下设计实现解耦&…...

vue项目中动态添加类名样式不生效问题

一、问题描述 在vue项目中使用:class{tableContent: summary}给元素动态添加了类名tableContent&#xff0c;运行代码后查看类名已经添加成功但样式并未生效。 二、问题产生原因并解决 刚开始把样式写在了<style lang"scss" scoped></style>中&#x…...

供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面、会员 UI 设计图(一)

供应链管理系统--升鲜宝门店收银系统功能解析&#xff0c;登录、主界面 会员 UI 设计图&#xff08;一&#xff09;...

用AI写游戏3——deepseek实现kotlin android studio greedy snake game 贪吃蛇游戏

项目下载 https://download.csdn.net/download/AnalogElectronic/90421306 项目结构 就是通过android studio 建空项目&#xff0c;改下MainActivity.kt的内容就完事了 ctrlshiftalts 看项目结构如下 核心代码 MainActivity.kt package com.example.snakegame1// MainA…...

设计模式的引入

面向对象设计原则 1. 软件设计固有的复杂性2. 面向对象设计原则2.1 引入2.2 依赖倒置原则2.3 开放封闭原则2.4 单一职责原则2.5 Liskov 替换原则&#xff08; LSP&#xff09;2.6 接口隔离原则&#xff08; ISP&#xff09;2.7 优先使用对象组合&#xff0c;而不是类继承2.8 封…...

P8697 [蓝桥杯 2019 国 C] 最长子序列

P8697 [蓝桥杯 2019 国 C] 最长子序列 题目 分析代码 题目 分析 先分析一波xdm 题意呢就是在s中找有多少个能和t匹配的字符&#xff0c;注意&#xff1a;连续匹配&#xff0c;输出连续的次数 欧克&#xff0c;开始分析&#xff0c;首先&#xff0c;哎~字母&#xff01;还强调…...

基于阿里云PAI平台快速部署DeepSeek大模型实战指南

一、DeepSeek大模型&#xff1a;企业级AI应用的新标杆 1.1 为什么选择DeepSeek&#xff1f; 近期&#xff0c;DeepSeek系列模型凭借其接近GPT-4的性能和开源策略&#xff0c;成为全球开发者关注的焦点。在多项国际评测中&#xff0c;DeepSeek-R1模型在推理能力、多语言支持和…...

【java进阶】java多态深入探讨

前言 在Java的编程宇宙中,多态是极为关键的概念,它宛如一条灵动的纽带,串联起面向对象编程的诸多特性,赋予程序宛如生命般的动态活力与高度灵活性。透彻理解多态,不仅是提升代码质量的关键,更是开启高效编程大门的钥匙。 一、多态的定义与本质 多态,从概念层面来讲,…...

蓝桥杯备赛-拔河

问题描述 小明是学校里的一名老师&#xff0c;他带的班级共有 nn 名同学&#xff0c;第 ii 名同学力量值为 aiai​。在闲暇之余&#xff0c;小明决定在班级里组织一场拔河比赛。 为了保证比赛的双方实力尽可能相近&#xff0c;需要在这 nn 名同学中挑选出两个队伍&#xff0c…...

Zookeeper(67) Zookeeper在HBase中的应用是什么?

Zookeeper 在 HBase 中起到了至关重要的作用&#xff0c;主要用于协调和管理 HBase 集群中的多个组件。具体来说&#xff0c;Zookeeper 在 HBase 中的应用包括以下几个方面&#xff1a; Master 选举&#xff1a;HBase 集群中可以有多个 Master 节点&#xff0c;但只有一个处于…...

java后端开发day20--面向对象进阶(一)--static继承

&#xff08;以下内容全部来自上述课程&#xff09; 1.static–静态–共享 static表示静态&#xff0c;是java中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。 1.静态变量 被static修饰的成员变量&#xff0c;叫做静态变量。 特点&#xff1a; 被该类…...

IDEA使用Maven方式构建SpringBoot项目

1、环境准备 确保你已经安装了以下工具&#xff1a; Java JDK&#xff08;推荐 JDK 8 或更高版本&#xff09; IntelliJ IDEA&#xff08;推荐使用最新版本&#xff09; 2、创建 Spring Boot 项目 &#xff08;1&#xff09; 打开 IntelliJ IDEA。 &#xff08;2&#xff09…...

Spring Boot2.0之十 使用自定义注解、Json序列化器实现自动转换字典类型字段

前言 项目中经常需要后端将字典类型字段值的中文名称返回给前端。通过sql中关联字典表或者自定义函数不仅影响性能还不能使用mybatisplus自带的查询方法&#xff0c;所以推荐使用自定义注解、Json序列化器&#xff0c;Spring的缓存功能实现自动转换字典类型字段。以下实现Spri…...

C#问题解决方案 --- 生成软件hash,生成文件hash

生成软件hash值&#xff1a; private string GetEXEHashString() {//获得软件哈希值Process currProcess Process.GetCurrentProcess();string filePath currProcess.MainModule.FileName;string hashEXE string.Empty;using (FileStream fs new FileStream(filePath, Fil…...

云计算如何解决延迟问题?

在云计算中&#xff0c;延迟&#xff08;latency&#xff09;指的是从请求发出到收到响应之间的时间间隔。延迟过高可能会严重影响用户体验&#xff0c;特别是在需要实时响应的应用中&#xff0c;如在线游戏、视频流、金融交易等。云计算服务如何解决延迟问题&#xff0c;通常依…...

多模态人物视频驱动技术回顾与业务应用

一种新的商品表现形态&#xff0c;内容几乎存在于手淘用户动线全流程&#xff0c;例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力&#xff0c;能够从供给端缓解内容生产成本高的问题&#xff0c;通过源源不断的低成本供给倒推…...

鸿蒙中连接手机可能遇到的问题

连接权限问题&#xff1a;手机开启了严格的权限管理机制&#xff0c;若未授予鸿蒙设备连接所需的权限&#xff0c;如蓝牙连接时未开启蓝牙权限&#xff0c;或者 USB 连接时未允许设备进行调试、文件传输等操作&#xff0c;就会导致连接失败。例如&#xff0c;当使用鸿蒙平板通过…...

15.代码随想录算法训练营第十五天|(递归)110. 平衡二叉树,257. 二叉树的所有路径*,404. 左叶子之和,222.完全二叉树的节点个数[打卡自用]

15.代码随想录算法训练营第十五天|&#xff08;递归&#xff09;110. 平衡二叉树&#xff0c;257. 二叉树的所有路径*&#xff0c;404. 左叶子之和&#xff0c;222.完全二叉树的节点个数 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xf…...

H5 火柴人科目三和GitHub获取仓库点星星的用户列表发生了艺术的碰撞

先看效果&#xff0c;代码写的比较乱&#xff0c;有待优化 效果 https://linyisonger.github.io/H5.Examples/?name./089.%E7%9C%8B%E6%98%9F%E6%98%9F%E7%9A%84%E8%88%9E%E8%80%85.html 思路 看起来很简单&#xff0c;实则也不是很难&#xff0c;就是需要思路要打开。 一…...

使用消息队列怎样防止消息重复?

大家好&#xff0c;我是君哥。 使用消息队列时&#xff0c;我们经常会遇到一个可能对业务产生影响的问题&#xff0c;消息重复。在订单、扣款、对账等对幂等有要求的场景&#xff0c;消息重复的问题必须解决。 那怎样应对重复消息呢&#xff1f;今天来聊一聊这个话题。 1.三…...

06.【C++】模板初阶(template<typename T>,充分复用函数,函数模板和类模板的使用)

目录 一. 泛型编程 二. 函数模板&#xff08;template的使用&#xff09; 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 三. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 一. 泛型编程 如何实现一个通用…...

深入理解 并查集LRUCaChe

并查集&LRUCaChe 个人主页&#xff1a;顾漂亮 文章专栏&#xff1a;Java数据结构 1.并查集的原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后根据一定规律将归于同一组元素的…...

在 macOS 系统上安装 kubectl

在 macOS 系统上安装 kubectl 官网&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-macos/ 用 Homebrew 在 macOS 系统上安装 如果你是 macOS 系统&#xff0c;且用的是 Homebrew 包管理工具&#xff0c; 则可以用 Homebrew 安装 kubectl。 运行…...

如何设置HTTPOnly和Secure Cookie标志?

设置HttpOnly和Secure标志于Cookie中是增强Web应用安全性的重要措施。这两个标志帮助防止跨站脚本攻击&#xff08;XSS&#xff09;和中间人攻击&#xff08;MitM&#xff09;。下面是关于如何设置这些标志的具体步骤&#xff1a; 设置方法 在服务器端设置 根据你的服务器端…...

seacmsv9注入管理员账号密码+orderby+limi

1&#xff1a;mysql默认存储引擎innoDB携带的表 1&#xff0c;mysql.innodb_table_stats 2,mysql.innodb_index_stats SELECT table_name FROM mysql.innodb_table_stats WHERE database_name DATABASE(); 2&#xff1a; 关键字做处理 HEX编码:0x696E666F726D6174696F6E5F7…...

Orange 开源项目 - 集成百度智能云-千帆大模型

1 集成百度智能云-千帆大模型 百度智能云-千帆ModelBuilder百度智能云千帆大模型服务与开发平台ModelBuilder&#xff08;以下简称千帆ModelBuilder&#xff09;是面向企业开发者的一站式大模型开发及服务运行平台。千帆ModelBuilder不仅提供了包括文心一言底层模型和第三方开源…...

mac 安装Eclipse,汉化及安装ERMaster

1、下载Eclipse 进入官网直接下载 https://www.eclipse.org/downloads/ 2、Eclipse 汉化 以下是 Eclipse 2024-12 汉化的具体方法&#xff1a; 1、打开安装新软件界面&#xff1a;打开 Eclipse&#xff0c;点击菜单栏中的 “Help”&#xff0c;选择 “Install New Software……...

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中&#xff0c;C 语言宛如一座巍峨的高山&#xff0c;吸引着无数开发者攀登探索。而 Linux 操作系统&#xff0c;以其开源、稳定、高效的特性&#xff0c;成为了众多开发者钟爱的开发平台。将 C 与 Linux 相结合&#xff0c;就如同为开发者配备了一把无坚不…...

Unity3D 战斗系统架构与设计详解

引言 战斗系统是许多游戏的核心玩法之一&#xff0c;尤其是在动作游戏、角色扮演游戏&#xff08;RPG&#xff09;和策略游戏中。Unity3D 作为一款强大的游戏引擎&#xff0c;提供了丰富的工具和 API 来帮助开发者实现复杂的战斗系统。本文将详细探讨 Unity3D 中战斗系统的架构…...

Apache Commons Chain 与 Spring Boot 整合:构建用户注册处理链

文章目录 概述1. 环境准备2. 创建自定义上下文3. 创建命令验证用户输入保存用户数据发送欢迎邮件 4. 构建并执行处理链5. 使用处理链6. 运行结果7. 总结 概述 本文档旨在展示如何在 Spring Boot 应用中使用 Apache Commons Chain 来实现一个用户注册的处理链。我们将通过 Chai…...

数据结构:二叉树的数组结构以及堆的实现详解

目录 一.树与二叉树 1.树的概念与相关术语&#xff1a; 2.二叉树&#xff1a; &#xff08;1&#xff09;定义&#xff1a; &#xff08;2&#xff09;特殊的二叉树&#xff1a; &#xff08;3&#xff09;完全二叉树 &#xff08;4&#xff09;二叉树的存储结构&#x…...

机器学习01

机器学习的基本过程如下&#xff1a; 1.数据获取 2.数据划分 3.特征提取 4.模型选择与训练 5.模型评估 6.模型调优 一、特征工程&#xff08;重点&#xff09; 0. 特征工程步骤为&#xff1a; 特征提取(如果不是像dataframe那样的数据&#xff0c;要进行特征提取&#…...

常见锁类型介绍

下面结合代码详细介绍 Mutex、RW Lock、Futex、自旋锁、信号量、条件变量 和 synchronized&#xff0c;并分析它们的适用场景、特点以及为什么这些锁适用于特定场景。我们将从锁的实现机制和性能特点出发&#xff0c;解释其适用性。 1. Mutex&#xff08;互斥锁&#xff09; 代…...

[uboot][stm32]配置LTDC屏幕

文章目录 前提dts设备树修改Kconfig日志打印后记 https://github.com/wdfk-prog/u-boot 前提 手上刚好有块屏幕,尝试在uboot中点亮一下使用前请使用其他手段点亮该屏幕确保屏幕的完好再进行操作.确保配置的参数及引脚是可用的. dts设备树修改 ltdc状态修改为重定向前绑定,另…...

nodejs用ws模块反向代理socks5数据,即用ws写服务端和客户端及加密

首先思路是客户端发送socks5请求数据——>服务端解密并解析socks5数据是否为真&#xff0c;解析出Host和port,并用net.socket访问目标网站&#xff0c;目标网站返回数据&#xff0c;服务端再用ws发送返回数据给客户端 //解析socks5数据和返回socks5格式响应 //在读下面代码…...

【MySQL篇】数据库基础

目录 1&#xff0c;什么是数据库&#xff1f; 2&#xff0c;主流数据库 3&#xff0c;MySQL介绍 1&#xff0c;MySQL架构 2&#xff0c;SQL分类 3&#xff0c;MySQL存储引擎 1&#xff0c;什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xf…...

linux后台运行程序怎么停止

启动 nohup ./jmeter -nt test.jmx 查看 ps -ef | grep nohup或者 ps -ef | grep test 停止 kill 掉上面查询出的进程 疑惑 停止掉java进程或者jmeter进程&#xff0c;但是没有实际停止任务&#xff0c;所以用nohup查出来进程再停止比较靠谱&#xff01;&#xff01;...

华为认证考试证书下载步骤(纸质+电子版)

华为考试证书可以通过官方渠道下载相应的电子证书&#xff0c;部分高级认证如HCIE还支持申请纸质证书。 一、华为电子版证书申请步骤如下&#xff1a; ①访问华为培训与认证网站 打开浏览器&#xff0c;登录华为培训与认证官方网站 ②登录个人账号 在网站首页&#xff0c;点…...

scala基础

Scala基础 scala基础Scala介绍第一个scala代码object和class的区别关键区别伴生类和伴生对象&#xff1a; 字节码解析在java中创建三个类 反编译代码编译User.class源码后的结果编译Emp.class源码后的结果 注释Scala类型推断&至简原则变量var和val之间的区别可变变量不可变…...

Linux中的查看命令

路径分为相对路径&#xff08;行相对当前工作目录开始的路径&#xff09;和绝对路径&#xff08;不管是&#xff09;#&#xff1a;命令提示符&#xff0c;从这个位置可以开始输入命令&#xff0c;另一个提示符为$&#xff0c;如果是root&#xff0c;则提示为#&#xff1b;如果是…...

深入了解 NAT 模式:网络地址转换的奥秘

深入了解 NAT 模式&#xff1a;网络地址转换的奥秘 在计算机网络的世界里&#xff0c;NAT 模式&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;扮演着至关重要的角色。它就像是网络中的翻译官&#xff0c;在不同网络地址之间进行转换&#xff0…...

HTML第二节

一.列表 1.列表的简介 2.无序列表 注&#xff1a;1.ul里面只能放li&#xff0c;不能放标题和段落标签 2.li里面可以放标题和段落等内容 3.有序列表 4.定义列表 注&#xff1a;要实现上图的效果需要CSS 二.表格 1.表格介绍 注&#xff1a;1.th有额外的效果&#xff0c;可以…...

203、【数组】NLP分词实现(Python)

题目描述 给定一个词典&#xff0c;比如[“杭州”,“西湖”,“博物馆”,“杭州西湖博物馆”,“我”]​ 对于输入的文本进分词&#xff1a;我在杭州的杭州西湖博物馆玩了一天​ 分词结果处理为如下形式的字符串: 我\W 在 杭州\W 的 杭州西湖博物馆\W 玩了一天​ 对于输入的文本…...

Qt 开源音视频框架模块之QtAV播放器实践

Qt 开源音视频框架模块QtAV播放器实践 1 摘要 QtAV是一个基于Qt的多媒体框架&#xff0c;旨在简化音视频播放和处理。它是一个跨平台的库&#xff0c;支持多种音视频格式&#xff0c;并提供了一个简单易用的API来集成音视频功能。QtAV的设计目标是为Qt应用程序提供强大的音视…...