C++ 八股(整理记录)
1. 指针和引用的区别
定义与初始化:
指针:可以声明时不初始化,并且可以在之后指向任何同类型的变量。指针是一个变量,它存储的是另一个变量的地址。
int a = 10;
int* p; // 声明一个指向int的指针
p = &a; // 将p指向变量a的地址
引用:一旦被创建,就必须初始化,并且从一而终地引用同一个对象。引用更像是已有变量的一个别名。
int a = 10;
int& ref = a; // 创建一个对a的引用
重定向:
指针:可以改变指针所指向的对象,即可以重新赋值给指针使其指向不同的内存地址。
int b = 20;
p = &b; // 现在p指向了b
引用:一旦引用被初始化为一个对象,就不能再指向其他对象。
内存地址操作:
指针:可以通过*(解引用运算符)访问或修改指针指向的值,使用&获取指针本身的地址。
引用:不能获取引用的地址,也不能创建指向引用的指针。引用直接作用于其绑定的对象。
空值:
指针:可以具有nullptr值,表示不指向任何有效的内存地址。
引用:必须总是引用某个有效的对象,不能是null。
2 . new / delete 与 malloc / free的异同
相同点
内存分配:
两者都可以用来动态地从堆(Heap)中分配内存。
手动管理:
都需要程序员手动释放分配的内存以避免内存泄漏。
不同点
1. 语法与类型安全
new/delete:
new 是一个操作符,它不仅分配内存,还会调用对象的构造函数来初始化新创建的对象。
delete 也会调用对象的析构函数,然后释放内存。
支持类型安全的内存分配和释放,能够自动计算所需分配的字节数。MyClass* obj = new MyClass(); // 分配并构造对象
delete obj; // 调用析构函数并释放内存
malloc/free:
malloc 和 free 是标准库函数,只负责分配和释放内存块,不会调用任何构造函数或析构函数。
返回的是 void* 类型,需要显式转换为正确的类型,并且需要手动计算所需分配的字节数。MyClass* obj = (MyClass*) malloc(sizeof(MyClass)); // 只分配内存
if(obj != nullptr) {new(obj) MyClass(); // 使用placement new调用构造函数
}
free(obj); // 只释放内存,不调用析构函数
2. 构造与析构
new/delete:
自动调用对象的构造函数和析构函数。
malloc/free:
不会自动调用构造函数或析构函数。如果需要,可以使用“placement new”来手动调用构造函数,并手动调用析构函数。
3. 错误处理
new:
如果内存分配失败,new 会抛出 std::bad_alloc 异常(除非使用了 nothrow 版本的 new,这种情况下会返回 nullptr)。MyClass* obj = new(std::nothrow) MyClass();
if(obj == nullptr) {// 处理内存不足的情况
}
malloc:如果内存分配失败,malloc 返回 nullptr,因此需要检查返回值是否为 nullptr 来判断分配是否成功。
变量声明和定义区别?
变量声明(Declaration)
声明是指告诉编译器某个变量的名字及其类型,但不一定为该变量分配存储空间。声明的主要目的是使编译器知道该变量的存在,以便在代码中可以使用它。通常,声明出现在头文件(.h 或 .hpp)中,或者在一个源文件中引用另一个源文件中的变量时使用。
特点:
告知编译器:声明只是告诉编译器这个变量存在,并指定了它的类型。
不分配内存:通常不会为声明的变量分配实际的存储空间(除非是外部链接的情况,如extern关键字)。
允许多次声明:同一个变量可以在多个地方声明,只要这些声明一致即可。
示例:
// 在头文件或源文件中声明一个外部变量
extern int globalVar; // 声明了一个名为globalVar的int型变量,但未定义它
变量定义(Definition)
定义不仅包括声明的所有信息,还包括为变量分配实际的存储空间。定义确保了变量在程序运行时有一个具体的内存位置来存储其值。
特点:
分配内存:定义会为变量分配实际的存储空间。
初始化可选:可以在定义时对变量进行初始化。
只能定义一次:每个变量只能被定义一次,否则会导致重复定义错误。
示例:
// 在源文件中定义并初始化一个全局变量
int globalVar = 10; // 定义了一个名为globalVar的int型变量,并分配了存储空间// 在函数内部定义局部变量
void someFunction() {int localVar = 5; // 定义并初始化了一个局部变量
}
结合使用
在实际编程中,声明和定义经常结合使用,尤其是在大型项目中,通过头文件声明变量并在相应的源文件中定义它们,可以实现模块化设计。
示例:
假设你有一个项目包含两个文件:main.cpp 和 globals.h。
globals.h 文件内容:
#ifndef GLOBALS_H
#define GLOBALS_Hextern int globalVar; // 声明一个外部变量#endif
main.cpp 文件内容:
#include "globals.h"int globalVar = 20; // 定义并初始化全局变量int main() {// 使用globalVarreturn 0;
}
在这个例子中,globals.h 中仅声明了 globalVar,而 main.cpp 中则定义并初始化了它。这样做的好处是可以将变量的声明与定义分离,便于管理和维护大型项目。
指针常量和常量指针的区别
1. 指针常量(Pointer Constant)
指针常量是指一个指针本身是常量,即该指针的地址值不能改变,但可以通过该指针修改其所指向的内容。
特点:
- 指针本身的地址值是固定的,一旦初始化后就不能再指向其他地址。
- 可以通过该指针修改其所指向的对象的值。
定义与使用:
int a = 10;
int b = 20;
// 定义一个指针常量,并初始化为指向a
int* const p = &a; // p是一个指向int的常量指针
*p = 30; // 合法:可以通过p修改a的值
// p = &b; // 非法:不能改变p所指向的地址
2. 常量指针(Constant Pointer)
常量指针是指一个指针指向的内容是常量,即不能通过该指针修改其所指向的对象的值,但指针本身可以指向其他地址。
特点:
- 不能通过该指针修改其所指向的对象的值。
- 指针本身可以重新赋值,指向其他地址。
定义与使用:
int a = 10;
int b = 20;
// 定义一个常量指针,并初始化为指向a
const int* p = &a; // p是一个指向常量int的指针
// *p = 30; // 非法:不能通过p修改a的值
p = &b; // 合法:可以改变p所指向的地址
C++ 中 const
和 static
的作用
在C++中,const
和 static
是两个非常重要的关键字,它们各自有不同的用途和作用。理解它们的作用可以帮助你编写更高效、安全和模块化的代码。
const
关键字
const
用于声明常量,即其值不能被修改的变量或对象。它可以应用于不同的上下文,如变量、函数参数、返回值、成员函数等。
主要用途:
1. 常量变量
声明一个常量变量,一旦初始化后就不能再改变其值。
const int MAX_SIZE = 100;
2. 常量指针
指向常量数据的指针,或者指针本身是常量。
const int* p1; // 指向常量数据的指针
int* const p2 = &x; // 指针常量,指向不可变地址
const int* const p3 = &x; // 常量指针指向常量数据
3. 常量成员函数
成员函数标记为 表示该函数不会修改类的任何成员变量(除非这些变量被声明为 mutable
)。
class MyClass {
public:int getValue() const { return value; } // 常量成员函数
private:int value;
};
4. 函数参数和返回值
函数参数或返回值可以声明为 const
,以确保不会意外修改传入的数据。
void process(const std::string& str) { /* 使用str但不修改它 */ }
const std::string& getName() const { return name; }
static
关键字
static
关键字有多种用途,具体取决于它应用的上下文。它可以用于全局变量、局部变量、函数、类成员变量和成员函数。
主要用途:
1. 静态全局变量
在文件范围内声明的静态变量只能在该文件内访问,无法从其他文件访问。
static int globalVar = 10; // 只能在当前文件中访问
2. 静态局部变量
局部静态变量在第一次进入作用域时初始化,并且在整个程序生命周期内保持其值,即使离开该作用域也不会销毁。
void foo() {static int count = 0; // 只初始化一次++count;std::cout << "Count: " << count << std::endl;
}
3. 静态成员变量
类的静态成员变量属于类本身而不是某个特定的对象实例,所有对象共享同一个静态成员变量。
class MyClass {
public:static int sharedValue; // 静态成员变量声明
};int MyClass::sharedValue = 0; // 定义和初始化
4. 静态成员函数
类的静态成员函数属于类本身,可以通过类名直接调用,不需要创建类的实例。静态成员函数只能访问静态成员变量和其他静态成员函数。
class MyClass {
public:static void doSomething() { /* 静态成员函数 */ }
};MyClass::doSomething(); // 直接通过类名调用
5. 静态函数
在文件范围内声明的静态函数只能在该文件内访问,无法从其他文件访问。
static void helperFunction() { /* 仅在当前文件中可见 */ }
总结
const
:
- 用于定义常量,确保某些数据或行为在程序运行期间不会被修改。
- 提高代码的安全性和可读性,防止意外修改。
- 可应用于变量、指针、成员函数等多种上下文。
static
:
- 用于限制变量或函数的作用范围,使其只在声明它的文件或类内部有效。
- 允许定义持久存在的局部变量和共享的类成员。
- 提供了一种管理状态和资源的有效方式,特别是在面向对象编程中。
C++中的重载、重写(覆盖)和隐藏的区别
1. 重载(Overloading)
重载是指在同一作用域内定义多个具有相同名称但参数列表不同的函数。编译器通过参数列表(包括参数的数量、类型和顺序)来区分这些函数。
特点:
- 函数名相同,但参数列表不同。
- 返回值类型可以相同也可以不同,但不能仅依靠返回值类型来区分重载函数。
- 通常用于提供同一操作的不同实现方式。
示例:
#include <iostream>void print(int x) {std::cout << "Integer: " << x << std::endl;
}void print(double x) {std::cout << "Double: " << x << std::endl;
}void print(const char* str) {std::cout << "String: " << str << std::endl;
}int main() {print(42); // 调用 void print(int)print(3.14); // 调用 void print(double)print("Hello"); // 调用 void print(const char*)
}
2. 重写(覆盖,Overriding)
重写发生在派生类中,重新定义基类中的虚函数。重写的目的是实现多态性,使得通过基类指针或引用调用时能够根据实际对象的类型调用相应的函数。
特点:
基类和派生类中函数名、参数列表和返回类型必须完全相同。
基类中的函数必须声明为 virtual,或者使用 override 关键字明确表示重写。
通过基类指针或引用调用时,会根据实际对象类型调用相应的函数。
示例:
#include <iostream>class Base {
public:virtual void show() const {std::cout << "Base class show function" << std::endl;}
};class Derived : public Base {
public:void show() const override { // 使用 override 明确表示重写std::cout << "Derived class show function" << std::endl;}
};int main() {Base base;Derived derived;Base* ptr = &derived;ptr->show(); // 输出 "Derived class show function"
}
3. 隐藏(Hiding)
隐藏是指派生类中的成员函数或变量与基类中的同名成员函数或变量具有相同的名称,但参数列表不同或没有 virtual 关键字,导致派生类中的成员隐藏了基类中的成员。
特点:
- 派生类中的成员函数或变量与基类中的同名成员函数或变量具有相同的名称。
- 如果派生类中的函数参数列表不同,则不会构成重载,而是直接隐藏基类中的同名函数。
- 如果派生类中的函数参数列表相同但没有 virtual关键字,则也会隐藏基类中的同名函数。
示例:
#include <iostream>class Base {
public:void show() const {std::cout << "Base class show function" << std::endl;}void display(int x) const {std::cout << "Base class display function with int: " << x << std::endl;}
};class Derived : public Base {
public:void show() const { // 隐藏基类中的 show 函数std::cout << "Derived class show function" << std::endl;}void display(double x) const { // 隐藏基类中的 display 函数std::cout << "Derived class display function with double: " << x << std::endl;}
};int main() {Derived d;d.show(); // 输出 "Derived class show function"d.display(3.14); // 输出 "Derived class display function with double: 3.14"// 使用基类指针调用显示隐藏的行为Base* basePtr = &d;basePtr->show(); // 输出 "Base class show function"basePtr->display(5); // 输出 "Base class display function with int: 5"
}
实际应用中的注意事项
重载:
- 主要用于提供同一操作的不同实现方式。
- 通过不同的参数列表来区分函数。
重写:
- 实现多态性,确保派生类能够提供特定于自身的实现。
- 必须使用 virtual 或 override 关键字。
隐藏:
- 需要小心处理,避免意外隐藏基类中的成员。
- 可以通过显式调用基类成员来避免隐藏问题。
浅拷贝(Shallow Copy)
浅拷贝是指简单地将一个对象的数据成员逐个复制到另一个对象中。如果对象中有指针成员变量,浅拷贝只会复制指针的值(即地址),而不会为指针所指向的内容分配新的内存空间。因此,两个对象中的指针会指向同一块内存区域。
特点:
- 只复制对象的数据成员,不复制指针所指向的实际数据。
- 如果对象中有指针成员变量,两个对象中的指针会指向同一块内存区域。
- 容易导致悬空指针和内存泄漏问题。
深拷贝(Deep Copy)
深拷贝是指不仅复制对象的数据成员,还会为指针所指向的实际数据分配新的内存空间,并将这些数据复制到新的内存区域。这样,两个对象中的指针会指向不同的内存区域。
特点:
- 不仅复制对象的数据成员,还为指针所指向的实际数据分配新的内存空间。
- 避免了浅拷贝带来的悬空指针和内存泄漏问题。
- 更安全,但可能会增加内存使用量。
类成员初始化方式 | 构造函数的执行顺序 | 为什么用成员初始化列表会快一些
类成员初始化方式
1. 直接初始化:
在声明时直接初始化。
class MyClass {
public:int x = 10; // 直接初始化MyClass() {}
};
2. 成员初始化列表:
在构造函数的参数列表后使用冒号和初始化列表来初始化成员变量。
class MyClass {
public:int x;MyClass() : x(10) {} // 使用成员初始化列表
};
3. 构造函数体内初始化:
在构造函数体内通过赋值操作进行初始化。
class MyClass {
public:int x;MyClass() {x = 10; // 构造函数体内初始化}
};
构造函数的执行顺序
C++中构造函数的执行顺序遵循以下规则:
1. 基类构造函数:
如果当前类是从其他类派生的,则首先调用基类的构造函数。如果存在多个基类,则按照它们在继承列表中的顺序依次调用。
2. 成员变量构造函数:
在进入构造函数体之前,先调用所有成员变量的构造函数。成员变量按照它们在类定义中的声明顺序进行初始化,而不是按照成员初始化列表中的顺序。
3. 构造函数体:
最后执行构造函数体内的代码。
示例:
cpp
深色版本
class Base {
public:Base() { std::cout << "Base constructor" << std::endl; }
};class Derived : public Base {
public:int x;int y;Derived() : x(10), y(20) { // 成员初始化列表std::cout << "Derived constructor" << std::endl;}
};
在这个示例中,构造函数的执行顺序是:
- Base 的构造函数
- x 和 y 的构造函数(按声明顺序,即先 x 后 y)
- Derived 的构造函数体
为什么使用成员初始化列表会快一些
使用成员初始化列表通常比在构造函数体内初始化更快,主要原因如下:
避免默认构造和赋值操作:
- 如果在构造函数体内初始化成员变量,编译器会首先调用该成员变量的默认构造函数来创建它,然后在构造函数体内再对其进行赋值操作。这相当于进行了两次操作:一次默认构造,一次赋值。
- 而使用成员初始化列表可以直接初始化成员变量,跳过默认构造步骤,从而减少一次不必要的构造和赋值操作。
1. 支持常量和引用成员的初始化:
- 常量成员和引用成员必须在声明时或通过成员初始化列表进行初始化,因为它们不能在构造函数体内进行赋值操作。
class MyClass {
public:const int x;int& y;MyClass(int value) : x(value), y(z) {} // 必须使用成员初始化列表
private:int z = 0;
};
2. 支持基类和成员变量的特定初始化:
- 成员初始化列表可以用于指定基类和成员变量的具体初始化方式,这对于某些需要复杂初始化逻辑的情况非常有用。
class Derived : public Base {
public:Derived() : Base(), member1(10), member2(20) {} // 指定基类和成员变量的初始化
};
3. 支持基类和成员变量的特定初始化:
- 成员初始化列表可以用于指定基类和成员变量的具体初始化方式,这对于某些需要复杂初始化逻辑的情况非常有用。
class Derived : public Base {
public:Derived() : Base(), member1(10), member2(20) {} // 指定基类和成员变量的初始化
};
相关文章:
C++ 八股(整理记录)
1. 指针和引用的区别 定义与初始化: 指针:可以声明时不初始化,并且可以在之后指向任何同类型的变量。指针是一个变量,它存储的是另一个变量的地址。 int a 10; int* p; // 声明一个指向int的指针 p &a; // 将p指向变量a的…...
docker部署GPU环境
使用 Docker 部署 GPU 环境涉及到几个关键步骤,以下是详细步骤: 1. 安装 NVIDIA 驱动程序 确保你的系统已经安装了 NVIDIA GPU 驱动。这是使用 GPU 的前提条件。 2. 安装 Docker 和 nvidia-container-toolkit 首先,确保你已经安装了 Docker。然后,安装 NVIDIA Containe…...
单片机裸机编程-时机管理
对于 RTOS 实时操作系统,我们是通过 TASK(任务)进行底层操作的,这与裸机编程中的函数(fun)类似。不同的任务或函数实现不同的功能,在RTOS中,单片机有信号量、队列等不同任务之间的通…...
使用VScode开发STM32:基于CMake(包含标准库和HAL库工程)
使用VScode开发STM32:基于CMake(包含标准库和HAL库工程) 本教程使用VScode作为代码编辑工具、Cmake作为构建系统生成器、Make进行构建系统、使用arm-none-eabi-gcc进行交叉编译、使用OpenOCD作为代码下载与调试工具,最终搭建出适…...
Linux操作与权限2
查看权限控制信息 序号1,表示文件,文件夹权限控制信息 序号2,表示文件,文件夹所属用户 序号3,表示文件,文件夹所属用户组 12345678910d/l/-r/-w/-x/-r/-w/-x/-r/-w/-x/- 权限细节总共分为10个槽位 表格1&…...
解析第十一页
多选707、如图所示组网,SWA、SWB、SWC、SWD运行RSTP,则以下说法正确的是? A、可以在SWB的GE0/0/2端口开启边缘端口,让连接终端的接口快速进入转发状态 B、边缘端口收到BPDU之后会重新参与生成树的计算 C、可以在SWC的GEO/0/2端口开启边缘端口,让连接终端的接口快速进入转…...
SQL之order by盲注
目录 一.order by盲注的原理 二.注入方式 a.布尔盲注 b.时间盲注 三.防御 一.order by盲注的原理 order by子句是用于按指定列排序查询结果,列名或列序号皆可。 order by 后面接的字段或者数字不一样,那么这个数据表的排序就会不同。 order by 盲…...
阻止浏览器的默认缩放机制
在移动端浏览器中,当用户点击输入框(如密码输入框)时,页面可能会自动放大以提高可读性。这种行为通常是由于浏览器的默认缩放机制引起的。要阻止这种自动放大行为,可以采取以下几种方法: 使用 viewport 元…...
python 引用父目录:层级的模块
from pathlib import Path import sys 获取 project 目录 project_dir Path(file).resolve().parent.parent 将 project 目录添加到 sys.path 中 sys.path.append(str(project_dir)) 导入 support 模块 import support support.print_func(“Runoob”)...
实用:查找Linux进程调度统计信息的三个方法
实用:查找Linux进程调度统计信息的三个方法 在现代操作系统中,理解进程调度行为对于优化性能和解决瓶颈问题至关重要。本文将详细介绍如何在Linux系统中获取进程从调度队列中调入(enqueue)和调出(dequeue)…...
以下是自定义针对 Vite + TypeScript 项目的完整路径别名配置流程:
以下是针对 Vite TypeScript 项目的完整路径别名配置流程: 1. 安装必要依赖 bash npm install -D types/node 2. 配置 vite.config.ts typescript // vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from pat…...
基于Matlab实现汽车远近光灯识别的详细步骤及代码示例
以下是一个基于Matlab实现汽车远近光灯识别的详细步骤及代码示例,主要通过图像处理技术来区分远光灯和近光灯。 整体思路 图像预处理:包括读取图像、灰度化、去噪等操作,以提高后续处理的准确性。边缘检测:找出图像中的边缘信息…...
Solidity 开发环境
Solidity 开发环境 Solidity编辑器:Solidity编辑器是⼀种专⻔⽤于编写和编辑Solidity代码的编辑器。常⽤的Solidity编辑器包括 Visual Studio Code、Atom和Sublime Text。以太坊开发环境:以太坊开发环境(Ethereum Development Environment&a…...
Ollama+Cherrystudio+beg-m3+Deepseek R1 32b部署本地私人知识库(2025年2月win11版)
之前综合网络各方面信息得到的配置表: 在信息爆炸的时代,数据安全和个性化需求愈发凸显。搭建本地私人知识库,不仅能确保数据的安全性,还能根据个人需求进行个性化定制,实现知识的高效管理和利用。随着技术的不断发展…...
vue3.0将后端返回的word文件流转换为pdf并导出+html2pdf.js将页面导出为pdf
实现思路 1.将Word文档转换为HTML:mammoth.js,它可以将.docx文件转换为HTML 2.将HTML转换为PDF:使用html2pdf.js将HTML转换为PDF 如果想要相同的效果,也可以把前端页面直接导出转换为pdf: 运用的插件:html2pdf.js 后端…...
【心得】缓存穿透与缓存击穿总是记混,一文从英语单词含义角度分析带你区分清楚!
一句话省流版:缓存穿透的英语为cache penetration,可以翻译为缓存渗透,“渗透”联想到网安的攻击渗透,故缓存穿透是绕过防护进行攻击; 缓存击穿的英语为"cache breakdown",可以翻译为缓存故障,“…...
day02
作业2 为 Activity 设置2种不同的启动模式并通过 adb 命令进行查看任务栈信息,并且打印生命周期方法执行日志 step1:生成第二个Activity和相应配置、 一个是singleTask模式,还一个是mainActivity的默认格式 step2:打印生命周期…...
JavaScript 简单类型与复杂类型-堆和栈
深入理解JavaScript中的简单类型(基本数据类型)与复杂类型(引用数据类型)如何在内存中存储对于编写高效、无误的代码至关重要。本文将探讨这两种类型的差异,以及它们在内存中的存储机制——栈(Stack&#x…...
五、AIGC大模型_04LLaMA-Factory基础知识与SFT实战
1、LLaMA-Factory 基本介绍 1.1 定义 LLaMA-Factory 是一个开源的大型语言模型(LLM)微调框架,旨在帮助开发者和研究人员轻松地对预训练语言模型进行定制化训练和优化 1.2 功能特点 支持多种预训练模型 LLaMA Factory 支持超过 100 种主流的…...
数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例
数字IC后端时钟树综合专题(OCC电路案例分享) 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC? 片上时钟控制器(On-chip Clock Controllers ,OCC),也称为扫描时钟控制器(Scan Clock Con…...
LeetCodehot 力扣热题100 全排列
这段代码的目的是计算给定整数数组的所有全排列(permutations),并返回一个包含所有排列的二维数组。 思路解析 在这段代码中,采用了 深度优先搜索(DFS) 和 回溯 的方法来生成所有的排列。 关键步骤…...
深度学习c++资源库:vector容器,蓝桥杯常用算法sort,unique(排序+去重)
vector容器 1.基本概念 <vector> 是 STL 中的一个容器类,不同于普通数组的静态空间,vector可以动态扩展。 动态扩展:并不是在原空间连接新空间,而是找到更大的内存空间,将原数据拷贝到新空间,释放…...
Postgresql-重置统计信息(reset statistics)
文章目录 理解 PostgreSQL 中的 pg_stat_resetpg_stat_reset 的作用与使用时机pg_stat_reset 所需权限PostgreSQL 重置统计信息的方法重置整个database重置特定表的统计重置特定function的统计重置Statistics Collector:重置 WAL(Write-Ahead Logging)统…...
【Uniapp-Vue3】导入uni-id用户体系
在uniapp官网的uniCloud中下载uni-id用户体系 或者直接进入加载,下载地址:uni-id-pages - DCloud 插件市场 进入以后下载插件,打开HbuilderX 选中项目,点击确定 点击跳过 点击合并 右键uniCloud文件夹下的database文件夹&#x…...
【前沿探索篇七】【DeepSeek自动驾驶:端到端决策网络】
第一章 自动驾驶的"感官革命":多模态神经交响乐团 1.1 传感器矩阵的量子纠缠 我们把8路摄像头+4D毫米波雷达+128线激光雷达的融合称为"传感器交响乐",其数据融合公式可以简化为: def sensor_fusion(cam, radar, lidar):# 像素级特征提取 (ResNet-152…...
Staruml软件的介绍安装uml类图的绘制流程
文章目录 1.uml和staruml之间的关系2.软件的安装3.配置脚本语言4.Staruml创建类图4.反向工程 1.uml和staruml之间的关系 这篇文章主要是介绍这个staruml软件的安装和相关的背景介绍: 我和uml初识于IDEA软件,学习java的你一定用过这个软件,当…...
神经网络发展简史:从感知机到通用智能的进化之路
引言 神经网络作为人工智能的核心技术,其发展历程堪称一场人类对生物大脑的致敬与超越。本文将用"模型进化"的视角,梳理神经网络发展的五大关键阶段,结合具象化比喻和经典案例,为读者呈现一幅清晰的AI算法发展图谱。 一…...
快节奏生活
在当今快节奏的商务环境中,效率成为了决定企业竞争力的关键因素之一。亿可达软件连接平台,以其独特的功能和优势,为职场人士带来了前所未有的便捷与高效,成为了众多用户心中的“宝藏”工具。 1、亿可达:自动化流程的搭…...
Windows 11【1001问】通过Rufus制作Win 11系统安装U盘
随着科技的发展,Windows 11 已经成为许多用户的首选操作系统。在之前的几篇文章中,我们详细探讨了 Windows 11 的概念、安装配置要求以及如何下载 Windows 11 镜像文件,并介绍了六种不同的安装方法。本篇博客将聚焦于使用 ISO 文件安装 Windo…...
spring中手写注解开发(创建对象篇)
说明: 在spring底层中并不是我写的如此,这篇只是我用我自己的方式实现了使用注解组件扫描并且 创建对象,方法并不是很难,可以看一看,欢迎大佬评论 第一步: 我们需要自己写一个注解,我用的是idea…...
DeepSeek进入开源周,分享几点关于开源的思考
最近DeepSeek进入开源周,又把差点被大众遗忘在角落的开源话题拉了出来。 作为一个开源作者,也分享几点关于开源的思考。 AI对开源的影响 开源项目遇到的最大困难 开源项目不应该商业化 你的开源项目是垃圾...
大模型训练中的数据不平衡问题及其解决策略
目录 大模型训练中的数据不平衡问题及其解决策略 一、数据不平衡问题的影响 二、处理数据不平衡问题的方法 1. 过采样(Oversampling) 2. 欠采样(Undersampling) 3. 代价敏感学习(Cost-Sensitive Learning…...
本地部署DeepSeek R1满血版大模型
一、前言 老周上一篇分享了《本地部署DeepSeek R1大模型》,本地受硬件条件限制,只跑了80亿参数量的模型。 1.5b模型基本可以在大部分个人电脑甚至手机中运行,如果你有 6G 显存以上,那么可以部署7b模型,如果有16G显存&…...
外发抄板SCH与PCB检查系列
外发抄板SCH与PCB检查系列 一、检查到手的文件二、PCB与原理图的对应检查1.为什么要查SCH与Pcbdoc的对应?2.查询方法 三、PCB与实物的信号对应检查 一、检查到手的文件 外发出去两块板子:控制板与功率板。 抄板机构返回的文件: 1.互相独立的…...
EX_25/2/25
编写一个如下场景: 有一个英雄Hero类,私有成员,攻击,防御,速度,生命值,以及所有的set get 方法 编写一个 武器 Weapon 类,拥有私有成员攻击力,以及set get 方法 编写一个…...
C# 打印Word文档 – 4种打印方法
Word文档是日常办公和学习中不可或缺的一部分。比如在商务往来中,经常需要打印 Word 文档用于撰写和传递正式的商务信函、合作协议、项目提案等。打印出来的文档便于双方签字盖章,具有法律效力和正式性。本文将提供以下4种通过C# 打印Word文档的方法&…...
ROS的action通信——实现阶乘运算(一)
在ROS中除了常见的话题(topic)通信、服务(server)通信等方式,还有action通信这一方式,由于可以实时反馈任务完成情况,该通信方式被广泛运用于机器人导航等任务中。本文将通过三个小节的分享,实现基于action通信的阶乘运…...
Mac 上安装多版本的 JDK 且实现 自由切换
1.可以通过查看以下目录中的内容,确认当前已经安装的 jdk 版本。 cd /Library/Java/JavaVirtualMachines2.命令行查看 jdk 的安装路径 /usr/libexec/java_home -V3.下载要安装的jdk版本,修改环境变量( cat ~/.bash_profile) # 定义JDK 8和JDK 17的安装路…...
网络编程套接字
目录 一、认识端口号 二、端口号和进程ID 三、TCP/UDP协议 四、网络字节序 五、socket编程接口 5.1socket的常见API 5.2socketaddr结构 六、简单的UDP程序 七、地址转换函数 八、简单的TCP网络程序 九、Tcp协议通讯流程 9.1基于TCP协议的客户端/服务器程序的一般流…...
45.matlab产生正弦叠加信号
,...
Java23种设计模式案例
目录 一、概述 二、创建型模式 (Creational Patterns) 单例模式 (Singleton Pattern) 工厂方法模式 (Factory Method Pattern) 抽象工厂模式 (Abstract Factory Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 三、结构型模式 (Structu…...
计算机毕业设计程序,定制开发服务
我们擅长的开发语言包括Python、C、Golang、Java,以及前端技术如HTML、CSS、JS和Vue。我们的服务内容丰富,能够满足您各种需求,无论是简单的功能开发还是复杂的定制项目,我们都能为您提供专业支持。若有具体需求可联系作者。 链接…...
AI提示词的种类与适合的任务
以下是提示词的主要种类及其适用任务,基于大模型特性与最佳实践总结: 一、基础提示词 零样本提示(Zero-shot Prompting) 形式:直接输入任务指令,不提供示例(如“翻译以下句子:Hello …...
【Kimi】自动生成PPT-并支持下载和在线编辑--全部免费
【Kimi】免费生成PPT并免费下载 用了好几个大模型,有些能生成PPT内容; 有些能生成PPT,但下载需要付费; 目前只有Kimi生成的PPT,能选择模板、能在线编辑、能下载,关键全部免费! 一、用kimi生成PP…...
Maven环境搭建
Maven 1. 概述 ApacheMaven是一个软件项目管理和构建工具。基于项目对象模型(POM)的概念,Maven可以从中心信息中管理项目的构建、报告和文档 理解: maven构建项目(100%)而且帮你完成jar的统一管理。 思考: 原来的jar—…...
Vue面试题
Vue面试题 Vue2.0的生命周期,每个生命周期分别做了哪些事情 create阶段:vue实例被创建。 beforeCreate: 创建前,此时data和methods中的数据都还没有初始化; created:创建完毕,data中有值,未…...
Linux时间日期类指令
1、data指令 基本语法: date : 显示当前时间date %Y : 显示当前年份date %m : 显示当前月份date %d : 显示当前哪一天date “%Y-%m-%d %H:%M:%S" : 显示年月日时分秒date -s 字符串时间 : 设置系统时…...
国标28181协议在智联视频超融合平台中的接入方法
一. 国标28181介绍 国标 28181 协议全称是《安全防范视频监控联网系统信息传输、交换、控制技术要求》,是国内视频行业最重要的国家标准,目前有三个版本: 2011 年:推出 GB/T 28181-2011 版本,为安防行业的前端设备、平…...
pyautogui库的screenshot()函数
# 方法一 screenshot pyautogui.screenshot() screenshot.save("screenshot.png")# 方法二 # 获取屏幕分辨率 screen_width, screen_height pyautogui.size()# 截取桌面屏幕 screenshot pyautogui.screenshot(region(0, 0, screen_width, screen_height)) screens…...
python与C系列语言的差异总结(3)
与其他大部分编程语言不一样,Python使用空白符(whitespace)和缩进来标识代码块。也就是说,循环体、else条件从句之类的构成,都是由空白符加上冒号(:)来确定的。大部分编程语言都是使用某种大括号来标识代码块的。下面的…...