C++初窥门径
const
关键字
一、const
关键字
-
修饰成员变量
-
常成员变量:必须通过构造函数的初始化列表进行初始化,且初始化后不可修改。
-
示例:
class Student { private: const int age; // 常成员变量 public: Student(string name, int age) : age(age) { ... }};
-
-
修饰成员函数
-
常成员函数:
-
不能修改类的成员变量(编译时检查)。
-
可以与普通成员函数构成重载,常对象只能调用常成员函数。
-
-
示例:
class Student { public:const void show() { ... } // 版本1:返回值为const voidconst void show() const { ... } // 版本2:返回值为const void,且是const成员函数void show() const { ... } // 版本3:返回值为void,且是const成员函数void show() { ... } // 版本4:普通成员函数private:std::string name;int age; };const Student stu("Alice", 20); stu.show(); // 调用常成员函数版本
-
-
修饰对象
-
常对象:
-
对象初始化后不可修改成员变量。
-
只能调用常成员函数。
-
-
示例:
const Student stu("Bob", 18); // stu.setAge(19); // 错误:常对象不可修改成员变量 stu.show(); // 正确:调用常成员函数
-
二、static
与const
修饰构造函数和析构函数
构造函数
static
修饰:
构造函数用于初始化对象实例,而
static
成员属于类层级,与对象实例化机制冲突。禁止:C++语法规定构造函数不能是
static
。
const
修饰:
构造函数需要修改对象状态(初始化成员变量),与
const
的不可修改语义矛盾。禁止:构造函数不能声明为
const
。析构函数
static
修饰:
析构函数与对象生命周期绑定,而
static
成员属于类层级,无法处理具体实例的资源释放。禁止:析构函数不能是
static
。
const
修饰:
析构函数需要释放资源(如动态内存),而
const
限制成员变量的修改。禁止:析构函数不能声明为
const
。
三、static
与const
修饰成员变量和函数
-
成员变量
-
static const
成员变量:-
允许同时使用,表示类层级的常量(所有对象共享同一值)。
-
必须在类外初始化(C++11后支持类内初始化)。
-
示例:
class Math { public:static const double PI = 3.14159; // 类内初始化(C++11) };
-
-
-
成员函数
-
static
和const
同时修饰:-
无意义:
static
成员函数不关联对象实例(无this
指针),而const
要求不修改对象状态。 -
禁止:C++语法不允许
static
成员函数声明为const
。
-
-
四、关键对比与注意事项
场景 | const 修饰 | static 修饰 |
---|---|---|
成员变量 | 必须初始化,不可修改 | 类层级变量,所有对象共享 |
成员函数 | 不能修改成员变量,支持重载 | 无this 指针,不能访问非静态成员 |
对象 | 只能调用常成员函数 | 不适用(static 不修饰对象) |
构造函数/析构函数 | 禁止(需修改对象状态) | 禁止(与对象生命周期绑定) |
友元(Friend)
一、 友元(Friend)
1. 核心概念
-
友元函数:允许外部普通函数访问类的私有成员,需在类内用
friend
声明。 -
友元成员函数:允许另一个类的某个成员函数访问当前类的私有成员,需在类内声明该成员函数为友元。
-
友元类:允许另一个类的所有成员函数访问当前类的私有成员,需在类内声明友元类。
2. 特点
-
单向性:友元关系不可逆(若类A是类B的友元,类B不自动成为类A的友元)。
-
无继承性:基类的友元不是派生类的友元。
-
无传递性:若类A是类B的友元,类B是类C的友元,类A不自动成为类C的友元。
3. 应用场景
-
运算符重载(如
operator<<
用于输出)。 -
跨类协作(如矩阵类与向量类共享数据)。
-
工具函数需要访问私有成员时(如调试函数)。
4. 示例代码
#include <iostream>
#include <string>
using namespace std;// 友元函数
class Student {
private:string name;int age;
public:Student(const string &n, int a) : name(n), age(a) {}friend void printStudent(const Student& s); // 声明友元函数
};void printStudent(const Student& s) {cout << "Name: " << s.name << ", Age: " << s.age << endl; // 直接访问私有成员
}// 友元类
class Display {
public:void show(const Student& s);
};class Student {
private:string name;int age;
public:Student(const string &n, int a) : name(n), age(a) {}friend class Display; // 声明友元类
};void Display::show(const Student& s) {cout << "Name: " << s.name << ", Age: " << s.age << endl; // 直接访问私有成员
}// 补充一个友元成员函数
class Student {
private:string name;int age;
public:Student(const string &n, int a) : name(n), age(a) {}friend class Display; // 声明友元类friend void compareStudents(const Student& s1, const Student& s2); // 声明友元成员函数
};// 定义友元成员函数,比较两个Student对象的年龄
void compareStudents(const Student& s1, const Student& s2) {if (s1.age > s2.age) {cout << s1.name << " is older than " << s2.name << endl;} else if (s1.age < s2.age) {cout << s2.name << " is older than " << s1.name << endl;} else {cout << s1.name << " and " << s2.name << " are the same age" << endl;}
}int main() {Student s1("Alice", 20);Student s2("Bob", 22);// 使用友元函数printStudent(s1); // 输出: Name: Alice, Age: 20// 使用友元类Display d;d.show(s2); // 输出: Name: Bob, Age: 22// 使用友元成员函数compareStudents(s1, s2); // 输出: Bob is older than Alicereturn 0;
}
运算符重载(Operator Overloading)
一、运算符重载(Operator Overloading)
1. 核心概念
-
定义:赋予运算符对自定义类类型对象的功能。
-
格式:
返回类型 operator运算符(参数列表)
。 -
形式:
-
非成员函数:通常声明为友元以访问私有成员。
-
成员函数:隐含
this
指针,左操作数为当前对象。
-
2. 常见运算符重载规则
-
加法运算符(+)成员函数:
String String::operator+(const String &op2){int len = strlen(this->str)+strlen(op2.str)+1;String newStr;newStr.str = new char[len];strcpy(newStr.str,this->str);strcat(newStr.str,op2.str);return newStr; }
-
自增运算符(++):
-
前置++:
String& operator++();
-
后置++:
String operator++(int);
(通过哑元参数区分)
-
-
下标运算符([]):
char &String::operator[](int index)const{//检查索引是否越界,必须满足在固定的长度内if (index < 0 || index >= this->size) {static char nullChar = '\0'; // 定义一个静态字符return nullChar; // 返回静态字符的引用}return this->str[index]; }
3. 关键注意事项
-
内存管理:运算符重载中若涉及动态内存(如字符串拼接),需实现深拷贝。
-
返回值优化:返回临时对象时,优先通过构造函数优化(如
return String(buffer);
)。 -
异常处理:下标访问需检查索引范围,防止越界。
4. 示例代码
// 加法运算符重载(非成员函数)
String operator+(const String& a, const String& b) {char* buffer = new char[a.length + b.length + 1];strcpy(buffer, a.str);strcat(buffer, b.str);String result(buffer);delete[] buffer;return result;
}// 自增运算符重载(成员函数)
String& String::operator++() { // 前置++for (char* p = str; *p; p++) (*p)++;return *this;
}String String::operator++(int) { // 后置++String temp(*this); // 调用拷贝构造函数++(*this); // 调用前置++return temp;
}
2. 实现String类的下标运算符重载
char &String::operator[](int index)const{//检查索引是否越界,必须满足在固定的长度内if (index < 0 || index >= this->size) {static char nullChar = '\0'; // 定义一个静态字符return nullChar; // 返回静态字符的引用}return this->str[index];
}
二、赋值运算符(=)重载
-
核心作用
实现对象间的深拷贝,避免浅拷贝导致的内存重复释放或泄漏。 -
实现要点
-
自赋值检查:防止
a = a
导致内存错误。 -
释放旧内存:赋值前需释放当前对象的资源。
-
深拷贝新内存:重新分配内存并复制内容。
-
-
代码示例
String &String::operator=(const String &obj) {if (this != &obj){ // Exclude the scenario where this points to objif (this->str != NULL){delete[] this->str;}if (obj.str != NULL){int len = strlen(obj.str) + 1;this->str = new char[len];strcpy(this->str, obj.str);}}return *this; }
-
注意事项
-
必须为成员函数:C++规定赋值运算符只能通过成员函数重载。
-
默认赋值运算符的陷阱:默认实现为浅拷贝,需手动重载以支持深拷贝。
-
三、左移运算符(<<)重载
-
核心作用
支持自定义类的输出流操作(如cout << obj
)。 -
实现要点
-
声明为友元函数:以访问类的私有成员。
-
返回
ostream&
:支持链式调用(如cout << a << b
)。
-
-
代码示例
两种实现方法 1、 ostream &operator<<(ostream &os, const String &obj) {if (obj.str){os << obj.str;}return os; } 2、 class String { private:char* str; public:friend ostream& operator<<(ostream& os, const String& obj); };ostream& operator<<(ostream& os, const String& obj) {if (obj.str != nullptr) {os << obj.str;}return os; // 返回流引用以支持链式调用 }
-
注意事项
-
输入运算符(>>)同理:需处理输入流并修改对象状态,通常声明为友元。
-
四、不能被重载的运算符
运算符 | 不可重载原因 |
---|---|
. | 成员访问运算符,重载会破坏语言基础结构。 |
:: | 域运算符,属于编译时解析的语法结构。 |
sizeof | 计算对象大小,编译时确定,无法动态重载。 |
?: | 三目运算符,逻辑复杂且可能引发歧义。 |
.* 和 ->* | 成员指针访问运算符,语法特殊且用途有限。 |
五、运算符重载的通用规则
-
语法限制
-
只能重载C++已有的运算符,不可创建新运算符(如
**
)。 -
不能改变运算符的优先级、结合性或操作数个数(如
+
始终为双目运算符)。
-
-
函数形式
-
成员函数:适用于左操作数为当前类对象(如
a + b
)。 -
友元函数:适用于左操作数为其他类型(如
cout << obj
)。
-
-
特殊运算符重载
-
自增/自减运算符:
String& operator++(); // 前置++ String operator++(int); // 后置++(通过哑元参数区分)
-
下标运算符([]):需提供
const
和非const
版本。char &String::operator[](int index)const{//检查索引是否越界,必须满足在固定的长度内if (index < 0 || index >= this->size) {static char nullChar = '\0'; // 定义一个静态字符return nullChar; // 返回静态字符的引用}return this->str[index]; }
-
六、常见问题与解决方案
问题 | 原因 | 解决方法 |
---|---|---|
内存泄漏 | 未释放旧内存 | 在赋值运算符中先 delete[] 再 new |
双重释放(double free) | 浅拷贝导致共享内存 | 实现深拷贝 |
链式调用失败 | 未返回流或对象引用 | 返回 ostream& 或 String& |
继承
一、继承的核心概念
-
作用
-
减少代码冗余:将多个类的公共属性和方法抽象到父类中,子类通过继承复用代码。
-
增强扩展性:子类可添加特有属性或覆盖父类方法,实现功能扩展。
-
-
基本语法
class 子类名 : 访问修饰符 父类名 {// 子类特有属性和方法 };
-
访问修饰符:
public
、protected
、private
,决定父类成员在子类中的可见性。
-
二、用户代码分析
-
原始问题
-
多个英雄类(如
Hanzin
、Houyi
)中存在重复的“英雄的属性”,导致代码冗余。
-
-
优化思路
-
将公共属性提取到基类
Hero
中,特定类型(如射手、法师)进一步抽象为中间类(如Ranger
),最终由具体英雄类继承。
-
三、继承体系设计示例
-
基类:
Hero
#ifndef __HERO_HEAD__ #define __HERO_HEAD__ #include <iostream> #include <string> using namespace std; class Hero { public:// 重构函数Hero(const string &name = "hero") : name(name) {};// 析构函数~Hero(){cout << "Hero 析构" << endl;} //英雄特有的名字给一个函数用于访问namestring get_name() const { return name; }void set_name(const string &name) { this->name = name; }virtual void show() const{cout << "Name: " << name << endl;} protected:string name; };#endif
-
中间类:Ranger(射手)
#ifndef __RANGER_HEAD__ #define __RANGER_HEAD__ #include "hero.h" #include <iostream> using namespace std; class Ranger{ public: //构造函数Ranger(int distance):distance(distance){cout << "Ranger 构造函数" << endl;} //获取对应的射程int get_distance() const { return distance; }void set_distance(int distance) { this->distance = distance; }void show(){cout << "Distance: " << distance << endl;}~Ranger() {cout << "Ranger 析构函数" << endl;}private:int distance; };#endif
-
具体类:Drj(狄仁杰)
#ifndef DRJ_H #define DRJ_H #include "hero.h" #include "ss.h" #include <string> #include <iostream>class Drj : public Ranger,public Hero{ // 仅继承 Ranger(已虚继承 Hero) private:std::string looks;public:Drj(const std::string &name, int distance, const std::string &looks):Hero(name),Ranger(distance),looks(looks){std::cout << "Drj 构造函数" << std::endl;}void show()const{Hero::show(); // 调用 Hero 的 show()std::cout << "Looks: " << looks << std::endl;}~Drj(){std::cout << "Drj 析构函数" << std::endl;} };#endif
4.Hero_main.cpp:
#include <iostream>
#include "hero.h"
#include "ss.h"
#include "drj.h"int main() {/*若是直接用private:或protected:继承都会出现继承范围越来越小,以至于在主函数中都无法使用因此利用public直接继承值或是public函数辅助访问私有或是保护的值*/// 创建 Hero 对象Hero hero("基础英雄");hero.show();std::cout << "-----------------" << std::endl;// 创建 Ranger 对象攻击范围是100Ranger ranger(100);ranger.show();std::cout << "-----------------" << std::endl;// 创建 Drj 对象Drj drj("狄仁杰", 150, "英俊");drj.show();std::cout << "-----------------" << std::endl;return 0;
}
结果显示:
六、继承的优势与注意事项
-
优势
-
代码复用:公共逻辑集中管理,减少重复代码。
-
层次化设计:通过多级继承实现模块化开发(如
Hero → Ranger → Houyi
)。
-
-
注意事项
-
访问权限:合理使用
public
、protected
、private
控制成员可见性。 -
菱形继承问题:避免多继承导致的二义性(可通过虚继承解决)。
-
父类析构函数:若父类有虚函数,应声明虚析构函数以防止资源泄漏。
-
关键实践建议:
-
优先使用组合而非继承,避免过度设计。
-
使用
protected
替代private
以支持子类扩展。 -
在复杂继承体系中,合理使用虚函数和多态特性。
四、菱形继承
1. 菱形继承的定义与结构
菱形继承(Diamond Inheritance) 是指一个派生类(如 D
)通过多个路径继承自同一个基类(如 A
)。具体结构如下:
-
示例代码结构:
class A { public: int a; }; class B : public A {}; class C : public A {}; class D : public B, public C {};
2. 菱形继承导致的问题
-
成员重复:
由于B
和C
都继承自A
,D
会包含两份A
的成员变量a
(分别通过B
和C
继承)。 -
访问歧义:
当在D
中直接访问a
时,编译器无法确定应使用B::a
还是C::a
,导致编译错误。
示例错误代码:
class D : public B, public C {
public: void function() { a = 200; // ❌ 错误:reference to 'a' is ambiguous }
}; int main() { D object; object.a = 100; // ❌ 错误:request for member 'a' is ambiguous return 0;
}
3. 编译器报错原因
-
歧义性访问:
D
中存在两个独立的A
子对象(分别来自B
和C
),因此a
在D
中有两个副本。 -
错误示例:
Test.cpp:18:17: error: reference to 'a' is ambiguous Test.cpp:25:16: error: request for member 'a' is ambiguous
4. 解决方法
通过 作用域解析运算符(::
) 明确指定访问路径,消除歧义。
修改后代码:
class D : public B, public C {
public: void function() { B::a = 200; // ✅ 明确指定访问 B 继承的 a }
}; int main() { D object; object.C::a = 100; // ✅ 明确指定访问 C 继承的 a return 0;
}
5. 其他解决方法(补充)
-
虚继承(Virtual Inheritance):
使用virtual
关键字继承,确保D
中只保留一份A
的成员。class B : virtual public A {}; class C : virtual public A {}; class D : public B, public C {};
-
优势:无需通过作用域解析符访问,直接使用
a
。 -
注意:虚继承会增加对象内存布局的复杂性。
-
6. 关键结论
问题 | 原因 | 解决方案 |
---|---|---|
成员重复与访问歧义 | 多路径继承同一基类 | 使用 B::a 或 C::a 明确路径 |
代码冗余 | 多个基类副本 | 虚继承(推荐) |
五、访问修饰符
1、类成员的访问修饰符
修饰符 | 类内部访问 | 子类访问 | 类外访问 |
---|---|---|---|
public | ✅ | ✅ | ✅ |
protected | ✅ | ✅ | ❌ |
private | ✅ | ❌ | ❌ |
核心规则:
-
public
:完全开放访问。 -
protected
:仅限类内部和子类访问。 -
private
:仅限类内部访问。
2、继承方式对成员权限的影响
继承方式 | 基类 public 成员 | 基类 protected 成员 | 基类 private 成员 |
---|---|---|---|
public | 保持 public | 保持 protected | 不可访问 |
protected | 降级为 protected | 保持 protected | 不可访问 |
private | 降级为 private | 降级为 private | 不可访问 |
核心规则:
-
继承方式决定了基类成员在派生类中的访问权限上限。
-
private
成员始终不可被派生类直接访问。
3、示例代码分析
基类定义
-
B1
类:class B1 { public:int i; // public protected:int k; // protected };
-
B2
类(修正变量名1
为l
):class B2 { public:int l; // public private:int m; // private protected:int q; // protected };
-
B3
类:class B3 { public:int p1; // public };
派生类 C
的继承方式
class C : public B2, protected B1, private B3 {
public:int c; // 新增 public 成员
};
成员权限推导
基类成员 | 原始权限 | 继承方式 | 在 C 中的权限 | 是否可外部访问 |
---|---|---|---|---|
B2::l | public | public 继承 | public | ✅ |
B2::q | protected | public 继承 | protected | ❌ |
B1::i | public | protected 继承 | protected | ❌ |
B1::k | protected | protected 继承 | protected | ❌ |
B3::p1 | public | private 继承 | private | ❌ |
C::c | - | - | public | ✅ |
组合
一、组合的核心概念
-
定义:组合是通过将现有类的对象作为成员嵌入到新类中,构建“整体-部分”关系(即“has-a”或“contains-a”关系)。
-
典型场景:
-
汽车(
Car
)包含引擎(Engine
)和轮胎(Wheel
)。 -
英雄(
Houyi
)拥有皮肤(Skin
)。
-
二、组合的实现方式
1. 基本语法
class NewClass {
public:// 成员函数
private:Class1 obj1; // 组合:包含 Class1 对象Class2 obj2; // 组合:包含 Class2 对象
};
2. 示例代码分析
class Houyi : public Hero, public Ranger {
public:Houyi(const string &name, int distance, int looks, int price, const string &appearance);~Houyi();void show() const;private:int looks;Skin skin; // 组合:Skin 对象作为成员
};// 构造函数初始化列表必须显式初始化成员对象
Houyi::Houyi(...) : Hero(name), Ranger(distance), skin(price, appearance) {// 派生类自身逻辑
}
3. 关键规则
-
成员对象初始化:必须在构造函数的初始化列表中显式调用成员对象的构造函数。
-
默认构造函数:若未显式初始化,成员对象会调用其默认构造函数(若存在)。
三、构造函数与析构函数的调用顺序
-
构造函数调用顺序:
-
按继承顺序调用基类构造函数(
Hero
→Ranger
)。 -
按成员对象声明顺序调用成员对象的构造函数(
Skin
)。 -
最后调用派生类自身的构造函数(
Houyi
)。
-
-
析构函数调用顺序:与构造函数顺序相反。
-
先调用派生类的析构函数。
-
再按成员对象声明逆序调用析构函数(
Skin
)。 -
最后按继承逆序调用基类析构函数(
Ranger
→Hero
)。
-
四、继承与组合的对比
特性 | 继承(is-a) | 组合(has-a) |
---|---|---|
关系类型 | 子类是父类的一种特化 | 整体包含部分 |
耦合度 | 高耦合(父类改动影响子类) | 低耦合(通过接口交互) |
代码复用 | 直接复用父类方法 | 通过成员对象复用功能 |
灵活性 | 低(编译时绑定) | 高(运行时动态替换成员对象) |
设计原则 | 易违反封装原则 | 符合信息隐藏原则 |
五、组合的优缺点
优点
-
低耦合:成员对象通过接口交互,隐藏实现细节。
-
动态扩展:可在运行时替换成员对象(例如更换引擎)。
-
强封装性:成员对象的内部细节对整体类不可见。
缺点
-
对象数量增多:可能导致内存占用增加。
-
接口设计复杂:需设计清晰的接口协调多个成员对象。
六、组合的应用示例
任务:为“狄仁杰”类添加 Skin
成员并显示信息
class DiRenJie : public Hero {
public:DiRenJie(const string &name, int skillLevel, const Skin &skin) : Hero(name), skin(skin), skillLevel(skillLevel) {}void showInfo() const {cout << "Name: " << getName() << endl;cout << "Skill Level: " << skillLevel << endl;cout << "Skin: " << skin.getAppearance() << " (Price: " << skin.getPrice() << ")" << endl;}private:int skillLevel;Skin skin; // 组合:包含 Skin 对象
};
- 这是本人的学习笔记不是获利的工具,小作者会一直写下去,希望大家能多多监督我
- 文章会每攒够两篇进行更新发布(受平台原因,也是希望能让更多的人看见)
- 感谢各位的阅读希望我的文章会对诸君有所帮助
相关文章:
C++初窥门径
const关键字 一、const关键字 修饰成员变量 常成员变量:必须通过构造函数的初始化列表进行初始化,且初始化后不可修改。 示例: class Student { private: const int age; // 常成员变量 public: Student(string name, int age) : age(ag…...
Spring知识点总结
目录 1.什么是spring?你对spring的理解? 2.spring的优缺点? 3.解释一下IOC和AOP? 4.IOC和DI的区别? 5.spring中管理对象注入的方式? 6.自动注入的注解有哪些? 声明bean的注解 Bean的生命…...
Oracle_开启归档日志和重做日志
在Oracle中,类似于MySQL的binlog的机制是归档日志(Archive Log)和重做日志(Redo Log) 查询归档日志状态 SELECT log_mode FROM v$database; – 输出示例: – LOG_MODE – ARCHIVELOG (表示已开启) – NO…...
【金仓数据库征文】-数据库界新兴前列者,本篇带你速懂金仓数据库!
最近写课程设计、搞毕设是不是被数据库折腾到崩溃?动不动就报错、数据迁移还超麻烦!今天挖到个宝藏 —— 国产金仓数据库 KingbaseES,操作超简单,还自带 “翻译器” 帮你迁移数据!性能强还稳定,关键完全免费…...
人工智能与机器学习,谁是谁的子集 —— 再谈智能的边界与演进路径
人工智能(Artificial Intelligence, AI)作为当代最具影响力的前沿技术之一,常被大众简化为 “深度学习” 或 “大模型” 等标签。然而,这种简化认知往往掩盖了AI技术内部结构的复杂性与多样性。事实上,AI并非单一方法的…...
Linux进程学习【进程状态】
🌼🌼前言:在操作系统中,进程是最基本的资源管理单位,而操作系统通过精确管理这些进程的状态来确保系统能够高效运行。进程的状态不仅仅是操作系统设计的一部分,它对系统的性能、稳定性以及资源的分配起着至…...
用 ESP32 模拟 Wiegand 刷卡器:开发门禁系统必备的小工具
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
什么是 MCP?与 AI Agent 的关系是什么?
首先先回答一下什么是MCP? 如果你经常使用像Claude这样的大语言模型,你可能已经注意到它们虽然强大,但有时候也有局限性,比如无法获取实时信息或访问特定工具。 模型上下文协议(Model Context Protocol,简…...
Python ZIP文件操作全解析:从基础压缩到高级技巧
目录 一、ZIP文件操作基础三板斧 1.1 创建压缩包 1.2 解压操作 1.3 文件遍历与信息获取 二、进阶技巧:让压缩更智能 2.1 加密压缩实战 2.2 增量更新策略 2.3 性能优化技巧 三、高级场景解决方案 3.1 分卷压缩实现 3.2 跨平台路径处理 3.3 异常处理最佳实…...
Linux:进程的等待
当以一个进程结束时,它会变成僵尸进程,这个僵尸进程如果不处理,就会一直占用CPU资源,如果父进程要回收这个进程会通过进程等待的方式处理,回收子进程只会,会得到进程的退出信息 进程等待 父进程通过进程等…...
玉米产量遥感估产系统的开发实践(持续迭代与更新)
项目地址:项目首页 - maize_yield_estimation:玉米估产的flaskvue项目 - GitCode 开发中,敬请期待。。。 以下是预先写的提纲,准备慢慢补充 一、项目背景与工程目标 业务需求分析 农业遥感估产的行业痛点(数据分散、模型精度不足…...
Python解析地址中省市区街道
Python解析地址中省市区街道 1、效果 输入:海珠区沙园街道西基村 输出: 2、导入库 pip install jionlp3、示例代码 import jionlp as jiotext 海珠区沙园街道西基村 res jio.parse_location(text, town_villageTrue) print(res)...
论文学习:《聚类矩阵正则化指导的层次图池化》
原文标题:Clustering matrix regularization guided hierarchical graph pooling 原文链接:https://www.sciencedirect.com/science/article/abs/pii/S0950705125001558 图池化技术大致可以分为两类:平面图池化和层次图池化。后者通过迭代粗化…...
【金仓数据库征文】- 国产化迁移实战:从Oracle到KingbaseES的平滑过渡
文章目录 引言:国产数据库的崛起与迁移需求一、兼容性架构设计与配置优化1.1 Oracle兼容模式的核心实现1.2 潜在语法差异的深度处理1.3 环境预配置关键技术1.3.1 用户与模式映射1.3.2 字符集与日期格式 1.4 深度兼容模式配置1.4.1 语法兼容开关1.4.2 数据类型映射策…...
「零配置陷阱」:现代全栈工具链的复杂度管控实践
一、工具链膨胀的「死亡螺旋」 2024年典型全栈项目的初始化噩梦: $ npm create vitelatest ✔ Project name: … demo ✔ Select a framework: › React ✔ Select a variant: › TypeScript SWC ✔ Install shadcn/ui? … Yes ✔ Add Storybook? … Yes ✔ Co…...
浅析锁的应用与场景
锁的应用与场景:从单机到分布式 摘要:在多线程和分布式系统中,“锁”是避免资源竞争、保障数据一致性的核心机制。但你真的了解锁吗?什么时候该用锁?用哪种锁?本文通过通俗的比喻和代码示例,带…...
图论---Kruskal(稀疏图)
O( m * log n )。 1,将所有边按权重从小到大排序,调用系统的sort() 2,枚举每条边的 a , b ,权重 if(a、b 不联通) 就将这条边加入集合中 // 最小生成树 —Kruskal算法(稀疏图) #include<iostream> #include<algorithm> using …...
MySQL 从入门到精通:第二篇 - 数据类型、约束与索引
1. MySQL数据类型详解 数值类型 整数类型 -- 常用整数类型及范围 CREATE TABLE integer_types (tiny_col TINYINT, -- 1字节,有符号(-128~127),无符号(0~255)small_col SMALLINT, -- 2字节,有符号(-32768~32767),无符号(0~65535)medium_col MEDIUMINT,...
基于AI技术的高速公路交通引流系统设计与应用研究
基于AI技术的高速公路交通引流系统设计与应用研究 1. 研究背景与意义 1.1 交通系统演化脉络 1.1.1 发展阶段划分 机械化时代(1950-1990):固定式信号控制信息化时代(1991-2010):SCATS/SCOOT系统智能化时代…...
n8n 中文系列教程_09. 从原始需求到精准实现:n8n节点选择指南
在自动化工作流工具n8n中,正确选择和使用节点是高效实现需求的关键。本文将从需求分析入手,逐步解析触发节点与执行节点的区别,梳理n8n的节点分类逻辑,并揭示外部服务节点的本质,帮助您精准匹配需求与实现方案。无论您…...
P19:Inception v1算法实战与解析
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、模型结构 Inception V1 的主要特点是在一个网络中同时使用不同大小的卷积核(1x1、3x3、5x5)和池化操作来提取多尺度特征。以下是…...
day32 学习笔记
文章目录 前言一、霍夫变换二、标准霍夫变换三、统计概率霍夫变换四、霍夫圆变换 前言 通过今天的学习,我掌握了霍夫变换的基本原本原理及其在OpenCV中的应用方法 一、霍夫变换 霍夫变换是图像处理中的常用技术,主要用于检测图像中的直线,圆…...
2025时间序列都有哪些创新点可做——总结篇
作为AI和数据科学的核心方向之一,时间序列在2025年依然保持着强劲的发展势头,稳站各大顶会顶刊投稿主题前列。 关于它的研究,目前在结合传统统计方法和深度学习的基础上,已延伸至频域等数理工具与神经网络的交叉创新。同时针对垂…...
头歌实训之索引
🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C语言的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…...
通讯的基础概念:涵盖串行通信、并行通信、TCP、UDP、Socket 等关键概念和技术
一、通信基础概念 1. 串行通信与并行通信 串行通信 定义:通过一条线路逐位传输数据,每个字节包含起始位、数据位、校验位和停止位。特点: 传输稳定,但速度较慢(因逐位传输)。常用接口:RS-232、…...
Uni-App 多端电子合同开源项目介绍
项目概述 本项目是一款基于 uni-app框架开发的多端电子合同管理平台,旨在为企业及个人用户提供高效、安全、便捷的电子合同签署与管理服务。项目创新性地引入了 “证据链”与“非证据链”两种签署模式,满足不同场景下的签署需求,支持多种签署…...
一个非常快速的 Latex 入门教程【Part 1】
目录 1.LaTex简介 2.LaTex 中最基础的格式化命令 2.1加粗,斜体,下划线,添加新段落 2.2文档分节 2.3 图片 2.4 LaTeX 中列表的创建 无序列表 有序列表 2.5对数学公式的排版 2.6表格 1.LaTex简介 LaTex的主要优势是它会将文…...
用Obsidian四个插件打造小说故事关联管理系统:从模板到图谱的全流程实践
用Obsidian四个插件打造小说故事关联管理系统:从模板到图谱的全流程实践 一、前言:为什么需要故事关联管理系统 在小说创作中,复杂的人物关系、交错的情节线和多维的世界观常导致创作混乱。本文将通过 Dataview(数据查询…...
C++ 日志系统实战第三步:熟悉掌握各种设计模式
全是通俗易懂的讲解,如果你本节之前的知识都掌握清楚,那就速速来看我的项目笔记吧~ 相关技术知识补充,也是最后的补充知识了~ 下文将加入项目代码编写! 目录 设计模式 单例模式 饿汉模式 懒汉模式 工厂模式 简单…...
[ESP-IDF]:esp32-camera 使用指南 ESP32S3-OV2640 用例测试
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要:esp32-camera 组件为 ESP32 系列 SoC 提供了兼容的图…...
在统信UOS/麒麟Kylin OS中创建网页桌面快捷方式
在统信UOS/麒麟Kylin OS中创建网页桌面快捷方式 本文将详细介绍如何在统信UOS或麒麟KYLINOS中使用命令行创建一个网页桌面快捷方式,以方便构建云桌面模板及镜像模板。欢迎大家浏览、分享和转发!请关注我以获取更多技术分享。 1. 查看系统信息 首先&am…...
SQLite 是什么?
📌 一、SQLite 是什么? SQLite 是一个轻量级、嵌入式数据库,意思是它直接集成在你的 App 内部,不需要单独安装数据库服务端。 ✅ 特点: 特点说明本地使用所有数据保存在手机内部存储文件形式数据以 .db 文件形式存储…...
恒创科技「香港大带宽云」新老用户专享实例及热门配置
全球化数字浪潮下,高带宽应用正深度重构各行业运营模式——从跨境电商、流媒体与视频点播,到在线游戏与云游戏加速,涵盖所有高并发、强交互的业务场景。在此背景下,企业对高性能 IT 基础架构的需求持续升级,以此来支持…...
fpga系列 HDL:verilog latch在fpga中的作用 避免latch的常见做法
目录 Latch在FPGA中的作用Quartus中有关latch的警告⚠避免Latch的常见做法1. if-else 语句未覆盖所有条件生成Latch的代码:修复后的代码: 2. case语句未覆盖所有分支生成Latch的代码:修复后的代码: 3. 组合逻辑中缺少默认赋值生成…...
java配置
环境变量...
解决虚拟主机ping不通本地主机问题
win11 1 问题 虚拟主机和本地主机在同一网段。 2 解决方案 以win11为例: 设置 -> 网络和 Internet -> 高级网路设置 -> Windows 防火墙 -> 高级设置 -> 入站规则 -> 新建规则 需要设置:规则类型、 协议和端口、名称,其…...
Move Registry 发布,实现 Sui 的超级互操作性
Move Registry(MVR)的到来对 Sui 来说是一件大事。MVR 是一个功能齐全的链上包管理系统,提升了整个生态的可发现性、可信度和互操作性。Sui 本身就是最具互操作性的链之一,凭借 Move 语言和可编程交易区块(PTBs&#x…...
【Linux】gdb工具,Linux 下程序调试的 “透视眼”
目录 调试代码调试注意事项gdb和Cgdb调试命令汇总行号显示断点设置查看断点信息删除断点开启 / 禁用断点运行 / 调试逐过程和逐语句打印 / 追踪变量指定行号跳转强制执行函数 补充命令watchset var 替换变量值条件断点 end 调试代码 这是本次调试要用的代码 1 #include <st…...
脚本分享:快速作图对比wannier拟合能带python脚本
本脚本通过Python实现电子能带结构数据的快速作图,能够从两个不同的数据文件(BAND.dat 和 wannier90_band.dat)中提取有效数据,并在同一坐标系下绘制对比图。 准备工作:使用VASPKIT处理获得能带数据BAND.datÿ…...
解决ssh拉取服务器数据,要多次输入密码的问题
问题在于,每次循环调用 rsync 都是新开一个连接,所以每次都需要输入一次密码。为了只输入一次密码,有以下几种方式可以解决: ✅ 推荐方案:设置 SSH 免密登录 最稳最安全的方式是:配置 SSH 免密登录&#x…...
金仓数据库 KingbaseES 产品深度优化提案:迈向卓越的全面升级
文章目录 一、引言二、性能优化(一)查询性能提升1. 优化查询优化器引入基于代价的查询优化算法支持更多的查询优化提示 2. 索引优化支持更多类型的索引优化索引的创建和维护策略 (二)并发处理能力增强1. 锁机制优化采用更细粒度的…...
企业级智能合同管理解决方案升级报告:道本科技携手DeepSeek打造智能合同管理新标杆
当传统合同管理系统还在与堆积如山的纸质文档较劲时,道本科技与DeepSeek联合开发的智能合同平台已为国央企打开新视界。我们以某大型能源集团的实际应用为例,带您直观感受技术升级带来的管理变革。 一、技术升级的具象化呈现 在未接入DeepSeek技术前&a…...
C#并行编程极大提升集合处理速度,再也没人敢说你程序性能差了!
马工撰写的年入30万C#上位机项目实战必备教程(点击下方链接即可访问文章目录) 1、《C#串口通信从入门到精通》 2、《C#与PLC通信从入门到精通 》 3、《C# Modbus通信从入门到精通》 4、《C#Socket通信从入门到精通 》 5、《C# MES通信从入门到精通》 6、…...
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
目录 1.最优除法 题解 2.跳跃游戏 II 题解 3.加油站 题解 利用 单调性,可以实现 区间跳跃 1.最优除法 链接: 553. 最优除法 给定一正整数数组 nums,nums 中的相邻整数将进行浮点除法。 例如,nums [2,3,4],我…...
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
【CUDA 编译 bug】ld: cannot find -lcudart
我们使用 Conda 安装 pytorch 和 CUDA 环境之后,要用 Conda 的CUDA环境进行某个库编译时,出现了bug: /mnt/data/home/xxxx/miniforge3/envs/GAGAvatar/compiler_compat/ld: cannot find -lcudart: No such file or directorycollect2: error…...
MYSQL之数据类型
数据类型分类 数值类型 在MySQL中, 整型可以指定是有符号的和无符号的, 默认是有符号的. 可以通过 UNSIGNED 来说明某个字段是无符号的. tinyint类型 以tinyint为例, 其它的整型类型都只是数据范围的区别. 数据越界 创建一个 tinyint 类型的 num 的属性, 大小为 1 字节, 不…...
Asp.Net Core 异常筛选器ExceptionFilter
文章目录 前言一、异常筛选器的核心概念用途:实现接口:执行时机: 二、使用步骤1.创建自定义异常筛选器2.注册异常筛选器全局注册(对所有 Controller 生效):局部注册(通过特性标记特定的 **Contr…...
WebUI可视化:第2章:技术基础准备
学习目标 ✅ 掌握HTML/CSS基础语法 ✅ 理解JavaScript核心功能 ✅ 了解前后端交互原理 2.1 HTML基础:网页的骨架 2.1.1 基础结构 每个HTML文件都必须包含以下基本结构: html <!DOCTYPE html> <html> <head><title>我的第一个网页</title> …...
Java基础集合 面试经典八股总结 [连载ing]
序言 八股,怎么说呢。我之前系统学习的内容,进行梳理。通过问题的方式,表达出得当的内容,这件事本身就很难。面试时心态、状态、掌握知识的情况等。关于八股文,我不想有太多死记硬背的内容,更多的是希望自我…...