C++中类和对象的细节原理
文章目录
- 一、C++中的构造函数
- 二、C++中的析构函数
- 三、两者的配合与注意事项
- 四、C++中的静态成员变量
- 五、C++中的静态成员函数
- 六、C++中普通成员函数和静态成员函数的区别
- 七、C++中的const成员变量
- 八、C++中的const 成员函数
- 九、C++中构造函数的初始化列表
- 十、C++中的浅拷贝操作
- 十一、C++中的深拷贝操作
一、C++中的构造函数
1.构造函数的定义和作用
构造函数是与类同名的特殊函数,在创建类的对象时自动调用,用于对对象进行初始化。
2.构造函数的特点
- 与类同名:构造函数的名称必须与类名一致。
- 无返回值:构造函数没有返回值(即使是 void 也不能写)。
- 自动调用:在对象创建时自动调用,无需显式调用。
- 支持重载:可以定义多个构造函数,参数列表不同即可(构成重载)。
- 可以使用初始化列表:常用于初始化 const 数据成员或引用类型成员。
3.构造函数的类型
默认构造函数:无参数的构造函数。
class MyClass {
public:MyClass() { // 默认构造函数std::cout << "Default constructor called!" << std::endl;}
};
MyClass obj; // 自动调用默认构造函数
参数化构造函数:包含参数的构造函数。
class MyClass {
private:int x;
public:MyClass(int val) : x(val) { // 使用初始化列表std::cout << "Parameterized constructor called!" << std::endl;}
};
MyClass obj(10); // 调用参数化构造函数
拷贝构造函数:用于通过同类型对象初始化新对象。
class MyClass {
private:int x;
public:MyClass(int val) : x(val) {}MyClass(const MyClass& other) : x(other.x) { // 拷贝构造函数std::cout << "Copy constructor called!" << std::endl;}
};
MyClass obj1(10);
MyClass obj2 = obj1; // 调用拷贝构造函数
移动构造函数(C++11 引入):用于移动资源而不是复制资源,减少性能开销。
class MyClass {
private:int* data;
public:MyClass(int val) : data(new int(val)) {}MyClass(MyClass&& other) noexcept : data(other.data) { // 移动构造函数other.data = nullptr;std::cout << "Move constructor called!" << std::endl;}~MyClass() { delete data; }
};
MyClass obj1(10);
MyClass obj2 = std::move(obj1); // 调用移动构造函数
二、C++中的析构函数
1.析构函数的定义和作用
析构函数是与类同名并以 ~ 开头的特殊函数,在对象生命周期结束时自动调用,用于释放资源或执行清理操作。
2.析构函数的特点
- 与类同名并以 ~ 开头。
- 无参数、无返回值。
- 自动调用:在对象超出作用域或被显式删除时自动调用。
- 不能被重载:每个类只能有一个析构函数。
class MyClass {
public:MyClass() { std::cout << "Constructor called!" << std::endl; }~MyClass() { std::cout << "Destructor called!" << std::endl; }
};
int main() {MyClass obj; // 创建对象时调用构造函数
} // 作用域结束时,自动调用析构函数
3.析构函数的常见用途
释放动态内存:
class MyClass {
private:int* data;
public:MyClass(int val) : data(new int(val)) {}~MyClass() {delete data; // 释放动态内存std::cout << "Destructor called and memory freed!" << std::endl;}
};
三、两者的配合与注意事项
构造和析构的匹配:每次调用构造函数分配资源时,析构函数都应该负责释放资源(遵循 RAII 原则)。
虚析构函数:如果类包含虚函数,析构函数也应声明为 virtual,以确保通过基类指针删除派生类对象时,派生类的析构函数能被正确调用。
class Base {
public:virtual ~Base() { std::cout << "Base destructor called!" << std::endl; }
};
class Derived : public Base {
public:~Derived() { std::cout << "Derived destructor called!" << std::endl; }
};
Base* obj = new Derived();
delete obj; // 调用 Derived 和 Base 的析构函数
四、C++中的静态成员变量
静态成员变量是用 static 关键字声明的类成员变量。它是类的公共成员,在类的所有对象之间共享。
静态成员变量的特点:
- 属于类,而非对象:静态成员变量只占用一份内存,不随对象的创建而分配,也不会随对象的销毁而释放。
- 共享性:所有类的对象共享同一个静态成员变量。
- 必须在类外定义并初始化(除非是 constexpr 静态变量)。
- 存储周期:程序启动时分配内存,程序结束时释放。
- 访问方式:可以通过对象或类名访问(推荐通过类名访问)。
类中静态成员变量的声明与定义:
#include <iostream>
class MyClass {
public:static int count; // 静态成员变量声明MyClass() {count++; // 每次创建对象时增加计数}
};// 静态成员变量必须在类外定义并初始化
int MyClass::count = 0;int main() {MyClass obj1, obj2, obj3;std::cout << "Total objects created: " << MyClass::count << std::endl;return 0;
}
C++11 引入的 constexpr 允许静态成员变量在类内定义,但必须是常量且编译时可确定值。
#include <iostream>
class MyClass {
public:static constexpr int maxObjects = 10; // 类内定义并初始化
};int main() {std::cout << "Maximum objects allowed: " << MyClass::maxObjects << std::endl;return 0;
}
五、C++中的静态成员函数
静态成员函数是用 static 修饰的类成员函数。它是类级别的行为,与具体对象无关。
静态成员函数的特点:
- 不依赖对象:可以通过类名直接调用,无需实例化对象。
- 只能访问静态成员:静态函数不能访问非静态成员变量或调用非静态成员函数。
- 共享性:静态成员函数在类的所有对象之间共享。
- 作用域限制:只能访问与类相关的静态数据或静态成员。
静态成员函数的基本用法:
#include <iostream>
class MyClass {
public:static int count; // 静态成员变量static void printCount() { // 静态成员函数std::cout << "Total objects created: " << count << std::endl;}
};int MyClass::count = 0;int main() {MyClass::count = 5; // 直接通过类名访问静态成员变量MyClass::printCount(); // 直接通过类名调用静态成员函数return 0;
}
静态成员函数访问静态变量:
#include <iostream>class MyClass {
private:static int count; // 静态成员变量
public:static void incrementCount() { count++; } // 修改静态成员变量static int getCount() { return count; } // 获取静态成员变量
};// 静态成员变量定义和初始化
int MyClass::count = 0;int main() {MyClass::incrementCount(); // 调用静态函数MyClass::incrementCount();std::cout << "Count: " << MyClass::getCount() << std::endl;return 0;
}
六、C++中普通成员函数和静态成员函数的区别
七、C++中的const成员变量
const 成员变量的定义:
- const 成员变量是类中的常量,其值一旦初始化后便不能更改。
- const 成员变量通常需要在构造函数的初始化列表中进行初始化。
const 成员变量的特点:
- 不可更改:一旦初始化,值不可修改。
- 初始化方式:只能通过构造函数的初始化列表进行初始化,不能在构造函数的主体中赋值。
- 作用范围:它的作用域与普通成员变量相同,但只能被读取。
#include <iostream>class MyClass {
private:const int value; // const 成员变量
public:// 使用初始化列表对 const 成员变量初始化MyClass(int v) : value(v) {}void printValue() const {std::cout << "Value: " << value << std::endl;}
};int main() {MyClass obj(42);obj.printValue(); // 输出 Value: 42// obj.value = 10; // 错误:无法修改 const 成员变量return 0;
}
八、C++中的const 成员函数
const 成员函数的定义:
- const 成员函数是一个不会修改类中任何非静态成员变量的函数。
- 在函数声明或定义后加 const 关键字来修饰该函数。
const 成员函数的特点:
- 不能修改成员变量:在函数内不能更改任何非 mutable 的成员变量。
- 只能调用其他 const 成员函数:在 const 成员函数中不能调用非 const 成员函数。
#include <iostream>class MyClass {
private:int value;
public:MyClass(int v) : value(v) {}int getValue() const { // const 成员函数return value;}void setValue(int v) { // 非 const 成员函数value = v;}
};int main() {const MyClass obj(10); // const 对象std::cout << "Value: " << obj.getValue() << std::endl; // 可以调用 const 成员函数// obj.setValue(20); // 错误:const 对象不能调用非 const 成员函数return 0;
}
普通对象也可以调用 const 成员函数,但 const 对象只能调用 const 成员函数。
int main() {MyClass obj(10); // 普通对象std::cout << "Value: " << obj.getValue() << std::endl; // 可以调用 const 成员函数obj.setValue(20); // 可以调用非 const 成员函数std::cout << "Updated Value: " << obj.getValue() << std::endl;return 0;
}
const 成员函数可以调用其他 const 成员函数,但不能调用非 const 成员函数。
#include <iostream>class MyClass {
private:int value;
public:MyClass(int v) : value(v) {}int getValue() const { return value; }void printValue() const {std::cout << "Value: " << getValue() << std::endl; // 调用另一个 const 成员函数}
};int main() {MyClass obj(42);obj.printValue();return 0;
}
如果类的成员变量用 mutable 修饰,则即使在 const 成员函数中也可以修改它。
#include <iostream>class MyClass {
private:mutable int mutableValue; // 可变成员变量
public:MyClass(int v) : mutableValue(v) {}void modifyValue() const {mutableValue++; // 在 const 成员函数中修改 mutable 成员std::cout << "Mutable Value: " << mutableValue << std::endl;}
};int main() {const MyClass obj(10);obj.modifyValue(); // 修改 mutable 成员变量return 0;
}
九、C++中构造函数的初始化列表
C++ 中,构造函数的初始化列表 是一种在对象构造时初始化类成员的方式。它提供了比在构造函数体内赋值更高效和灵活的初始化方式,特别是对于 const 成员、引用类型成员和基类的初始化至关重要。
1.初始化列表的语法
初始化列表紧跟构造函数的声明,使用冒号 : 开始,并列出成员变量或基类的初始化表达式。
class ClassName {
private:int member1;int member2;
public:// 构造函数使用初始化列表ClassName(int a, int b) : member1(a), member2(b) {// 构造函数体}
};
2.初始化列表的特点
效率高:
- 初始化列表直接调用构造函数或赋值初始化成员变量,避免了默认构造和后续赋值的过程。
- 对于复杂对象(如类类型成员),这种方式更高效。
适用性强:
- 可以初始化const 成员变量。
- 可以初始化引用类型成员变量。
- 必须用于基类构造函数调用和成员对象的构造。
成员初始化顺序:
- 成员的初始化顺序与它们在类中声明的顺序一致,而非在初始化列表中的顺序。
- 建议按照声明顺序书写初始化列表,以避免潜在的错误和混淆。
3.普通成员变量的初始化
#include <iostream>class MyClass {
private:int x;int y;
public:// 使用初始化列表初始化成员变量MyClass(int a, int b) : x(a), y(b) {}void print() {std::cout << "x: " << x << ", y: " << y << std::endl;}
};int main() {MyClass obj(10, 20);obj.print(); // 输出: x: 10, y: 20return 0;
}
4.初始化 const 成员变量
const 成员变量必须在对象构造时完成初始化,且不能在构造函数体内赋值。
#include <iostream>
class MyClass {
private:const int value; // const 成员变量
public:MyClass(int v) : value(v) {} // 初始化列表初始化void print() {std::cout << "Value: " << value << std::endl;}
};int main() {MyClass obj(42);obj.print(); // 输出: Value: 42return 0;
}
5.初始化引用成员变量
引用类型的成员变量必须通过初始化列表进行初始化
#include <iostream>
class MyClass {
private:int& ref; // 引用类型成员
public:MyClass(int& r) : ref(r) {}void print() {std::cout << "Reference value: " << ref << std::endl;}
};int main() {int x = 100;MyClass obj(x);obj.print(); // 输出: Reference value: 100return 0;
}
6.初始化类类型成员变量
当类中包含其他类类型的成员时,这些成员的构造函数只能通过初始化列表调用。
#include <iostream>class Member {
private:int value;
public:Member(int v) : value(v) {std::cout << "Member constructed with value: " << value << std::endl;}
};class MyClass {
private:Member member; // 类类型成员
public:MyClass(int v) : member(v) {} // 初始化列表调用 Member 的构造函数
};int main() {MyClass obj(42);return 0;
}
输出:
Member constructed with value: 42
7.初始化基类和虚基类
派生类构造函数必须通过初始化列表调用基类的构造函数,尤其是基类没有默认构造函数时。
#include <iostream>class Base {
private:int value;
public:Base(int v) : value(v) {std::cout << "Base constructed with value: " << value << std::endl;}
};class Derived : public Base {
public:Derived(int v) : Base(v) { // 初始化列表调用基类构造函数std::cout << "Derived constructed" << std::endl;}
};int main() {Derived obj(42);return 0;
}
输出:
Base constructed with value: 42
Derived constructed
8.初始化列表的成员初始化顺序
成员变量的初始化顺序与它们在类中声明的顺序一致,而不是初始化列表的顺序。
#include <iostream>
class MyClass {
private:int a;int b;
public:MyClass(int x, int y) : b(y), a(x) { // 初始化顺序仍是 a -> bstd::cout << "a: " << a << ", b: " << b << std::endl;}
};int main() {MyClass obj(1, 2); // 输出: a: 1, b: 2return 0;
}
十、C++中的浅拷贝操作
浅拷贝(Shallow Copy)是C++中对象复制的一种方式,它复制对象中的非动态成员或指针成员的地址,而不是指针指向的实际内容。这种方式简单且高效,但可能带来潜在的问题,例如多个对象共享同一块内存区域时的资源冲突。
浅拷贝的特点:
- 成员逐位复制: 浅拷贝直接将源对象的所有成员逐位复制到目标对象,包括指针的地址。
- 效率高: 浅拷贝通常只需完成简单的内存操作,无需额外的深层处理。
- 潜在问题: 由于共享了相同的动态内存,可能导致双重释放或数据不一致等问题。
浅拷贝一般由编译器自动生成的拷贝构造函数或赋值运算符完成,例如:
#include <iostream>
#include <cstring> // For std::strcpyclass ShallowCopyExample {
private:char* data;public:// 构造函数ShallowCopyExample(const char* initValue) {data = new char[strlen(initValue) + 1];std::strcpy(data, initValue);std::cout << "Constructor: Allocated memory for " << data << std::endl;}// 默认拷贝构造函数(浅拷贝)ShallowCopyExample(const ShallowCopyExample& other) = default;// 默认赋值运算符(浅拷贝)ShallowCopyExample& operator=(const ShallowCopyExample& other) = default;// 打印数据void print() const {std::cout << "Data: " << data << std::endl;}// 析构函数~ShallowCopyExample() {std::cout << "Destructor: Deleting memory for " << data << std::endl;delete[] data; // 如果多个对象共享同一块内存,这里会出错}
};int main() {ShallowCopyExample obj1("Hello");ShallowCopyExample obj2 = obj1; // 调用浅拷贝构造函数obj2.print();return 0; // 退出时,可能发生双重释放错误
}
输出示例:
Constructor: Allocated memory for Hello
Data: Hello
Destructor: Deleting memory for Hello
Destructor: Deleting memory for Hello // 可能导致崩溃
十一、C++中的深拷贝操作
深拷贝(Deep Copy)是C++中一种对象复制策略,其核心思想是复制对象中的数据内容,而不是直接共享指针或引用的内存地址。深拷贝的目的是确保每个对象都有自己独立的资源,避免资源冲突或双重释放等问题。
深拷贝的特点:
- 独立性: 深拷贝为新对象分配新的内存并复制数据,因此新旧对象互不干扰。
- 安全性: 深拷贝避免了浅拷贝中常见的资源管理问题,如双重释放或数据污染。
- 代价: 深拷贝通常比浅拷贝消耗更多的资源和时间,因为它需要分配新的内存并复制数据。
深拷贝的实现:
#include <iostream>
#include <cstring> // For std::strcpyclass DeepCopyExample {
private:char* data; // 动态分配的资源public:// 构造函数DeepCopyExample(const char* initValue) {data = new char[strlen(initValue) + 1];std::strcpy(data, initValue);std::cout << "Constructor: Allocated memory for " << data << std::endl;}// 深拷贝构造函数DeepCopyExample(const DeepCopyExample& other) {data = new char[strlen(other.data) + 1];std::strcpy(data, other.data);std::cout << "Copy Constructor: Allocated new memory for " << data << std::endl;}// 深拷贝赋值运算符DeepCopyExample& operator=(const DeepCopyExample& other) {if (this != &other) { // 避免自我赋值delete[] data; // 释放已有内存data = new char[strlen(other.data) + 1];std::strcpy(data, other.data);std::cout << "Assignment Operator: Re-allocated memory for " << data << std::endl;}return *this;}// 打印数据void print() const {std::cout << "Data: " << data << std::endl;}// 析构函数~DeepCopyExample() {std::cout << "Destructor: Deleting memory for " << data << std::endl;delete[] data;}
};int main() {DeepCopyExample obj1("Hello"); // 构造对象DeepCopyExample obj2 = obj1; // 调用拷贝构造函数obj2.print();DeepCopyExample obj3("World");obj3 = obj1; // 调用赋值运算符obj3.print();return 0;
}
输出结果:
Constructor: Allocated memory for Hello
Copy Constructor: Allocated new memory for Hello
Data: Hello
Constructor: Allocated memory for World
Assignment Operator: Re-allocated memory for Hello
Data: Hello
Destructor: Deleting memory for Hello
Destructor: Deleting memory for Hello
Destructor: Deleting memory for Hello
深拷贝与浅拷贝的比较
相关文章:
C++中类和对象的细节原理
文章目录 一、C中的构造函数二、C中的析构函数三、两者的配合与注意事项四、C中的静态成员变量五、C中的静态成员函数六、C中普通成员函数和静态成员函数的区别七、C中的const成员变量八、C中的const 成员函数九、C中构造函数的初始化列表十、C中的浅拷贝操作十一、C中的深拷贝…...
解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题
解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时,调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误: Model inference er…...
OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
windows和LINUX下校验文件的哈希值(MD5、SHA256)
可以通过两个文件的哈希值来对比两个文件是不是一模一样,有没有缺失 1、windows CertUtil -hashfile 文件路径 MD5 CertUtil -hashfile 文件路径 SHA256 2、Liunx 校验当前目录下所有文件 sha256sum . 校验指定文件名 sha256sum 文件名...
〔 MySQL 〕视图
以下是上述文章的目录: 一、视图概述 视图的定义 二、基本使用 创建视图查询视图修改视图影响基表查询验证删除视图 三、视图规则和限制 命名规则数量限制索引和触发器安全性ORDER BY规则与表一起使用 四、实战案例 牛客实战OJ修改基表影响视图查询验证删除…...
嵌入式硬件产品:CC254x 蓝牙升级
目录 固件更新 OAD原理 作者简介 固件更新 支持固件更新的CC2541芯片中, 包括三段代码: Boot Image Manager(BIM)、ImageA、Im...
Drag and Drop API 实现 JavaScript 中的原生拖放功能
理解什么是拖放,我们先做个简单的实验。鼠标移动到页面左上角“CSDN” 图片上方,点击左键不放开,拖动鼠标,发现图片随着鼠标移动,松开鼠标时,图片消失。 一、拖放(Drag and Drop)有…...
人脸检测的若干思考!!!
1.目前主要有人脸检测方法分类? 主要包含两类:传统人脸检测算法和基于深度学习的人脸检测算法。 传统人脸检测算法主要可以分为4类: 基于知识、模型、特征和外观的人脸检测方法; 基于深度学习的方法:基于级联CNN的人脸…...
【时间序列分析】斯皮尔曼(Spearman)相关系数理论基础及python代码实现
文章目录 1. 斯皮尔曼相关系数1.1 公式定义1.2 计算过程1.3 计算示例1.4 注意事项(当有重复值时) 2. 优缺点2.1 优点2.2 缺点 3. 适用场景4. Python代码实现4.1 调用scipy库 5 思考5.1 什么是单调关系?与线性关系的区别是什么?5.2…...
python | linux | ModuleNotFoundError: No module named ‘WFlib‘ |找不到模块
问题: (base) beautyby521-7:~/Website-Fingerprinting-Library-master$ bash scripts/NetCLR.sh Traceback (most recent call last):File "/home/beauty/Website-Fingerprinting-Library-master/exp/pretrain.py", line 8, in <module>from WFli…...
B-TREE详解
B - tree 的详细结构特点 节点结构细节 关键字存储方式:B - tree 节点中的关键字是按照一定顺序排列的,这个顺序可以是升序或者降序。例如,在一个以数字为关键字的 B - tree 中,关键字从左到右依次增大。每个关键字都有一个分隔作…...
Kotlin复习
一、Kotlin类型 1.整数 2.浮点 显示转换: 所有数字类型都支持转换为其他类型,但是转换前会检测长度。 toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double 不同进制的数字表示方法(为了提高…...
批处理文件的创建与编辑方法
批处理命令保存在以BAT为扩展名地文本文件中,因此可以使用任何字处理软件创建、编辑批处理文件,如Word、WinHex、Editpuls等。 案例一 使用copy con命令创建批处理文件 ”copy con“是一个功能简单、易于使用的创建文本文件命令,命令中”con…...
Spring Boot集成Kafka:最佳实践与详细指南
文章目录 一、生产者1.引入库2.配置文件3.配置类PublicConfig.javaMessageProducer.java 4.业务处理类 三、消费者1.引入库2.配置类PublicConfig.javaMessageConsumer.java 3.业务类 一、生产者 1.引入库 引入需要依赖的jar包,引入POM文件: <depend…...
maven 中 有历史模块缓存 怎么清
Maven 在运行时会将一些数据保存在本地仓库中,以加快构建过程。其中一部分是项目的依赖项,还有就是“历史模块缓存”。这些缓存信息保存在本地仓库的 _remote.repositories 文件中。 解决方案: 手动删除缓存文件: 进入你的Maven本…...
云计算HCIP-OpenStack04
书接上回: 云计算HCIP-OpenStack03-CSDN博客 12.Nova计算管理 Nova作为OpenStack的核心服务,最重要的功能就是提供对于计算资源的管理。 计算资源的管理就包含了已封装的资源和未封装的资源。已封装的资源就包含了虚拟机、容器。未封装的资源就是物理机提…...
【信息系统项目管理师-论文真题】2015下半年论文详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论题一:大项目或多项目的成本管理解题思路写作要点论题二:项目的采购管理解题思路写作要点论题一:大项目或多项目的成本管理 随着移动互联网、物联网、云计算、大数据等新一代信息技术的广泛应用,我国目前…...
C# 面试中常见递归算法
前言 今天我们主要总结一下C#面试中常见递归算法。 C#经典十大排序算法(完结) C#递归算法计算阶乘的方法 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。180…...
qemu源码解析【02】qom基本概念
目录 qemu源码解析【02】qom基本概念参考资料基本数据结构TypeImplObjectClassObjectTypeInfo qemu源码解析【02】qom基本概念 参考资料 https://blog.csdn.net/u011364612/article/details/53485856qemu中为了模拟各种虚拟设备和总线,采用了面向对象的思想&#…...
C++算法第八天
本篇文章我们继续学习c算法 目录 第一题 题目链接 题目展示 代码原理 代码编写 第二题 题目链接 题目展示 代码原理 代码编写 第三题 题目链接 题目展示 代码原理 代码编写 第一题 题目链接 69. x 的平方根 - 力扣(LeetCode) 题目展示…...
大语言模型的常用微调方法
文章目录 数据构造与清洗数据构造方法1.基于 Self-Instruct 方法的数据构造2.面向结构化知识的数据构造 数据清洗方法1.IFD 指标法2. MoDS 方法 2.2 分词器构造2.2.1 分词器概述BPE 分词器WordPiece 分词器Unigram 分词器 2.3 大型语言模型的微调方法前缀调优提示调优P-Tuning …...
安卓获取所有可用摄像头并指定预览
在Android设备中,做预览拍照的需求的时候,我们会指定 CameraSelector DEFAULT_FRONT_CAMERA前置 或者后置CameraSelector DEFAULT_BACK_CAMERA 如果你使用的是平板或者工业平板,那么就会遇到多摄像头以及外置摄像头问题,简单的指…...
Jwt和Session的区别和优缺点
目录 一、Authentication和Authorization的区别 二、用户认证的两种主流方法 ① 、基于session认证流程如下: ②、基于token(令牌)用户认证如下: 三、区别和优缺点 JWT的优点: JWT的缺点: 安全性 …...
如何使用 Python 读取和写入 CSV 文件?
在Python中,处理CSV文件是一项常见的任务,通常用于数据交换和数据存储。 Python的标准库csv模块提供了一种方便的方式来读取和写入CSV文件。 下面我将详细介绍如何使用Python的csv模块来读取和写入CSV文件,并提供一些实际开发中的建议和注意…...
FR2012富芮坤PMU:设置PMU GPIO为输入读取状态;在睡眠功能中读取IO;PMU GPIO设置唤醒源中断
从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...
私有云dbPaaS为何被Gartner技术成熟度曲线标记为“废弃”?
当云计算席卷而来,基于云基础设施的数据库部署也改变了数据库。在传统的私有化部署(On-premises)和公有云部署(Public Cloud)之间,不断融合的混合IT(Mixed IT)形式成为最常见的企业级…...
RabbitMQ 高级特性——延迟队列
文章目录 前言延迟队列延迟队列的概念TTL 死信队列模拟延迟队列设置队列的 TTL设置消息的 TTL 延迟队列插件安装并且启动插件服务使用插件实现延迟功能 前言 前面我们学习了 TTL 和死信队列,当队列中的消息达到了过期时间之后,那么这个消息就会被死信交…...
Perl 引用
Perl 引用 Perl,作为一种灵活而强大的编程语言,广泛用于系统管理、网络编程、GUI开发等领域。在Perl编程中,引用(References)是一个核心概念,它允许变量引用其他数据,从而创建复杂的数据结构&a…...
llama2——微调lora,第一次参考教程实践完成包括训练和模型
前言:磕磕绊绊,不过收获很多,最大的收获就是解决报错error的分析方法和解决思路 1、首先,我参考的是这篇博客:怎样训练一个自己的大语言模型?全网最简单易懂的教程!_开源模型训练出一个语言模型…...
【人工智能数学基础篇】——深入详解矩阵分解:奇异值分解(SVD)与主成分分析(PCA)在数据降维与特征提取中的应用
目录 1. 引言 2. 矩阵分解概述 2.1 矩阵分解的意义 3. 奇异值分解(SVD) 3.1 定义与数学基础 3.2 SVD 的性质 3.3 SVD 在数据降维中的应用 3.4 示例代码:使用 SVD 进行图像压缩 3.5 结果分析 4. 主成分分析(PCA࿰…...
C++常见面试题-初级2
1. C和C有什么区别? C是面向对象的语言,而C是面向过程的语言;C引入new/delete运算符,取代了C中的malloc/free库函数;C引入引用的概念,而C中没有;C引入类的概念,而C中没有࿱…...
R square 的计算方法和一点思考
模型的性能评价指标有几种方案:RMSE(平方根误差)、MAE(平均绝对误差)、MSE(平均平方误差)、R2_score 其中,当量纲不同时,RMSE、MAE、MSE难以衡量模型效果好坏。这就需要用到R2_score࿱…...
梳理你的思路(从OOP到架构设计)_简介EIT造形
目录 1、 复习<基类 /子类>的扩充(extends)结构 典型的<基类/子类>代码结构 <基类/子类>代码结构的变形 2、 从<基类/子类>结构到EIT造形 3、 EIT造形的基本形与变形 1、 复习<基类 /子类>的扩充(extends)结构 典型的<基类/子类>代码…...
梳理你的思路(从OOP到架构设计)_认识EIT造形与内涵
目录 1、 认识类(Class)与内涵 2、 认识EIT造形与内涵 EIT造形: 类造形的组合编辑 复习EIT的基本形与变形编辑 不同内涵 EIT造形 1、 认识类(Class)与内涵 回顾 类(Class)是比较小的造形 各种不同内涵,可以透过类(Class)的形式(Form)来呈现出…...
【FTP】FTP基础知识点
文章目录 一、概述二、 工作原理2.1 两个连接2.2 安全性 三、代码实现:1. 选择合适的库2. 连接配置和初始化3. 连接状态检查4. 重连机制5. 文件操作6. 安全性7. 资源管理 参考: 一、概述 将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机…...
排序算法(7):堆排序
问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 堆排序 堆排序是一种基于堆数据结构的排序算法。堆是一个近似完全二叉树的结构,即除了最后一层外,每一层都必须填满,且最后一层从左往右填充。 堆可以分为大根堆和小根堆。在大根堆中&…...
BERT模型入门(6)语言建模
文章目录 自回归语言建模自编码语言建模 BERT模型在以下两个任务上进行预训练: (1)掩蔽语言建模 (2)下一句预测 让我们逐一了解这两种预训练策略是如何工作的。在介绍掩蔽语言模型任务之前,首先让我们了…...
RNN LSTM Seq2Seq Attention
非端到端: data -》 cleaning -》 feature Engining (70%-80%工作 设计特征)-》 分类器 -》预测 端到端 End-to-End: data -》 cleaning -》Deep learning(表示学习,从数据中学习特征) -》…...
go语言使用websocket发送一条消息A,持续接收返回的消息
在Go语言中实现一个WebSocket客户端,可以使用gorilla/websocket这个非常流行的库来处理WebSocket连接。下面是一个简单的示例,展示了如何创建一个WebSocket客户端,向服务器发送消息"A",并持续接收来自服务器的响应。 首…...
音频进阶学习八——傅里叶变换的介绍
文章目录 前言一、傅里叶变换1.傅里叶变换的发展2.常见的傅里叶变换3.频域 二、欧拉公式1.实数、虚数、复数2.对虚数和复数的理解3.复平面4.复数和三角函数5.复数的运算6.欧拉公式 三、积分运算1.定积分2.不定积分3.基本的积分公式4.积分规则线性替换法分部积分法 5.定积分计算…...
沟通的艺术,学会转移矛盾
我的一位好友,资深项目经理,同时也是我公益课程的热心志愿者,最近向我倾诉了他在团队沟通上的挑战。 他发现,尽管辅导学员时感到轻松愉快,但与自己团队成员的沟通却充满挫折。 我询问了他的沟通方式,他解释…...
测评|携程集团25年社招在线测评北森题库、真题分析、考试攻略
携程集团社招入职测评北森题库主要考察以下几个方面: 1. **言语理解**:这部分主要测试应聘者运用语言文字进行思考和交流、迅速准确地理解和把握文段要旨的能力。 2. **资料分析**:包括文字题和图表题,考察应聘者快速找出关键信息…...
C++(进阶) 第4章 map和set的使⽤
C(进阶) 第4章 map和set的使⽤ 文章目录 前言一、序列式容器和关联式容器二、set1. insert2.迭代器遍历3.范围for4.erase5.count6.lower_bound和upper_bound 三、multiset总结 前言 上一篇博客写了二叉搜索树,这一篇博客会在上一篇博客原来的上在深入介…...
数独游戏app制作拆解(之三)——数字候选区实现
所谓的数据候选区就是这个: 数字候选区功能及实现: 说明:这部分其实也是textview. 本区功能: 一、实现数字显示到显示区。点击显示区选定某个格子后,再点击这里的数字,会在格子内显示相应的数字。在编辑…...
数据结构——排序
*排序属于数据的运算 1、定义:将一组杂乱无章的数据按一定规律顺次排列一起,即将无序序列排成一个有序序列的运算。 (如果参加排序的数据结构包含多个数据域,那么排序往往是针对其中某个域而言) 2、排序的应用十分广泛:程序中间接应用(二分查找、最短路径、最小生成树…...
制造业4.0:AI与机器人如何重塑生产线
引言:从传统到未来的转型 在轰鸣的生产线上,传统制造业曾以规模化生产和成本效益为核心竞争力,推动了全球工业化进程。然而,面对现代市场的多样化需求和激烈竞争,这种模式正暴露出越来越多的局限性:产能过剩…...
Fastdfs V6.12.1集群部署(arm/x86均可用)
文章目录 一、 Fastdfs 介绍二、部署 信息三、步骤tracker/storage 机器的 compose 内容storage 机器的 composetracker 与 storage 启动目录层级与配置文件测试测试集群扩容与缩减注意事项 一、 Fastdfs 介绍 FastDFS 是一款高性能的分布式文件系统,特别适合用于存…...
【学习笔记】深入浅出详解Pytorch中的View, reshape, unfold,flatten等方法。
文章目录 一、写在前面二、Reshape(一)用法(二)代码展示 三、Unfold(一)torch.unfold 的基本概念(二)torch.unfold 的工作原理(三) 示例代码(四&a…...
解决Presto dirver timestamp时区问题
#bigdata/metabase 一、背景介绍 1、Presto版本 使用阿里云集群的版本 EMR-5.4.2,Presto的版本为338; Facebook后续不再维护,Trino 351为首个版本 2、Metabase版本 历史版本为0.38.4,新版本为0.51.5 3、0.38.4 cast to time…...
【优选算法】Prefix-Kage:前缀和的算法影(上)
文章目录 1.概念解析2.代码实现2.1【模版】前缀和(一维)2.1.1 原理2.1.2 代码实现 2.2【模版】前缀和(二维)2.2.1 原理2.2.2 代码实现 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本篇是优选算…...