C++ 友元、重载、继承、多态
友元
关键字:friend
友元的三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
全局函数做友元
//建筑物类
class Building
{//goodGay全局函数是Building好朋友,可以访问Building中私有成员friend void goodGay(Building& building);
public:Building(){m_SittingRoom = "客厅";m_bedRoom = "卧室";}string m_SittingRoom;
private:string m_bedRoom;
};
//全局函数
void goodGay(Building& building)
{cout << "好基友全局函数正在访问:" << building.m_SittingRoom << endl;cout << "好基友全局函数正在访问:" << building.m_bedRoom << endl;}
void test01()
{Building building;goodGay(building);
}
类做友元
class Building;
class goodGay;
class goodGay
{
public:goodGay();void visit();
private:Building* building;
};
//建筑物类
class Building
{ friend class goodGay;
public:Building();string m_SittingRoom;
private:string m_bedRoom;
};
Building::Building()
{this->m_SittingRoom = "客厅";this->m_bedRoom = "卧室";
}
goodGay::goodGay()
{building = new Building;
}
void goodGay::visit()
{cout << "好基友全局函数正在访问:" << building->m_SittingRoom << endl;cout << "好基友全局函数正在访问:" << building->m_bedRoom << endl;
}void test01()
{goodGay gg;gg.visit();
}
成员函数做友元
class Building;
class goodGay;
class goodGay
{
public:goodGay();void visit();void visit2();//只让visit访问私有属性,visit2不能访问
private:Building* building;
};
//建筑物类
class Building
{ friend void goodGay::visit();
public:Building();string m_SittingRoom;
private:string m_bedRoom;
};
Building::Building()
{this->m_SittingRoom = "客厅";this->m_bedRoom = "卧室";
}
goodGay::goodGay()
{building = new Building;
}
void goodGay::visit()
{cout << "好基友全局函数正在访问:" << building->m_SittingRoom << endl;cout << "好基友全局函数正在访问:" << building->m_bedRoom << endl;
}
void goodGay::visit2()
{cout << "好基友全局函数正在访问:" << building->m_SittingRoom << endl;//cout << "好基友全局函数正在访问:" << building->m_bedRoom << endl;
}void test01()
{goodGay gg;gg.visit();}
重载
运算符重载
加号运算符重载
成员函数重载
class Person
{
public://1. 成员函数重载+号Person operator+(Person& p){Person temp;temp.m_A = this->m_A + p.m_A;temp.m_B = this->m_B + p.m_B;return temp;}int m_A;int m_B;
};
void test01()
{Person p1;p1.m_A = 10;p1.m_B = 10;Person p2;p2.m_A = 10;p2.m_B = 10;//成员函数重载本质调用//Person p3 = p1.operator+(p2);Person p3 = p1 + p2;cout << "m_A:" << p3.m_A << ", m_B:" << p3.m_B << endl;}
全局函数重载和函数重载
class Person
{
public:int m_A;int m_B;
};
//2. 全局函数重载+号
Person operator+(Person& p1, Person& p2)
{Person temp;temp.m_A = p1.m_A + p2.m_A;temp.m_B = p1.m_B + p2.m_B;return temp;
}
//函数重载的版本
Person operator+(Person& p1, int num)
{Person temp;temp.m_A = p1.m_A + num;temp.m_B = p1.m_B + num;return temp;}
void test01()
{Person p1;p1.m_A = 10;p1.m_B = 10;Person p2;p2.m_A = 10;p2.m_B = 10;//全局函数重载本质调用//Person p3 = operator+(p1, p2);Person p3 = p1 + p2;//运算符重载 也可以发生函数重载Person p4 = p1 + 100;cout << "m_A:" << p3.m_A << ", m_B:" << p3.m_B << endl;cout << "m_A:" << p4.m_A << ", m_B:" << p4.m_B << endl;}
总结1:对于内置的数据类型的表达式的运算符是不可能改变的
总结2:不要滥用运算符重载
左移运算符重载
只能利用全局函数重载左移运算符,因为如果利用成员函数重载,左移运算符 p.operator<<(cout) 简化版本为p<<cout,无法实现cout在左侧
重载运算符目的:只输出对象p就可以实现输出p中的所有成员属性。
class Person
{friend ostream& operator<<(ostream& cout, Person& p);
public:Person(int a, int b){m_A = a;m_B = b;}
private:int m_A;int m_B;
};
// 只能利用全局函数重载左移运算符
ostream& operator<<(ostream& cout, Person& p)//本质:operstor(cout, p)
{cout << "m_A = " << p.m_A << ", m_B = " << p.m_B;return cout;
}void test01()
{Person p(10, 10);cout << p << endl;
}
递增运算符重载
class MyInteger
{friend ostream& operator<<(ostream& cout, MyInteger myint);
public://重载前置++运算符,返回引用为了一直对一个数据进行递增操作MyInteger& operator++(){//先进行++运算m_Num++;//再将自身做返回return *this;}//重载后置++运算符//void operator++(int) //int代表占位参数,可以用于区分前置和后置递增MyInteger operator++(int){//先 记录当时结果MyInteger temp = *this;//后 递增m_Num++;//最后将记录结果做返回return temp;}MyInteger(int num){m_Num = num;}
private:int m_Num;
};ostream& operator<<(ostream& cout, MyInteger myint)
{cout << myint.m_Num << endl;return cout;
}void test01()
{MyInteger myint(0);cout << ++(++myint);cout << myint;cout << myint++;cout << myint;
}
总结:前置递增返回引用,后置递增返回值。
赋值运算符重载
class Person
{
public:Person(int age);~Person();Person& operator=(Person& p);int* m_Age;
};
Person::Person(int age)
{//将年龄数据开辟到堆区m_Age = new int(age);
}
Person::~Person()
{if (m_Age != NULL){delete m_Age;m_Age = NULL;}
}
//重载 赋值运算符
Person& Person::operator=(Person& p)
{//编译器是提供浅拷贝//m_Age = p.m_Age;//应该先判断是否有属性在堆区,如果有先释放干净,然后再深拷贝if (m_Age != NULL){delete m_Age;m_Age = NULL;}//深拷贝m_Age = new int(*p.m_Age);//返回对象本身return *this;
}
void test01()
{Person p1(18);Person p2(20);Person p3(25);p1 = p2 = p3;cout << "p1年龄:" << *p1.m_Age << endl;cout << "p2年龄:" << *p2.m_Age << endl;cout << "p3年龄:" << *p3.m_Age << endl;}
关系运算符重载
作用:重载关系运算符,可以让两个自定义类型对象进行对比操作
class Person
{
public:Person(string name, int age);bool operator==(Person& p);bool operator!=(Person& p);private:string m_Name;int m_Age;
};Person::Person(string name, int age)
{m_Name = name;m_Age = age;
}
bool Person::operator==(Person& p)
{if (m_Name == p.m_Name && m_Age == p.m_Age){return true;}return false;
}
bool Person::operator!=(Person& p)
{if (m_Name == p.m_Name && m_Age == p.m_Age){return false;}return true;
}
void test01()
{Person p1("Bob", 18);Person p2("Bob", 20);if (p1 != p2){cout << "p1和p2不相等!" << endl;}else{cout << "p1和p2相等!" << endl;}
}
函数调用运算符重载
- 函数调用运算符()也可以重载
- 由于重载后使用的方式非常像函数的调用,因此称为仿函数
- 仿函数没有固定写法,非常灵活
重定义可打印函数和可加函数
class MyPrint
{
public:void operator()(string text);
private:};
void MyPrint::operator()(string text)
{cout << text << endl;
}
class MyAdd
{
public:int operator()(int num1, int num2){int ret = num1 + num2;return ret;}private:};void test01()
{MyPrint myprint;myprint("hello world!"); //由于使用起来非常类似于函数调用,因此称为仿函数MyAdd myadd;int ret = myadd(10, 20);cout << "ret=" << ret << endl;//匿名对象cout << MyAdd()(23, 23) << endl;}
继承
继承是面向对象三大特性之一
继承的好处:减少重复代码
语法 --- class 子类:继承方式
子类 也称为 派生类
父类 也称为 基类
class A: public B;
继承方法
- 公共继承
- 保护继承
- 私有继承
继承中的对象模型
父类中所有非静态成员属性都会被子类继承下去
父类中私有成员属性,是被编译器给隐藏了,因此是访问不到,但确实被继承下去了
使用开发工具查看对象模型:
打开工具窗口,定位到当前cpp文件的盘符,然后输入:
cl /d1 reportSingleClassLayout查看的类名 所属文件名
继承中构造和析构顺序
继承中,先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反
子类和父类同名成员处理
子类对象可以直接访问到子类中同名成员
如果通过子类对象 访问到父类中同名成员,需要加作用域
如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
如果想访问到父类中被隐藏的同名成员函数,需要加作用域
多继承语法
C++允许一个类继承多个类
语法:class 类:继承方式 父类1,继承方式 父类2
class Son: public Base1, public Base2
{}
多继承中如果父类出现了同名情况,子类使用时候要加作用域
C++实际开发中不建议用多继承
菱形继承
菱形继承概念
两个派生类继承同一个基类
又有某个类同时继承者两个派生类
这种继承被称为菱形继承,或钻石继承
典型菱形继承案例
菱形继承问题
- 菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义
- 利用虚继承可以解决菱形继承的问题
继承之前 加上关键字 virtual 变为虚继承
Animal类称为 虚基类
//动物类
class Animal
{
public:int m_Age;
};
//利用虚继承,解决菱形继承的问题
//继承之前 加上关键字 virtual 变为虚继承
//Animal类称为虚基类
class Sheep: virtual public Animal{};
class Tuo : virtual public Animal{};
class SheepTuo : public Sheep, public Tuo{};void test01()
{SheepTuo st;st.Sheep::m_Age = 18;st.Tuo::m_Age = 21;//当菱形继承,两个父类拥有相同属性,需要加以作用域区分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;
}
多态
多态的基本概念
多态是C++面向对象三大特性之一
多态分为两类
- 静态多态:函数重载和运算符重载属于静态多态,复用函数名
- 动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态区别:
- 静态多态的函数地址早绑定 - 编译阶段确定函数地址
- 动态多态的函数地址晚绑定 - 运行阶段确定函数地址
动态多态满足条件:
- 有继承关系
- 子类重写父类的虚函数
动态多态的使用:
父类的指针或引用,指向子类对象
class Animal
{
public://虚函数virtual void speak(){cout << "动物在说话!" << endl;}
};//猫类
class Cat : public Animal
{
public://重写 函数返回值类型 函数名 参数列表 完全相同void speak(){cout << "小猫在说话!" << endl;}
};
class Dog : public Animal
{
public:void speak(){cout << "小狗在说话!" << endl;}
};
//执行说话的函数 虽然传入Cat,但是还是动物说话,因为地址早绑定,在编译阶段确定函数地址
//如果想执行让猫说话,那么这个函数地址就不能提前绑定,需要在运行阶段绑定,地址晚绑定
//解决方法:virtual 虚函数
void doSpeak(Animal& animal)
{animal.speak();
}void test01()
{Cat cat;doSpeak(cat);Dog dog;doSpeak(dog);
}
多态原理
多态案例 - 计算机类
案例描述:分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算机类
多态的优点:
- 代码组织结构清晰
- 可读性强
- 利于前期和后期的扩展以及维护
传统写法
//传统计算器写法
class Calculator
{
public:int getResult(string oper){if (oper == "+"){return num1 + num2;}else if (oper == "-"){return num1 - num2;}else if (oper == "*"){return num1 * num2;}//如果要提供新的运算,需要修改源码}int num1;int num2;
};
void test01()
{Calculator c;c.num1 = 10;c.num2 = 10;cout << c.num1 << "+" << c.num2 << "=" << c.getResult("+") << endl;cout << c.num1 << "-" << c.num2 << "=" << c.getResult("-") << endl;cout << c.num1 << "*" << c.num2 << "=" << c.getResult("*") << endl;
}
多态写法
//利用多态写计算器
//多态好处:
//1. 组织结构清晰
//2. 可读性强
//3. 对于前期和后期扩展以及维护性高//实现计算器抽象类
class AbstractCalculator
{
public:virtual int getResult(){return 0;}int num1;int num2;
};
//加法计算器类
class AddCalculator: public AbstractCalculator
{
public:int getResult(){return num1 + num2;}
};
//乘法计算器类
class MulCalculator : public AbstractCalculator
{
public:int getResult(){return num1 * num2;}
};
//减法计算器类
class SubCalculator : public AbstractCalculator
{
public:int getResult(){return num1 - num2;}
};void test02()
{//多态使用条件//父类指针或引用指向子类对象AbstractCalculator* c = new AddCalculator;c->num1 = 10;c->num2 = 10;cout << c->num1 << "+" << c->num2 << "=" << c->getResult() << endl;delete c;SubCalculator a;AbstractCalculator& m = a;m.num1 = 20;m.num2 = 20;cout << m.num1 << "-" << m.num2 << "=" << m.getResult() << endl;
}
纯虚函数和抽象类
在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容
因此可以将虚函数改为纯虚函数
纯虚函数语法:virtual 返回值类型 函数名(参数列表)=0;
当类中有了纯虚函数,这个类也称为抽象类
抽象类特点:
- 无法实例化对象
- 子类必须重写抽象类中的纯虚函数,否则也属于抽象类
//纯虚函数
//只要有一个纯虚函数,这个类称为抽象类
class Base
{
public:virtual void func() = 0;
};
class Son: public Base
{
public:void func(){}
};void test01()
{//抽象类无法实例化对象//Base b; //new Base;//Son s; //子类必须重写父类中的纯虚函数,否则无法实例化对象Base* base = new Son;base->func();
}
多态案例2 - 制作饮品
案例描述:
制作饮品大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料
利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶
class AbstractDrink
{
public://煮水virtual void boil() = 0;//冲泡virtual void brew() = 0;//倒入杯中virtual void pour() = 0;//加入辅料virtual void addSomething() = 0;//制作饮品void makeDrink(){boil();brew();pour();addSomething();}
};
//制作咖啡
class Coffee : public AbstractDrink
{
public:void boil(){cout << "煮矿泉水" << endl;}void brew(){cout << "冲泡咖啡" << endl;}void pour(){cout << "倒入咖啡杯中" << endl;}void addSomething(){cout << "加糖和牛奶" << endl;}
};
//制作茶叶
class Tea : public AbstractDrink
{
public:void boil(){cout << "煮水" << endl;}void brew(){cout << "冲泡茶叶" << endl;}void pour(){cout << "倒入茶杯中" << endl;}void addSomething(){cout << "加柠檬" << endl;}
};
//制作函数
void doWork(AbstractDrink* abs)
{abs->makeDrink();delete abs;
}
void test01()
{//制作咖啡doWork(new Coffee);cout << "-----------------------------------------" << endl;//制作茶叶doWork(new Tea);
}
虚析构和纯虚析构
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
解决方式:将父类中的析构函数改为虚析构或纯虚析构
虚析构和纯虚析构共性:
- 可以解决父类指针释放子类对象
- 都需要有具体的函数实现
虚析构和纯虚析构区别:
- 如果是纯虚析构,该类属于抽象类,无法实例化对象
虚析构语法:
virtual ~类名(){}
纯虚析构语法:
virtual ~类名()=0;
class Animal
{
public:virtual void speak() = 0;Animal(){cout << "animal构造函数调用" << endl;}~Animal(){cout << "animal析构函数调用" << endl;}
};
class Cat : public Animal
{
public:Cat(string name){m_name = new string(name);cout << "cat构造函数调用" << endl;}~Cat(){if (m_name != NULL){cout << "Cat析构函数调用" << endl;delete m_name;m_name = NULL;} }void speak(){cout <<*m_name<< "小猫在说话" << endl;}string* m_name;
};
void test01()
{Animal* cat = new Cat("Tom");cat->speak();//父类指针在析构的时候,不会调用子类中析构函数//导致子类如果有堆区属性,出现内存泄漏delete cat;
}
上面代码无法调用cat的析构函数
将父类的析构函数变为虚函数即可访问子类析构函数。
class Animal
{
public://纯虚函数virtual void speak() = 0;Animal(){cout << "animal构造函数调用" << endl;}//利用虚析构可以解决 父类指针释放子类对象时不干净的问题/*virtual ~Animal(){cout << "animal析构函数调用" << endl;}*///纯虚析构virtual ~Animal();};
Animal::~Animal()
{cout << "animal纯析构函数调用" << endl;
}
class Cat : public Animal
{
public:Cat(string name){m_name = new string(name);cout << "cat构造函数调用" << endl;}~Cat(){if (m_name != NULL){cout << "Cat析构函数调用" << endl;delete m_name;m_name = NULL;}}void speak(){cout <<*m_name<< "小猫在说话" << endl;}string* m_name;
};
void test01()
{Animal* cat = new Cat("Tom");cat->speak();delete cat;}
总结:
- 虚析构或纯虚析构就是用来解决通过父类指针释放子类对象
- 如果子类中没有堆区数据,可以不写为虚析构或纯虚析构
- 拥有纯虚析构函数的类也属于抽象类
多态案例3 - 电脑组装
private:CPU* m_cpu;VideoCard* m_videoCard;Memory* m_memory;
};
class IntelCpu : public CPU
{
public:void calculate(){cout << "Intel的CPU正在计算。。。。。。" << endl;}
};
class IntelVc : public VideoCard
{
public:void display(){cout << "Intel显卡正在显示。。。。。。" << endl;}
};
class IntelMem : public Memory
{
public:void storage(){cout << "Intel的内存条正在存储。。。。。。" << endl;}
};class LenovoCpu : public CPU
{
public:void calculate(){cout << "Lenovo的CPU正在计算。。。。。。" << endl;}
};
class LenovoVc : public VideoCard
{
public:void display(){cout << "Lenovo显卡正在显示。。。。。。" << endl;}
};
class LenovoMem : public Memory
{
public:void storage(){cout << "Lenovo的内存条正在存储。。。。。。" << endl;}
};void test01()
{Computer* computer1 = new Computer(new IntelCpu, new IntelVc, new IntelMem);Computer* computer2 = new Computer(new LenovoCpu, new LenovoVc, new LenovoMem);Computer* computer3 = new Computer(new IntelCpu, new IntelVc, new LenovoMem);computer1->doWork();cout << "-------------------------------------" << endl;computer2->doWork();cout << "-------------------------------------" << endl;computer3->doWork();delete computer1;delete computer2;delete computer3;
}
相关文章:
C++ 友元、重载、继承、多态
友元 关键字:friend 友元的三种实现 全局函数做友元类做友元成员函数做友元 全局函数做友元 //建筑物类 class Building {//goodGay全局函数是Building好朋友,可以访问Building中私有成员friend void goodGay(Building& building); public:Build…...
Spring Boot 日志文件
前言 本篇博客主要介绍自定义的日志打印、日志的级别高低、如何保存日志等等..... 一、日志是什么?日志有什么用? 日志就是我们控制台上输出的内容,控制台上的输出的信息就是日志信息,如下所示: 日志有什么用&#x…...
vulhub venom
文章目录 靶场环境信息收集ftp服务二、信息利用三、任意文件上传三 sudo提权靶场环境 `vmware 靶场信息:https://www.vulnhub.com/entry/venom-1,701/ 下载地址:https://download.vulnhub.com/venom/venom.zip 新建虚拟机打开下载后的ovf文件 遇见导入失败合规性检查时,重试…...
量化交易之One Piece篇 - linux - 定时任务(重启服务器、执行程序、验证)
linux 执行命令: crontab -e 0 5 * * 1-5 sudo /sbin/shutdown -r now 0 17 * * 1-5 sudo /sbin/shutdown -r now 45 8 * * 1-5 cd /home/ubuntu/onepiece/bin/datacore && ./datacore 45 20 * * 1-5 cd /home/ubuntu/onepiece/bin/datacore && ./datacore 以…...
Qt5开发及实例V2.0-第二十三章-Qt-多功能文档查看器实例
Qt5开发及实例V2.0-第二十三章-Qt-多功能文档查看器实例 第23章 多功能文档查看器实例23.1. 简介23.2. 界面与程序框架设计23.2.1. 图片资源23.2.2. 网页资源23.2.3. 测试用文件 23.3 主程序代码框架23.4 浏览网页功能实现23.4.1 实现HtmIHandler处理器 23.5. 部分代码实现23.5…...
爬虫笔记_
爬虫简介 爬虫初始深入 爬虫在使用场景中的分类 通用爬虫: 抓取系统重要组成部分。抓取的是一整张页面数据 聚焦爬虫: 是建立在通用爬虫的基础上。抓取的是页面中特定的局部内容。 增量式爬虫 监测网站中数据更新的情况。只会抓取网站中最新更新出来的…...
Spring设计模式,事务管理和代理模式的应用
扩充:贝叶斯定理答案见底。 设计模式对关于面向对象问题的具体解决方案. 1,单例多例 在设计单例模式时,要注意两个点 1.构造方法要私有 2.成员变量要私有 3.创建对象所用的方法要被synchronized修饰.(因为方法体中会涉及到判断当…...
基于海康Ehome/ISUP接入到LiveNVR实现海康摄像头、录像机视频统一汇聚,做到物联网无插件直播回放和控制
LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…...
Linux下git安装及使用
Linux下Git使用 1. git的安装 sudo apt install git安装完,使用git --version查看git版本 2. 配置git git config --global user.name "Your Name“ ##配置用户 git config --global user.email emailexample.com ##配置邮箱git config --global --list …...
python读取图片
要在Python中读取图片,你可以使用第三方库Pillow(Python Imaging Library,PIL)或OpenCV。以下是使用这两个库的示例: 使用Pillow库读取图片: 首先,确保你已经安装了Pillow库。如果还没有安装&am…...
虚幻4学习笔记(15)读档 和存档 的实现
虚幻4学习笔记 读档存档 B站UP谌嘉诚课程:https://www.bilibili.com/video/BV164411Y732 读档 添加UI蓝图 SaveGame_UMG 添加Scroll Box 修改Scrollbar Thickness滚动条厚度 15 15 勾选 is variable 添加text 读档界面 添加背景模糊 添加UI蓝图 SaveGame_Slot …...
Spring面试题22:Spring支持哪些ORM框架?优缺点分别是什么?Spring可以通过哪些方式访问Hibernate?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持哪些ORM框架?优缺点分别是什么? Spring 支持多种 ORM(对象关系映射)框架,其中包括: Hibernate:Hibernate 是一个强大的 ORM 框架…...
流行的Python库numpy及Pandas简要介绍
numpy.ndarray 是NumPy库中的主要数据结构,它是一个多维数组,用于存储和操作数值数据。NumPy是Python中用于数值计算的强大库,numpy.ndarray 是它的核心数据类型,提供了高效的数值运算和广泛的数学函数。 以下是 numpy.ndarray 的…...
【二、安装centOS】
下载 地址:https://mirrors.aliyun.com/centos/ 地址 1、https://mirrors.aliyun.com/centos/7.9.2009/ 2、https://mirrors.aliyun.com/centos/7.9.2009/isos/ 3、https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ 选哪一个 可以选择第一个࿰…...
【动手学深度学习-Pytorch版】序列到序列的学习(包含NLP常用的Mask技巧)
序言 这一节是对于“编码器-解码器”模型的实际应用,编码器和解码器架构可以使用长度可变的序列作为输入,并将其转换为固定形状的隐状态(编码器实现)。本小节将使用“fra-eng”数据集(这也是《动手学习深度学习-Pytor…...
AUTOSAR 面试知识回顾
如果答不上来,就讲当时做了什么 1. Ethernet基础: 硬件接口: ECU到PHY: data 是MII总线, 寄存器控制是SMI总线【MDCMDIO两根线, half duplex】PHY输出(100BASE-T1): MDI总线,2 wire 【T1: twisted 1 pair …...
华为NFC设置教程(门禁卡/公交卡/校园卡等)
今天把华为NFC设置教程分享给大家 出门带门禁卡、校园卡、银行卡、身份证……东西又多,携带又麻烦,还容易搞丢,有没有一种方法可以把它们都装下?有!只要一部手机,出门不带卡包,各种证件&#x…...
基于微信小程序的音乐播放器设计与实现(源码+lw+部署文档+讲解等)
前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…...
如何取消显示Notepad++每行显示的CRLF符号
新电脑中重新安装了Nodepad,打开记事本后发现出现了许多黑底的CR|LF标记,特别碍眼。 如何取消呢? 视图 -> 显示符号 -> 取消勾选 显示行尾符操作步骤 预期效果...
数据结构与算法之时间复杂度和空间复杂度(C语言版)
1. 时间复杂度 1.1 概念 简而言之,算法中的基本操作的执行次数,叫做算法的时间复杂度。也就是说,我这个程序执行了多少次,时间复杂度就是多少。 比如下面这段代码的执行次数: void Func1(int N) {int count 0;for…...
TLS/SSL(十) session缓存、ticket 票据、TLS 1.3的0-RTT
一 TLS优化手段 TLS 为了提升握手速度而提出优化手段,主要是减少TLS握手中RTT消耗的时间关于session cache和session ticket,nginx关于ssl握手的地方都有影子 [指令] https面经 ① session 缓存 resume: 重用,复用 案例: 第二次访问www.baidu.com 说明&#x…...
C++设计模式_06_Decorator 装饰模式
本篇将会介绍Decorator 装饰模式,它是属于一个新的类别,按照C设计模式_03_模板方法Template Method中介绍的划分为“单一职责”模式。 “单一职责”模式讲的是在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随…...
MySQL 8.0数据库主从搭建和问题处理
错误处理: 在从库通过start slave启动主从复制时出现报错 Last_IO_Error: error connecting to master slaveuser10.115.30.212:3306 - retry-time: 60 retries: 1 message: Authentication plugin caching_sha2_password reported error: Authentication require…...
公众号迁移多久可以完成?
公众号账号迁移的作用是什么?只能变更主体吗?长期以来,由于部分公众号在注册时,主体不准确的历史原因,或者公众号主体发生合并、分立或业务调整等现实状况,在公众号登记主体不能对应实际运营人的情况下&…...
Spring Cloud Stream Kafka(3.2.2版本)使用
问题 正在尝试只用Spring Cloud Stream Kafka。 步骤 配置 spring:cloud:function:definition: project2Building stream:kafka:binder:brokers: xxxx:9002configuration:enable.auto.commit: falsesession.timeout.ms: 30000max.poll.records: 30allow.auto.create.top…...
8位微控制器上的轻量级SM2加密算法实现:C语言详细指南与完整代码解析
引言 在当今的数字化世界中,安全性是每个系统的核心。无论是智能家居、医疗设备还是工业自动化,每个设备都需要确保数据的安全性和完整性。对于许多应用来说,使用高级的微控制器或处理器可能是不切实际的,因为它们可能会增加成本…...
neo4j下载安装配置步骤
目录 一、介绍 简介 Neo4j和JDK版本对应 二、下载 官网下载 直接获取 三、解压缩安装 四、配置环境变量 五、启动测试 一、介绍 简介 Neo4j是一款高性能的图数据库,专门用于存储和处理图形数据。它采用节点、关系和属性的图形结构,非常适用于…...
【机组】计算机系统组成课程笔记 第二章 计算机中的信息表示
2.1 无符号数和有符号数 2.1.1 无符号数 没有符号的数,其实就是非负数。在计算机中用字节码表示,目前最常用的是八位和十六位的。 2.1.2 有符号数 将正负符号数字化,0代表 ,1代表 - ,并把代表符号的数字放在有效数…...
指针笔试题详解
个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2.指针题写出下列程序的结…...
MySQL 日志管理、备份与恢复
目录 1 数据备份的重要性 2 MySQL 日志管理 3 备份类型 3.1 数据备份的分类 3.2 备份方式比较 3.3 合理值区间 3.4 常见的备份方法 4 MySQL 完全备份与恢复 4.1 MySQL 完全备份 5 mysqldump 备份与恢复 5.1 MySQL 完全恢复 6 MySQL 增量备份与恢复 6.1 MySQL 增量…...
南京专业网站设计公司/超级外链
老版本NDK下载列表 我们在开发或编译旧版本NDK项目时,需要使用一些老版本的NDK,在这里提供了旧版NDK的列表及下载链接: https://developer.android.com/ndk/downloads/older_releases...
上海建站中心/网络营销专业就业公司
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一…...
巩义网站建设方案表/ui设计公司
本次项目主要需要改进的方面: 1.界面 界面的优化是其中的一大项,群众和使用者第一眼看到的是软件的界面,能不能让大家感觉到眼前一亮的感觉是十分重要的,我们在界面上没有什么经验,不知道通过怎样的方式去进行修改&…...
网站开发类毕业论文/ip切换工具
输出解释CPU 以及CPU0。。。的每行的每个参数意思(以第一行为例)为:参数 解释 /proc//statusSize (total pages) 任务虚拟地址空间的大小 VmSize/4Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4Shared(pages) 共享页数 0Trs(pages) 程序所拥有的可执行…...
站长之家素材网/seo内部优化方案
“告警了!告警了!”。 "什么告警了?"正在睡梦中迷糊的小王突然被运维同事的一个电话叫醒,顿时一脸惊愕。 “慢查询!客户报障了!赶紧起来处理啊!” 小王赶紧打开便携,远程连…...
辽宁省朝阳网站建设/自媒体十大平台
随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 一、String x"abc";和String ynew String("abc")区别: String x"abc":变量x指向的是常量池的字符串常量对象。 Strin…...