【C++初学】C++核心编程技术详解(二):类与继承
- 函数提高
3.1 函数默认参数
函数的形参可以有默认值,调用时可以省略这些参数。
示例代码:
int func(int a, int b = 10, int c = 10) {return a + b + c;
}int main() {cout << "ret = " << func(20, 20) << endl;cout << "ret = " << func(100) << endl;system("pause");return 0;
}
3.2 函数占位参数
占位参数在函数声明中占位,调用时必须提供值。
示例代码:
void func(int a, int) {cout << "this is func" << endl;
}int main() {func(10, 10); // 占位参数必须提供值system("pause");return 0;
}
3.3 函数重载
函数重载允许函数名相同,但参数类型、个数或顺序不同。
示例代码:
void func() {cout << "func 的调用!" << endl;
}void func(int a) {cout << "func (int a) 的调用!" << endl;
}void func(double a) {cout << "func (double a)的调用!" << endl;
}void func(int a, double b) {cout << "func (int a ,double b) 的调用!" << endl;
}int main() {
func();
func(10);
func(3.14);
func(10, 3.14);
func(3.14, 10);
system("pause");
return 0;
}
void func(int& a)
{cout << "func(int &a)调用" << endl;
}void func(const int& a)
{cout << "func(const int &a)调用" << endl;
}void func2(int a, int b = 10)
{cout << "func2(int a , int b = 10)调用" << endl;
}void func2(int a)
{cout << "func2(int a)调用" << endl;
}
int main()
{int a = 10;func(a);func(10);//func2(10);system("pause");return 0;
}
4 类和对象
面向对象的三大特性是封装、继承和多态。类是对象的抽象,对象是类的实例。
4.1 封装
封装是将属性和行为作为一个整体,表现生活中的事物,并加以权限控制。
4.1.1 封装的意义
示例代码:
// 圆类
const double PI = 3.14;
class Circle {
public:int m_r; // 半径double calculateZC() { // 计算周长return 2 * PI * m_r;}
};int main() {Circle c1;c1.m_r = 10;cout << "圆的周长为: " << c1.calculateZC() << endl;system("pause");return 0;
}
案例2:
#include <string>
class Student
{
public:void setName(string name){m_name = name;}void setID(int id){m_id = id;}void showStudent(){cout << "name: " << m_name << "id: " << m_id << endl;}
public:string m_name;int m_id;
};
int main()
{Student stu;stu.setName("德玛西亚");stu.setID(250);stu.showStudent();system("pause");return 0;
}
4.1.2 struct 和 class 的区别
struct 默认权限为公共。
class 默认权限为私有。
示例代码:
class c1 //默认私有
{int m_A;};
struct c2 //默认公共
{int m_A;};
int main()
{c1 c1;c1.m_A = 10;//errc2 c2;c2.m_A = 10;system("pause");return 0;
}
4.1.3 成员属性设置为私有
将成员属性设置为私有可以控制读写权限,并检测数据有效性。
示例代码:
class Person {
public:void setName(string name) {m_Name = name;}string getName() {return m_Name;}int getAge() {return m_Age;}void setAge(int age) {if (age < 0 || age > 150) {cout << "你个老妖精!" << endl;return;}m_Age = age;}void setLover(string lover) {m_Lover = lover;}
private:string m_Name; // 姓名int m_Age; // 年龄string m_Lover; // 情人
};int main() {Person p;p.setName("张三");cout << "姓名: " << p.getName() << endl;p.setAge(50);cout << "年龄: " << p.getAge() << endl;p.setLover("苍井");system("pause");return 0;
}
4.2 对象的初始化和清理
构造函数和析构函数是C++中用于对象初始化和清理的重要机制。
4.2.1 构造函数和析构函数
构造函数用于对象创建时的初始化,析构函数用于对象销毁前的清理。
示例代码:
class Person {
public:Person() {cout << "Person的构造函数调用" << endl;}~Person() {cout << "Person的析构函数调用" << endl;}
};void test01() {Person p;
}int main() {test01();system("pause");return 0;
}
4.2.2 构造函数的分类及调用
构造函数可以分为有参构造和无参构造,还可以分为普通构造和拷贝构造。
示例代码:
class Person {
public:Person() {cout << "无参构造函数!" << endl;}Person(int a) {age = a;cout << "有参构造函数!" << endl;}Person(const Person& p) {age = p.age;cout << "拷贝构造函数!" << endl;}~Person() {cout << "析构函数!" << endl;}
public:int age;
};void test01() {Person p; // 调用无参构造函数
}void test02() {Person p1(10); // 调用有参构造函数Person p2 = Person(10); // 调用拷贝构造函数Person p3 = p1; // 调用拷贝构造函数
}int main() {test01();test02();system("pause");return 0;
}
4.2.3 拷贝构造函数调用时机
拷贝构造函数在以下三种情况下被调用:
使用一个已经创建完毕的对象来初始化一个新对象。
以值传递的方式给函数参数传值。
以值方式返回局部对象。
示例代码:
class Person
{
public:Person(){cout << "无参构造函数" << endl;}Person(int a){age = a;cout << "有参构造函数" << endl;}Person(const Person& p){cout << "拷贝构造函数" << endl;age = p.age;}~Person(){cout << "析构函数" << endl;}
public:int age;
};void test01()
{Person p;
}void test02()
{Person p1(10);Person p2 = Person(10);Person p3 = Person(p2);Person p4 = 10;Person p5 = p4;
}
int main()
{test01();test02();system("pause");return 0;
}
class Person
{
public:Person(){cout << "无参构造函数" << endl;mAge = 0;}Person(int age){cout << "有参构造函数" << endl;}Person(const Person& p){cout << "拷贝构造函数" << endl;mAge = p.mAge;}~Person(){cout << "析构函数" << endl;}
public:int mAge;
};void test01()
{Person man(100);Person newman(man);Person newman2 = man;
}void dowork(Person p1) {};
void test02()
{Person p;dowork(p);
}Person dowork2()
{Person p1;cout << (int*)&p1 << endl;return p1;
}void test03()
{Person p = dowork2();cout << (int*)&p << endl;
}
int main()
{//test01();//test02();test03();system("pause");return 0;
}
4.2.4 构造函数调用规则
如果用户定义了有参构造函数,编译器不会再提供默认无参构造函数,但会提供默认拷贝构造函数。
示例代码:
class Person {
public:Person() {cout << "无参构造函数!" << endl;}Person(int a) {age = a;cout << "有参构造函数!" << endl;}Person(const Person& p) {age = p.age;cout << "拷贝构造函数!" << endl;}~Person() {cout << "析构函数!" << endl;}
public:int age;
};void test01() {Person p1(18);Person p2(p1); // 调用拷贝构造函数cout << "p2的年龄为: " << p2.age << endl;
}void test02() {Person p1; // 如果用户没有提供默认构造函数,会报错Person p2(10); // 用户提供的有参构造函数
}int main() {test01();test02();system("pause");return 0;
}
4.2.5 深拷贝与浅拷贝
浅拷贝只是简单地赋值,而深拷贝会在堆区重新申请空间。
示例代码:
class Person {
public:Person() {cout << "无参构造函数!" << endl;}Person(int age, int height) {cout << "有参构造函数!" << endl;m_age = age;m_height = new int(height);}Person(const Person& p) {cout << "拷贝构造函数!" << endl;m_age = p.m_age;m_height = new int(*p.m_height); // 深拷贝}~Person() {cout << "析构函数!" << endl;if (m_height != NULL) {delete m_height;}}
public:int m_age;int* m_height;
};void test01() {Person p1(18, 180);Person p2(p1);cout << "p1的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
}int main() {test01();system("pause");return 0;
4.2.6 初始化列表
初始化列表用于在构造函数中初始化成员变量。
示例代码:
class Person {
public:Person(int a, int b, int c) : m_A(a), m_B(b), m_C(c) {cout << "构造函数调用" << endl;}void PrintPerson() {cout << "mA:" << m_A << endl;cout << "mB:" << m_B << endl;cout << "mC:" << m_C << endl;}
private:int m_A;int m_B;int m_C;
};int main() {Person p(1, 2, 3);p.PrintPerson();system("pause");return 0;
}
4.2.7 类对象作为类成员
类中的成员可以是另一个类的对象。
示例代码:
class Phone {
public:Phone(string name) {m_PhoneName = name;cout << "Phone构造" << endl;}~Phone() {cout << "Phone析构" << endl;}string m_PhoneName;
};class Person {
public:Person(string name, string pName) : m_Name(name), m_Phone(pName) {cout << "Person构造" << endl;}~Person() {cout << "Person析构" << endl;}void playGame() {cout << m_Name << " 使用" << m_Phone.m_PhoneName << " 牌手机! " << endl;}string m_Name;Phone m_Phone;
};void test01() {Person p("张三", "苹果X");p.playGame();
}int main() {test01();system("pause");return 0;
}
4.2.8 静态成员
静态成员变量和静态成员函数是类的所有对象共享的。
示例代码:
class Person {
public:static int m_A; // 静态成员变量static void func() {cout << "func调用" << endl;m_A = 100;}int m_B; // 非静态成员变量
};int Person::m_A = 10;void test01() {Person p1;p1.func();Person::func();cout << "p1.m_A = " << p1.m_A << endl;cout << "m_A = " << Person::m_A << endl;
}int main() {test01();system("pause");return 0;
}
class Person
{
public:static int m_A;
private:static int m_B;};
int Person::m_A = 10;
int Person::m_B = 10;void test01()
{Person p1;p1.m_A = 100;cout << "p1.m_A = " << p1.m_A << endl;Person p2;p2.m_A = 200;cout << "p1.m_A = " << p1.m_A << endl;cout << "p2.m_A = " << p2.m_A << endl;cout << "m_A = " << Person::m_A << endl;}
int main()
{test01();system("pause");return 0;
}
4.3 C++对象模型和this指针
成员变量和成员函数分开存储
this指针指向被调用的成员函数所属的对象。
示例代码:
class Person {
public:Person(int age) {this->age = age;}Person& PersonAddPerson(Person p) {this->age += p.age;return *this;}int age;
};void test01() {Person p1(10);cout << "p1.age = " << p1.age << endl;Person p2(10);p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);cout << "p2.age = " << p2.age << endl;
}int main() {test01();system("pause");return 0;
}
空指针访问成员数组
4.4 友元
友元可以访问类的私有成员。
4.4.1 全局函数做友元
示例代码:
class Building {friend void goodGay(Building *building);string m_BedRoom; // 卧室
public:Building() {m_BedRoom = "卧室";}string m_SittingRoom; // 客厅
};void goodGay(Building *building) {cout << "好基友正在访问: " << building->m_SittingRoom << endl;cout << "好基友正在访问: " << building->m_BedRoom << endl;
}void test01() {Building b;goodGay(&b);
}int main() {test01();system("pause");return 0;
}
4.4.2 类做友元
示例代码:
class Building {friend class goodGay;string m_BedRoom; // 卧室
public:Building() {m_BedRoom = "卧室";}string m_SittingRoom; // 客厅
};class goodGay {
public:void visit(Building *building) {cout << "好基友正在访问" << building->m_SittingRoom << endl;cout << "好基友正在访问" << building->m_BedRoom << endl;}
};void test01() {Building b;goodGay gg;gg.visit(&b);
}int main() {test01();system("pause");return 0;
}
4.4.3 成员函数做友元
示例代码:
class Building {friend void goodGay::visit(Building *building);string m_BedRoom; // 卧室
public:Building() {m_BedRoom = "卧室";}string m_SittingRoom; // 客厅
};class goodGay {
public:void visit(Building *building) {cout << "好基友正在访问" << building->m_SittingRoom << endl;cout << "好基友正在访问" << building->m_BedRoom << endl;}
};void test01() {Building b;goodGay gg;gg.visit(&b);
}int main() {test01();system("pause");return 0;
}
4.5 运算符重载
运算符重载可以为自定义数据类型重新定义运算符的行为。
4.5.1 加号运算符重载
示例代码:
class Person
{
public:Person() {};Person(int a, int b){this->m_A = a;this->m_B = b;}Person operator+(const Person& p){Person temp;temp.m_A = this->m_A + p.m_A;temp.m_B = this->m_B + p.m_B;return temp;}
public:int m_A;int m_B;};Person operator+(const Person& p2, int val)
{Person temp;temp.m_A = p2.m_A + val;temp.m_B = p2.m_B + val;return temp;
}void test()
{Person p1(10, 10);Person p2(20, 20);Person p3 = p2 + p1;cout << "mA:" << p3.m_A << "mB:" << p3.m_B << endl;Person p4 = p3 + 10;cout << "mA:" << p4.m_A << "mB:" << p4.m_B << endl;}
int main()
{test();system("pause");return 0;
}
4.5.2 左移运算符重载
示例代码:
class Person {friend ostream& operator<<(ostream& out, Person& p);
public:Person(int a, int b) {this->m_A = a;this->m_B = b;}
private:int m_A;int m_B;
};ostream& operator<<(ostream& out, Person& p) {out << "a:" << p.m_A << " b:" << p.m_B;return out;
}void test() {Person p1(10, 20);cout << p1 << "hello world" << endl;
}int main() {test();system("pause");return 0;
}
4.5.3 递增运算符重载
示例代码:
class MyInteger {friend ostream& operator<<(ostream& out, MyInteger myint);
public:MyInteger() {m_Num = 0;}MyInteger& operator++() {m_Num++;return *this;}MyInteger operator++(int) {MyInteger temp = *this;m_Num++;return temp;}
private:int m_Num;
};ostream& operator<<(ostream& out, MyInteger myint) {out << myint.m_Num;return out;
}void test01() {MyInteger myInt;cout << ++myInt << endl;cout << myInt << endl;
}void test02() {MyInteger myInt;cout << myInt++ << endl;cout << myInt << endl;
}int main() {test01();test02();system("pause");return 0;
}
4.5.4 赋值运算符重载
示例代码:
class Person {
public:Person(int age) {m_Age = new int(age);}Person& operator=(Person &p) {if (m_Age !=NULL) {
delete m_Age;
m_Age = NULL;
}
m_Age = new int(*p.m_Age);
return *this;
}
~Person() {
if (m_Age != NULL) {
delete m_Age;
m_Age = NULL;
}
}
int *m_Age;
};
void test01() {
Person p1(18);
Person p2(20);
Person p3(30);
p3 = p2 = p1;
cout << "p1的年龄为:" << *p1.m_Age << endl;
cout << "p2的年龄为:" << *p2.m_Age << endl;
cout << "p3的年龄为:" << *p3.m_Age << endl;
}
int main() {
test01();
system("pause");
return 0;
}
4.5.5 关系运算符重载
示例代码:
class Person {
public:Person(string name, int age) {this->m_Name = name;this->m_Age = age;}bool operator==(Person & p) {if (this->m_Name == p.m_Name && this->m_Age == p.m_Age) {return true;} else {return false;}}bool operator!=(Person & p) {if (this->m_Name == p.m_Name && this->m_Age == p.m_Age) {return false;} else {return true;}}string m_Name;int m_Age;
};void test01() {Person a("孙悟空", 18);Person b("孙悟空", 18);if (a == b) {cout << "a和b相等" << endl;} else {cout << "a和b不相等" << endl;}if (a != b) {cout << "a和b不相等" << endl;} else {cout << "a和b相等" << endl;}
}int main() {test01();system("pause");return 0;
}
4.5.6 函数调用运算符重载
示例代码:
class MyPrint {
public:void operator()(string text) {cout << text << endl;}
};class MyAdd {
public:int operator()(int v1, int v2) {return v1 + v2;}
};void test01() {MyPrint myFunc;myFunc("hello world");
}void test02() {MyAdd add;int ret = add(10, 10);cout << "ret = " << ret << endl;cout << "MyAdd()(100,100) = " << MyAdd()(100, 100) << endl;
}int main() {test01();test02();system("pause");return 0;
}
5. 继承
继承是面向对象的三大特性之一,允许子类继承父类的成员。
5.1 继承的基本语法
示例代码:
class BasePage {
public:void header() {cout << "首页、公开课、登录、注册...(公共头部)" << endl;}void footer() {cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;}void left() {cout << "Java,Python,C++...(公共分类列表)" << endl;}
};class Java : public BasePage {
public:void content() {cout << "JAVA学科视频" << endl;}
};class Python : public BasePage {
public:void content() {cout << "Python学科视频" << endl;}
};class CPP : public BasePage {
public:void content() {cout << "C++学科视频" << endl;}
};void test01() {cout << "Java下载视频页面如下: " << endl;Java ja;ja.header();ja.footer();ja.left();ja.content();cout << "--------------------" << endl;cout << "Python下载视频页面如下: " << endl;Python py;py.header();py.footer();py.left();py.content();cout << "--------------------" << endl;cout << "C++下载视频页面如下: " << endl;CPP cp;cp.header();cp.footer();cp.left();cp.content();
}int main() {test01();system("pause");return 0;
}
5.2 继承方式
继承方式有三种:公共继承、保护继承和私有继承。
示例代码:
class Base1 {
public:int m_A;
protected:int m_B;
private:int m_C;
};class Son1 : public Base1 {
public:void func() {m_A; // 可访问 public 权限m_B; // 可访问 protected 权限// m_C; // 不可访问}
};class Base2 {
public:int m_A;
protected:int m_B;
private:int m_C;
};class Son2 : protected Base2 {
public:void func() {m_A; // 可访问 protected 权限m_B; // 可访问 protected 权限// m_C; // 不可访问}
};class Base3 {
public:int m_A;
protected:int m_B;
private:int m_C;
};class Son3 : private Base3 {
public:void func() {m_A; // 可访问 private 权限m_B; // 可访问 private 权限// m_C; // 不可访问}
};class GrandSon3 : public Son3 {
public:void func() {// Son3 是私有继承,所以继承 Son3 的属性在 GrandSon3 中都无法访问到// m_A;// m_B;// m_C;}
};
5.3 继承中的对象模型
父类中的私有成员也会被子类继承,但无法直接访问。
示例代码:
class Base {
public:int m_A;
protected:int m_B;
private:int m_C;
};class Son : public Base {
public:int m_D;
};void test01() {cout << "sizeof Son = " << sizeof(Son) << endl;
}int main() {test01();system("pause");return 0;
}
5.4 继承中构造和析构顺序
创建子类对象时,先调用父类的构造函数,再调用子类的构造函数。析构顺序相反。
示例代码:
class Base {
public:Base() {cout << "Base构造函数!" << endl;}~Base() {cout << "Base析构函数!" << endl;}
};class Son : public Base {
public:Son() {cout << "Son构造函数!" << endl;}~Son() {cout << "Son析构函数!" << endl;}
};void test01() {Son s;
}int main() {test01();system("pause");return 0;
}
5.5 继承同名成员处理方式
子类与父类出现同名成员时,可以通过作用域区分。
示例代码:
class Base {
public:void func() {cout << "Base - func()调用" << endl;}void func(int a) {cout << "Base - func(int a)调用" << endl;}int m_A;
};class Son : public Base {
public:void func() {cout << "Son - func()调用" << endl;}int m_A;
};void test01() {Son s;cout << "Son下的m_A = " << s.m_A << endl;cout << "Base下的m_A = " << s.Base::m_A << endl;s.func();s.Base::func();s.Base::func(10);
}int main() {test01();system("pause");return 0;
}
5.6 继承同名静态成员处理方式
静态成员同名处理方式与非静态成员相同。
示例代码:
class Base {
public:static void func() {cout << "Base - static void func()" << endl;}static void func(int a) {cout << "Base - static void func(int a)" << endl;}static int m_A;
};int Base::m_A = 100;class Son : public Base {
public:
static void func() {
cout << "Son - static void func()" << endl;
}
static int m_A;
};
int Son::m_A = 200;
void test01() {
cout << "通过对象访问: " << endl;
Son s;
cout << "Son 下 m_A = " << s.m_A << endl;
cout << "Base 下 m_A = " << s.Base::m_A << endl;
cout << "通过类名访问: " << endl;
cout << "Son 下 m_A = " << Son::m_A << endl;
cout << "Base 下 m_A = " << Son::Base::m_A << endl;
}
void test02() {
cout << "通过对象访问: " << endl;
Son s;
s.func();
s.Base::func();
cout << "通过类名访问: " << endl;
Son::func();
Son::Base::func();
Son::Base::func(100);
}
int main() {
test01();
test02();
system("pause");
return 0;
}
5.7 多继承语法
C++允许一个类继承多个类。
示例代码:
class Base1 {
public:Base1() {m_A = 100;}int m_A;
};class Base2 {
public:Base2() {m_A = 200;}int m_A;
};class Son : public Base2, public Base1 {
public:Son() {m_C = 300;m_D = 400;}int m_C;int m_D;
};void test01() {Son s;cout << "sizeof Son = " << sizeof(s) << endl;cout << s.Base1::m_A << endl;cout << s.Base2::m_A << endl;
}int main() {test01();system("pause");return 0;
}
5.8 菱形继承
菱形继承是指两个派生类继承同一个基类,而另一个类又同时继承这两个派生类。
示例代码:
class Animal {
public:int m_Age;
};class Sheep : virtual public Animal {};class Tuo : virtual public Animal {};class SheepTuo : public Sheep, public Tuo {};void test01() {SheepTuo st;st.Sheep::m_Age = 100;st.Tuo::m_Age = 200;cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl;cout << "st.Tuo::m_Age = " << st.Tuo::m_Age << endl;cout << "st.m_Age = " << st.m_Age << endl;
}int main() {test01();system("pause");return 0;
}
相关文章:
【C++初学】C++核心编程技术详解(二):类与继承
函数提高 3.1 函数默认参数 函数的形参可以有默认值,调用时可以省略这些参数。 示例代码: int func(int a, int b 10, int c 10) {return a b c; }int main() {cout << "ret " << func(20, 20) << endl;cout <<…...
紧急任务插入,如何不影响原计划
面对紧急任务插入,为确保不影响原计划,需要做到:重新明确任务优先级、合理调整资源配置、灵活管理时间和任务、建立紧急任务处理流程、有效沟通与反馈。其中,重新明确任务优先级最为关键。这可以帮助项目团队快速确定哪些任务需立…...
蓝桥杯赛前题
开始每个人能量为3 答题了,答题者1 扣分最后算 #include<bits/stdc.h> using namespace std;const int N1e510; int a[N]; int main(){int n,k,q;cin>>n>>k>>q;for(int i1;i<n;i){a[i]k; }for(int i1;i<q;i){int x;cin>>x;a[…...
ETL的核心概念与价值
在数字化转型的浪潮中,数据已成为企业决策的基石。然而,面对分散、异构且质量参差不齐的数据源,如何高效整合并挖掘其价值?这一问题的答案,指向了一项关键的技术——ETL(Extract-Transform-Load)…...
神经动力学系统与计算及AI拓展
大脑,一个蕴藏在我们颅骨之内的宇宙,以活动脉动,如同由电信号和化学信号编织而成的交响乐,精巧地协调着思想、情感和行为。但是,这种复杂的神经元舞蹈是如何产生我们丰富多彩的精神生活的呢?这正是神经动力…...
力扣DAY46-50 | 热100 | 二叉树:展开为链表、pre+inorder构建、路径总和、最近公共祖先、最大路径和
前言 中等 、困难 √,越来越有手感了,二叉树done! 二叉树展开为链表 我的题解 前序遍历树,当遇到左子树为空时,栈里pop节点,取右子树接到左子树位置,同时断开该右子树与父节点的连接&#x…...
备赛蓝桥杯-Python-考前突击
额,,离蓝桥杯开赛还有十个小时,最近因为考研复习节奏的问题,把蓝桥杯的优先级后置了,突然才想起来还有一个蓝桥杯呢。。 到目前为止python基本语法熟练了,再补充一些常用函数供明天考前再背背,算…...
蓝桥杯 Web 方向入门指南:从基础到实战
一、蓝桥杯 Web 方向简介 蓝桥杯是国内最具影响力的编程竞赛之一,Web 方向主要考察前端开发和后端服务能力。比赛形式为 4 小时限时编程,题型包括页面布局、数据交互、API 开发等。根据最新大纲,大学组需掌握 HTML5、CSS3、JavaScript、Vue.…...
生命篇---心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介
生命篇—心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介 文章目录 生命篇---心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介一、前言二、急救1、心肺复苏(CPR)(1)适用情况(2)操作…...
C++Cherno 学习笔记day19 [76]-[80] std::optional、variant、any
b站Cherno的课[76]-[80] 一、如何处理OPTIONAL数据 std::optional二、单一变量存放多类型的数据 std::variant三、如何存储任意类型的数据 std::any四、如何让C运行得更快五、如何让C字符串更快 一、如何处理OPTIONAL数据 std::optional std::optional C17 数据是否存在是可选…...
【Python Requests 库详解】
目录 简介一、安装与导入安装导入 二、发送 HTTP 请求1. GET 请求基本请求URL 参数 2. POST 请求表单数据提交JSON 数据提交文件上传 3. 其他方法PUT 请求示例DELETE 请求示例 三、处理响应1. 响应内容解析文本内容处理二进制内容处理JSON 数据处理 2. 响应状态与头信息状态码检…...
二维偏序-蓝桥20102,没写完
代码: 暴力:只过了35%,双重for循环o(n^2)1e10; #include <iostream> #include <bits/stdc.h> using namespace std; const int N1e910; typedef long long LL; typedef pair<int,int> PII;int main() {// 请在此输入您的代码//相当于…...
ASEG的鉴定
等位基因特异性表达(Allele-Specific Expression, ASE)基因的鉴定是研究杂种优势和基因表达调控的重要手段。以下是鉴定ASE基因的详细流程和方法: ### **1. 实验设计与样本准备** - **选择材料**:选择杂交种及其亲本作为研究材料。例如,玉米中的B73和Mo17及其杂交组合B73…...
从零开始:在 GrapesJS Style Manager 中新增 row-gap 和 column-gap
在前端开发中,页面样式的灵活性和可扩展性至关重要。GrapesJS 作为一个强大的网页构建工具,其内置的 Style Manager 提供了常见的 CSS 样式的可视化设置,极大地方便了开发者和设计师。然而,随着项目需求的不断变化,有些…...
解决双系统ubuntu24.04开机出现花屏等情况
1. 问题描述: 刚刚装上的双系统ubuntu24.04开机就出现花屏情况 2. 解决方案 安装显卡驱动 查看显卡型号 查看显卡硬件支持的驱动类型 ubuntu-drivers devices如果输入没有反映,请更新软件源,或者换官方软件源 sudo add-apt-repository…...
基于SpringBoot的智慧社区管理系统(源码+数据库)
499基于SpringBoot的智慧社区管理系统,系统包含三种角色:管理员、用户主要功能如下。 【用户功能】 1. 首页:查看系统。 2. 超市商品:浏览超市中各类商品信息。 3. 动物信息:了解社区内的动物种类和相关信息。 4. 车位…...
通俗理解CLIP模型如何实现图搜图乃至文搜图
一、图搜图与文搜图 图搜图和文搜图的场景相信大家并不少见,比如度娘的搜索框就可以直接上传图片找到相似的图片,还有某宝某团都有这种上传图片匹配到相似商品或者商品页的推荐的功能。那比如我想搜一张“正在跳舞的狗”的图片,是不是就能搜…...
谷歌最近放出大招——推出全新“Agent Development Kit(简称ADK)
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
std::string` 类
以下是对 std::string 类中 修改操作 和 字符串操作 的示例代码,帮助你更好地理解这些函数的使用: 5. 修改操作 (1) operator 用于追加字符串、C 风格字符串或字符。 #include <iostream> #include <string>int main() {std::string str …...
Sping Cloud配置和注册中心
1.Nacos实现原理了解吗? Nacos是注册中心,主要是帮助我们管理服务列表。Nacos的实现原理大概可以从下面三个方面来讲: 服务注册与发现:当一个服务实例启动时,它会向Nacos Server发送注册请求,将自己的信息…...
Java基础 - 泛型(常见用法)
文章目录 泛型类泛型方法泛型类派生子类示例 1:子类固定父类泛型类型(StringBox 继承自 Box<String>)示例 2:子类保留父类泛型类型(AdvancedBox<T> 继承自 Box<T>)示例 3:添加子类自己的…...
待排序元素规模较小时,宜选取哪种排序算法效率最高
当待排序元素规模较小时,通常选择以下几种简单高效的排序算法,因为它们在小规模数据下具有更低的常数开销和良好的局部性表现: ✅ 插入排序(Insertion Sort) 推荐理由:在数据量小、数据部分有序的情况下&a…...
SAQ评级是什么,SAQ评级的意义?对企业发展好处
SAQ评级(Supplier Audit Questionnaire,供应商审计问卷评级)是供应链管理中常见的一种评估机制,主要用于对供应商的质量、合规性、风险管理能力等进行标准化审核和分级。它常见于汽车、电子、医药等对供应链要求严格的行业&#x…...
嵌入式---电机分类
一、按电流类型分类(最基础分类) 1. 直流电机(DC Motor) 工作原理:通过换向器(有刷)或电子换向(无刷)将直流电源转换为交变磁场,驱动转子旋转。 核心特点&a…...
定制一款国密浏览器(5):修改浏览器名称
在上一章中,我介绍了如何修改浏览器的 logo,这一章介绍修改浏览器的名称。 浏览器的名称是 AI 帮我想的,英文名 Mojo Browser,中文名墨舟浏览器。 第一步先修改 desktop 文件,desktop 文件支持多语言化,遵循 Freedesktop.org 制定的 Desktop Entry Specification 规范。…...
水库大坝安全监测系统
水库大坝安全监测系统是现代水利管理中至关重要的组成部分,是一种用于实时监控和评估大坝结构安全状况的技术系统,通过多种技术手段实现对水库大坝的全方位、全天候监测,旨在确保大坝的稳定性和安全性,预防潜在风险。 系统构成 …...
文件IO5(JPEG图像原理与应用)
JPEG图像原理与应用 ⦁ 基本概念 JPEG(Joint Photographic Experts Group)指的是联合图像专家组,是国际标准化组织ISO制订并于1992年发布的一种面向连续色调静止图像的压缩编码标准,所以也被称为JPEG标准。 同样,JP…...
开源Cursor替代品——Void
我原先写过很多关于Cursor文章。 今天分享一个开源的 Cursor 替代方案。 如果你也热爱开源项目,那么这篇文章正是为你准备的! 寻找开源替代的原因 我一直在思考:市面上这类产品层出不穷,但真正的核心技术似乎都依赖于大语言模型(LLM)。于是萌生了一个想法——何不自己…...
DAOS系统架构-组件
如上图所示,一个完整的DAOS系统是由管理节点组件、客户端节点组件、服务端节点组件以及网络通信组件四个部分组成。管理节点组件通过管理网络通道(蓝色)对DAOS服务管理和监控。客户端节点组件通过数据网络通道(红色)与…...
论文精读:MSCA-Net:多尺度上下文聚合网络在红外小目标检测中的突破
论文地址:https://arxiv.org/pdf/2503.17193 目录 一、论文结构解析 二、三大创新点详解 1. 多尺度增强检测注意力(MSEDA) 2. 位置卷积块注意力模块(PCBAM) 3. 通道聚合模块(CAB) 三、实验结果对比 定量分析(表I关键数据) 定性对比 四、应用场景展望 五、总…...
LangGraph 使用指南
安装配置 安装依赖 LangGraph 可以通过 pip 安装: pip install langgraph如果您想使用最新的功能和改进,可以从源代码安装: pip install githttps://github.com/langchain-ai/langgraph.git环境配置 LangGraph 与 LangChain 共享许多配置…...
C++指针(四)万字图文详解!
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 相关文章:C指针(一)、C指针(二)、C指针(三) 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…...
【AI提示词】长期主义助手提供规划支持
提示说明 长期主义是一种关注长期利益和持续学习的思维模式,帮助个人和组织在快速变化的环境中保持耐心和系统性思考。 提示词 # Role: Long-termist Assistant## Profile - language: 中文 - description: 长期主义是一种关注长期利益和持续学习的思维模式&…...
JavaScript逆向工程:如何判断对称加密与非对称加密
在现代Web应用安全分析中,加密算法的识别是JavaScript逆向工程的关键环节。本文将详细介绍如何在逆向工程中判断JavaScript代码使用的是对称加密还是非对称加密。 一、加密算法基础概念 1. 对称加密 (Symmetric Encryption) 特点:加密和解密使用相同的…...
制造企业如何通过实现数据统一?
随着生产规模的扩大、供应链的复杂化以及市场需求的快速变化,企业内部的数据管理问题日益凸显。数据孤岛、数据冗余、数据不一致等问题不仅降低了运营效率,还可能导致决策失误。那么,制造企业如何才能打破这些壁垒,实现数据的统一…...
ICRA-2025 | 视觉预测助力机器人自主导航!NavigateDiff:视觉引导的零样本导航助理
论文:Yiran Qin 1 , 2 ^{1,2} 1,2, Ao Sun 2 ^{2} 2, Yuze Hong 2 ^{2} 2, Benyou Wang 2 ^{2} 2, Ruimao Zhang 1 ^{1} 1单位: 1 ^{1} 1中山大学, 2 ^{2} 2香港中文大学深圳校区论文标题:NavigateDiff: Visual Predictors are Ze…...
Java 与 LibreOffice 集成开发指南
1. 引言 Java 与 LibreOffice 的集成开发为开发者提供了一种强大的工具,用于实现文档自动化处理、文档转换、内容编辑等任务。通过 Java 调用 LibreOffice 提供的 API,可以实现跨平台的文档处理功能,满足各种业务需求。本文将详细介绍如何使…...
如果单表数据量大,只能考虑分库分表吗
程序员最怕啥?不是需求改八遍,也不是半夜报警电话,而是数据库突然卡成PPT!尤其是当单表数据冲到几千万行,查询慢得像老牛拉车,这时候团队第一反应往往是:“赶紧分库分表!” 但兄弟,分库分表可不是什么温柔小姐姐,它更像是个浑身带刺的仙人掌——你以为抱上就能解决问…...
3.3.1 spdlog异步日志
文章目录 3.3.1 spdlog异步日志1. spdlog1. 日志作用2 .同步日志和异步日志区别 2. spdlog是什么下载命令:2. spdlog为什么高效3. spdlog特征5. spdlog输出控制6. 处理流程7. 文件io8.问题 2. 如何创建logger3. 如何创建sink4. 如何自定义格式化5. 如何创建异步日志…...
【Web功能测试】注册与登录功能测试用例设计深度解析
1 注册功能测试用例设计 1.1 明确需求与测试范围 必填字段:手机号、验证码、密码 手机号规则:11位手机号 密码规则:6-16位,需包含大小写字母必须同时存在,数字或符号存在其一 协议勾选 提交后跳转登录页或显示成功…...
netstat 查看端口占用、杀死进程
文章目录 查看端口占用强制杀死 报错信息使用 lsof 查看端口占用 netstat -tanlp强制杀死 在安全的情况下,用下面命令杀死端口占用的进程 sudo kill $(sudo lsof -t -i:3128)报错信息 部署程序时,会出现这样的报错: Error response from…...
Windows 11 PowerShell重定向文本文件的编码问题
目录 问题的由来 编码导致的问题 解决办法 VSCode进行转换 记事本进行转换 直接指定输出的文本编码 总结 问题的由来 在我的嵌入式系统的课程中有一个裸机开发的实验,其中需要把图片等文件转换为C语言数组保存在程序中。课程中,我推荐了CodePlea的…...
蓝桥杯冲刺:一维差分
系列文章目录 蓝桥杯系列:一维差分 文章目录 系列文章目录前言一、一维差分: 差分数组的意义: 二、差分的性质: 差分和前缀和的关系 三、一维差分代码实现:四、典型真题(利用一维差分来实现) 这…...
理解企业内部信息集成
目录 1. 技术平台集成 2. 数据集成 3. 应用集成 4. 业务过程集成 5. 应用集成与企业内部信息集成的区别 企业内部信息集成是将分散的技术、数据、应用和业务流程整合为一个协同的整体,以提高效率、减少冗余和增强决策能力。 企业内部信息集成一般可以分为4个方…...
论文学习:《利用图注意力网络增强单细胞多组学数据的整合》
原文标题:Enhanced Integration ofSingle-Cell Multi-Omics Data Using Graph Attention Networks 原文链接:https://pubs.acs.org/doi/abs/10.1021/acssynbio.4c00864 跨不同组学层的数据集成面临的挑战:高维度、异质性和稀疏性。 变分自编码…...
HumanDil-Ox-LDL:保存:2-8℃保存,避免强光直射,不可冻存
化学试剂的基本介绍: /// 英文名称:HumanDil-Oxidized LowDensityLipoprotein /// 中文名称:人源红色荧光标记氧化型低密度脂蛋白 /// 浓度:1.0-4.0 mg/ml /// 外观:乳状液体 /// 缓冲液组分:PBS&…...
基于3d相机的点云物体检测与路径规划
🧩 代码结构和解释: 点云预处理 (preprocess_point_cloud): 使用 Voxel 下采样 来减少点云数据量,去除不必要的噪声。 使用 统计滤波器 去除离群点,以提高后续拟合的精度。 V型焊缝路径拟合 (fit_weld_path_v)&…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(2):んです
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(2):んです 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)~んです & ~の(2)意味(いみ)&形(かたち)&使い方(つかいかた)(3)そうなんですか & そうなんだ。(4)何をしているんですか & 何を…...
yolov8在windows系统的C++版本的onnxruntime部署方法
1.各个软件的的环境需要保持在统一的版本。 onnxruntime需要和cuda的版本对应上,版本号:onnxruntime-win-x64-gpu-1.18.1 ,链接: NVIDIA - CUDA | onnxruntime cuda:本机显卡支持的版本,cuda11.7,链接:CUDA Toolkit Archive | NVIDIA Developer cudnn:需要对应到cud…...
AD软件的系统设置
设置 1.自动保存(DATA -> backup) 2.原理图-复制元器件递增位号 3.原理图-用斜线表示负信号 4.PCB-选择移动重叠的元器件 5.PCB-十字光标全屏大小 6.PCB-选择部分连接网络的走线全亮/显示多个网络的颜色(TP) 7.PCB-DRC报错的图…...