当前位置: 首页 > news >正文

【C++继承】赋值兼容转换作用域派生类的默认成员函数

1.继承的概念

 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(或子类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

#include <iostream>using namespace std;class Person{public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age <<endl;}protected:string _name = "peter";// 姓名
int _age = 18;// 年龄
};// 继承后⽗类的Person的成员(成员函数+成员变量)都会变成⼦类的⼀部分。
// 这⾥体现出了Student和Teacher复⽤了Person的成员。
// 下⾯我们使⽤监视窗⼝查看Student和Teacher对象,可以看到变量的复⽤。调⽤Print可以看到成员函数的复⽤。
class Student: public Person{protected:int _stuid;//学号
};class Teacher: public Person{int _jobid;//⼯号
};int main(){Student s;Teacher t;s.Print();t.Print();}
输出结果:
name:peterage:18name:peterage:18Program ended with exit code: 0

继承的父类的成员(成员变量+成员函数),不过是把父类的成员变量拷贝给子类,并不指向同一个,子类中可以使用父类的成员变量,在子类里的改变不影响父类,但是成员函数是同一个

1.2继承的定义

1.2.1定义的格式

由上面我们可以看到Person是父类,也称作基类。Student是子类,也称作派生类

1.2.2继承关系和访问限定符

C++类的访问限定符用于控制类的成员(包括成员变量和成员函数)在类的外部的可访问性。   C++中有以下三种访问限定符:

public: 公共访问限定符,任何地方都可以访问公共成员。可以在类的外部使用对象名和成员名直接访问公共成员。

private: 私有访问限定符,只有类内部的其他成员函数可以访问私有成员。类的外部无法直接访问私有成员,但可以通过公共成员函数间接访问私有成员。

protected: 保护访问限定符,只有类内部的其他成员函数和派生类的成员函数可以访问保护成员。类的外部无法直接访问保护成员,但可以通过公共成员函数或派生类的成员函数间接访问保护成员。

需要注意的是,访问限定符只在类的内部起作用,在类的外部没有直接的影响。同时,访问限定符可以用于类的成员变量和成员函数的声明中,默认情况下,成员变量和成员函数的访问限定符是private。

1.2.3继承基类成员访问⽅式的变化

class Base {
public:// 公有成员
protected:// 保护成员
private:// 私有成员
};
class Derived : public Base {// 公有继承
}class Derived : protected Base {// 保护继承
};class Derived : private Base {// 私有继承
};

1.2.4总结

1.基类private成员在派⽣类中⽆论以什么⽅式继承都是不可⻅的,这⾥的不可⻅是指基类的私有成员还是被继 承到了派⽣类对象中,但是语法上限制派⽣类对象不管在类⾥⾯还是类外⾯都不能去访问它。

2.(★)基类private成员在派⽣类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派⽣类中 能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。

3.实际上⾯的表格我们进⾏⼀下总结会发现,基类的私有成员在⼦类都是不可⻅的。基类的其他成员在⼦类的 访问⽅式 == Min(成员在基类的访问限定符,继承⽅式),public > protected > private。

4.使⽤关键字class时默认的继承⽅式时private,使⽤struct时默认的继承⽅式是public,不过最好显示的写出 继承⽅式

5.在实际运⽤中⼀般使⽤都是public继承,⼏乎很少使⽤protected/private继承,也不提倡使⽤ protected/private继承,因为protected/private继承下来的成员都只能在派⽣类的类⾥⾯使⽤,实际中扩展维护 性不强

class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}
protected:string _name = "Peter"; //名字int _age = 18;  //年龄
private://父类定义私有的本质:不想被子类继承//但是在子类中有这个成员,不能直接使用,可以间接使用int _tel = 110;
};//基类的private成员,子类继承后在类外或在类中都不能访问
class Student : public Person
{
public:void Func(){//子类用不了(不可见)//cout << _tel << endl;//子类可以用cout << _name << endl;cout << _age << endl;}
protected:int _stuid; // 学号
};class Teacher : public Person
{
protected:int _jobid; // 工号
};int main()
{Student s;s.Print();Person p;p.Print();return 0;
}

2.基类和派生类对象赋值兼容转换

派⽣类对象 可以赋值给 基类的对象/基类的指针/基类的引⽤(⼦类可以赋值给⽗类)。这⾥有个形象的说法 叫切⽚或者切割。寓意把派⽣类中⽗类那部分切来赋值过去。

基类对象不能赋值给派⽣类对象

基类的指针或者引⽤可以通过强制类型转换赋值给派⽣类的指针或者引⽤。但是必须是基类的指针是指向派 ⽣类对象时才是安全的。这⾥基类如果是多态类型,可以使⽤RTTI(Run- Time Type Information)的dynamic cast 来进⾏识别后进⾏安全转换。(ps:这个我们后期再讲解,这⾥先了解⼀下)

//基类对象不能赋值给派生类对象
class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}
protected:string _name = "Peter"; //名字int _age = 18;  //年龄
};class Student : public Person
{
protected:int _stuid; // 学号
};class Teacher : public Person
{
protected:int _jobid; // 工号
};int main()
{Student s;Person p;// 1.子类对象可以赋值给父类对象/指针/引用//基类和派生类的赋值兼容转换p = s;Person* Ptr = &s;//指向子类当中父类的那一部分//引用的是子类当中父类的那一部分,//引用后这两者指向同一个东西,子类改变父类也变Person& ref = s;//2.基类对象不能赋值给派生类对象s = p;//errorreturn 0;
}

C语言中的类型截断,提升本质是类型转换,转换过程中会产生临时变量。而赋值兼容转换是一种特殊的语法规则,中间没有产生临时变量

3.继承中的作⽤域

(1) 在继承体系中基类和派生类都有独立的作用域

(2) 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问

  • 如果要访问被隐藏的父类的同名成员,可以在子类成员函数中,使用 父类::父类成员来显示访问

(3) 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏,不管参数和返回值。子类和父类中可以有同名成员变量,因为它们属不同的类域,同一类里不可以

(4) 注意在实际中在继承体系里面最好不要定义同名的成员。

如下面的代码中,此时s里就有两个_num,默认访问的是自己的,如果想访问父类的,指定作用域即可

class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;cout << "num:" << _num << endl;}
protected:string _name = "Peter"; //名字int _age = 18;  //年龄int _num = 999;
};class Student : public Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;cout << "num:" << _num << endl;//指定cout << "num:" << Person::_num << endl;}
protected:int _stuid; // 学号int _num = 111;};class Teacher : public Person
{
protected:int _jobid; // 工号
};//继承中的作用域//子类和父类中可以有同名成员变量,因为它们属不同的类域
//同一类里不可以
//此时s里就有两个_num,默认访问的是自己的(隐藏/重定义),
// 如果想访问父类的,指定作用域即可//如果是成员函数的隐藏,函数名相同就是隐藏,不管参数和返回值int main()
{Student s;//子类对象调用Print,先去子类里找,没有,再去父类中找s.Print();return 0;
}

4.派生类的默认成员函数

6个默认成员函数,“默认”的意思就是指我们不写,编译器会给我们⾃动⽣成⼀个,那么在派⽣类中,这⼏个成员 函数是如何⽣成的呢?

这里重点介绍构造函数,拷贝构造,赋值拷贝和析构函数

在讨论这个问题时,需要划分成下面三块:

父类成员(整体)
子类自己的内置成员
子类自己的自定义成员

基类:

class Person
{
public:Person(const char* name = "peter"): _name(name){cout << "Person()" << endl;}Person(const Person& p): _name(p._name){cout << "Person(const Person& p)" << endl;}Person& operator=(const Person& p){cout << "Person operator=(const Person& p)" << endl;if (this != &p)_name = p._name;return *this;}~Person(){cout << "~Person()" << endl;}
protected:string _name; // 姓名
};

4.1构造函数

子类默认生成的构造
(1) 父类成员(整体) – 调父类的默认构造
(2) 子类自己的内置成员 – 一般不做处理
(3) 子类自己的自定义成员 – 默认构造

父类的成员变量不能在子类中构造,规定只能调用父类的构造。

注意:
(1) 构造初始化时,要先父后子,因为子类构造初始化可能会用父类成员。若没有初始化父类,父类成员就是随机值,此时再用它构造子类就会出问题

(2) 成员变量的初始化顺序和初始化列表的顺序无关,而是与变量的声明顺序有关。在C++的初始化列表中,是默认先走父类构造初始化的

Student(const char* name = "", int x = 0, const char* address = "")//:_name(name) //规定了不能直接碰父类成员//: Person(name)//父类构造显示调用,可以保证先父后子:_x(x),_address(address),_name(Person::_name+'x'),Person(name)
{}

4.2拷贝构造

子类默认生成拷贝构造
(1) 父类成员(整体) – 调父类的拷贝构造
(2) 子类自己的内置成员 – 值拷贝
(3) 子类自己的自定义成员 – 调用自己的拷贝构造

注意:
(1) 一般不需要自己写,当子类成员涉及深拷贝时,就必须自己实现

(2) 调用父类的拷贝构造时,直接传子类对象过去,会自然的切割,赋值兼容转换

Student(const Student& st):Person(st)   //调用父类的拷贝构造,_x(st._x),_address(st._address)
{}

4.3赋值拷贝

子类默认生成赋值拷贝
(1) 父类成员(整体) – 调父类的赋值拷贝
(2) 子类自己的内置成员 – 值拷贝
(3) 子类自己的自定义成员 – 调用自己的赋值拷贝

注意:
(1) 一般不需要自己写,当子类成员涉及深拷贝时,就必须自己实现

(2)由于子类与父类的operator=()是隐藏关系,这里要指定类域,防止子类一直调用自己的,造成死循环

Student& operator=(const Student &st)
{if (this != &st){//operator = (st); //错误Person::operator= (st);//指定_x = st._x;_address = st._address;}return *this;
}

4.4析构函数

子类默认生成的析构
(1) 父类成员(整体) – 调父类的析构
(2) 子类自己的内置成员 – 不做处理
(3) 子类自己的自定义成员 – 调用自己的析构

注意:
父类析构不能显示调用,因为显示调用不能保证先子后父。析构时要先子后父,因为子类析构是可能会用到父类成员的。若先父后子,则父类成员会先析构一次,子类再析构就出问题了。

因此父类析构不是自己显式调用的,会在子类析构结束后自动调用。

//显示写析构
// 由于多态,析构函数的名字会被统一处理为destructor()
~Student()// 析构时先子后父
{//父类析构不能显示调用,因为显示调用不能保证先子后父// 析构函数会构成隐藏,因此要统一处理//Person::~Person();cout << "~Student()" << endl;
}
class Person{public://Person(const char* name = "")Person(const char* name = ""): 
_name(name){}cout << "Person()" << endl;Person(const Person& p): 
_name(p._name){}cout << "Person(const Person& p)" << endl;Person& operator=(const Person& p){cout << "Person operator=(const Person& p)" << endl;if (this != &p)_name = p._name;return *this;}~Person(){cout << "~Person()" << endl;delete[] _str;}protected:string _name; // 姓名char* _str = new char[10]{ 'x','y','z'};};class Student : public Person{public:// ⽗类构造显示调⽤,可以保证先⽗后⼦Student(const char* name = "", int x = 0, const char* address = ""):_x(x),_address(address),_name(Person::_name+'x'), Person(name){}Student(const Student& st):Person(st),_x(st._x), _address(st._address){}Student& operator=(const Student& st){if (this != &st){Person::operator=(st);_x = st._x;_address = st._address;}return *this;}// 由于多态,析构函数的名字会被统⼀处理成destructor()// ⽗类析构不能显示调⽤,因为显示调⽤不能保证先⼦后⽗~Student(){
// 析构函数会构成隐藏,所以这⾥要指定类域
//Person::~Person();cout << "~Student()" << endl;// delete [] _ptr;cout << _str << endl;}protected:int _x = 1;string _address = "⻄安⾼新区";string _name;//int* _ptr = new int[10];};// ⼦类默认⽣成的构造
// ⽗类成员(整体) -- 默认构造
// ⼦类⾃⼰的内置成员 -- ⼀般不处理
// ⼦类⾃⼰的⾃定义成员 -- 默认构造
// ⼦类默认⽣成的拷⻉构造  赋值重载跟拷⻉构造类似
// ⽗类成员(整体) -- 调⽤⽗类的拷⻉构造
// ⼦类⾃⼰的内置成员 -- 值拷⻉
// ⼦类⾃⼰的⾃定义成员 -- 调⽤他的拷⻉构造
// ⼀般就不需要⾃⼰写了,⼦类成员涉及深拷⻉,就必须⾃⼰实现
// ⼦类默认⽣成的析构
// ⽗类成员(整体) -- 调⽤⽗类的析构
// ⼦类⾃⼰的内置成员 -- 不处理
// ⼦类⾃⼰的⾃定义成员 -- 调⽤析构
//int main(){Student s1;Student s2("张三", 1, "⻄安市碑林区");Student s3 = s2;s1 = s3;return 0;}

5.继承和友元

友元关系不能继承,也就是说基类友元不能访问⼦类私有和保护成员

6.继承与静态成员

基类定义了static静态成员,则整个继承体系⾥⾯只有⼀个这样的成员。⽆论派⽣出多少个⼦类,都只有⼀个static 成员实例。

class Person{public:Person() { ++_count; }protected:string _name; // 姓名
public:static int _count; // 统计⼈的个数。
};int Person::_count = 0;class Student : public Person{protected:int _stuNum; // 学号
};
int main(){Person p;Student s;cout << Person::_count << endl;cout << Student::_count << endl;cout << &Person::_count << endl;cout << &Student::_count << endl;return 0;}
输出结果:
220x1000080000x100008000

7.复杂的菱形继承及菱形虚拟继承

单继承:⼀个⼦类只有⼀个直接⽗类时称这个继承关系为 单继承

多继承:⼀个⼦类有两个或以上直接⽗类时称这个继承关系为 多继承

菱形继承的问题:从下⾯的对象成员模型构造,可以看出菱形继承有数据冗余和⼆义性的问题。在Assistant的对象 中Person成员会有两份

class Person{public:string _name; // 姓名
int _id;int _tel;int _address;};class Student : public Person{protected:int _num; //学号
};class Teacher : public Person{protected:int _id; // 职⼯编号
};class Assistant : public Student, public Teacher
{protected:string _majorCourse; // 主修课程
};int main(){// 这样会有⼆义性⽆法明确知道访问的是哪⼀个
Assistant a ;//  a._name = "peter";// 需要显示指定访问哪个⽗类的成员可以解决⼆义性问题,但是数据冗余问题⽆法解决
a.Student::_name = "⼩李";a.Teacher::_name = "李⽼师";cout << a.Student::_name << endl;cout << a.Teacher::_name << endl;return 0;}
输出结果:
⼩李
李⽼师

7.2解决办法

虚拟继承可以解决菱形继承的⼆义性和数据冗余的问题。如上⾯的继承关系,在Student和Teacher的继承 Person时使⽤虚拟继承,即可解决问题。需要注意的是,虚拟继承不要在其他地⽅去使⽤。

class Person{public:string _name; // 姓名
int _id;int _tel;int _adress;};class Student : virtual public Person{protected:int _num; //学号
};class Teacher : virtual public Person{protected:int _id; // 职⼯编号
};class Assistant : public Student, public Teacher{protected:string _majorCourse; // 主修课程
};int main(){// 数据冗余和⼆义性
Assistant a;a.Student::_name = "⼩李";a.Teacher::_name = "李⽼师";a._name = "李益达";cout << a.Student::_name << endl;cout << a.Teacher::_name << endl;cout << a._name << endl;return 0;}
输出结果:
李益达
李益达
李益达

实践中:最好不要用到菱形继承

相关文章:

【C++继承】赋值兼容转换作用域派生类的默认成员函数

1.继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类(或子类)。继承呈现了面向对象程序设计的层次结构&#xf…...

HTML5+JavaScript绘制彩虹和云朵

HTML5JavaScript绘制彩虹和云朵 彩虹&#xff0c;简称虹&#xff0c;是气象中的一种光学现象&#xff0c;当太阳光照射到半空中的水滴&#xff0c;光线被折射及反射&#xff0c;在天空上形成拱形的七彩光谱&#xff0c;由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…...

MySQL——单表查询(二)按条件查询(2)带 IN 关键字的查询

IN 关键字用于判断某个字段的值是否在指定集合中&#xff0c;如果字段的值在集合中&#xff0c;则满足条件&#xff0c;该字段所在的记录将被查询出来。其语法格式如下所示&#xff1a; SELECT *|字段名 1,字段名 2,… FROM 表名 WHERE 字段名 [NOT〕IN(元素 1,元素 2,…) 在上…...

【mysql】mysql 用户管理---创建、权限管理等等

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

本地服务器物理机中redis设置、取消密码

1.服务器物理机上redis的操作【服务器中操作】 &#xff08;1&#xff09;首先先看一下当前运行中的redis实例&#xff1a; [rootiZuf67k70ucx14s6zcv54dZ var]# ps aux | grep redis-server因为我这里有两个实例在运行&#xff0c;即物理机上的redis和docker中的redis&…...

关于xilinx的FFTIP的使用和仿真

工具&#xff1a;vivado2018.3&#xff0c;modelsim10.6d 场景&#xff1a;在进行数据进行频谱分析的时候&#xff0c;使用FPGA来完成FFT的计算可以加快数据的计算速度。 下面使用仿真完成DDS产生的数据的FFT以及IFFT。原始数据使用DDSIP产生&#xff0c;通过IP产生的波形数据…...

ant design pro 如何去保存颜色

上图 就是实现这样的效果 后端是这样的&#xff0c;这个颜色肯定是存到字符串里的 这是第一步 import mongoose, { Schema, Document } from mongoose;interface IDiscountCard extends Document {title: string;subtitle: string;image: string;shopUrl: string;bgColor: s…...

【Hadoop】建立圈内组件的宏观认识

01存储02计算03调度04其他05回忆 众多组件们构建了大规模分布式计算和存储平台。本文介绍Hadoop生态圈中各个组件的主要功能和作用&#xff0c;辅助学者理解每个组件的定位和用途&#xff0c;从而建立对圈内组件的宏观认识。梳理清楚HDFS、MapReduce、YARN、Hive、HBase、Spark…...

C++:命名空间与输入输出

目录 前言 一、命名空间 1.1 namespace的价值 1.2 namespace的定义 1.3 命名空间的使用 二、C输入&输出 前言 C是一种面向对象的计算机程序设计语言&#xff0c;‌它扩展了C语言的功能&#xff0c;‌并引入了面向对象编程的概念&#xff0c;‌如类、‌继承和多态等&a…...

Azure DevOps Server 数据库日志已满,TF30042: The database is full

Contents 1. 问题描述2. 处理方式 2.1 系统备份2.2 收缩日志2.3 恢复模式2.4 日志增长无法控制 1. 问题描述 Azure DevOps Server 作为微软的软件开发管理平台产品&#xff0c;理所当然地使用了微软的数据库软件SQL Server。 在一个大型的开发团队中&#xff0c;Azure DevOps S…...

[C#]OpenCvSharp 实现Bitmap和Mat的格式相互转换

//转为 bitmap方法一&#xff1a; Bitmap map OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat); process_pictureBox.Image map; //转为 bitmap方法二&#xff1a; Bitmap map new Bitmap(mat.ToMemoryStream()); process_pictureBox.Image map; //Image img 转为…...

【区块链+金融服务】基于区块链的供应链金融系统 | FISCO BCOS应用案例

传统供应链金融存在着信息不对称、信任问题和繁琐流程等弊端。为了解决这些问题&#xff0c;京北方搭建了基于区块链 的供应链金融系统&#xff0c;提供了更高效、透明、安全和可信的交易环境。 系 统 采 用 FISCO BCOS 为 底 层 链&#xff0c; 技 术 栈 使 用 Java 语 言 进…...

AI语言大模型商业价值深度解析

点击蓝字 关注我 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;特别是深度学习算法的进步&#xff0c;AI语言大模型在自然语言处理领域的表现日益突出。国内外多种语言大模型如&#xff1a;OpenAi 的 ChatGpt&#xff0c;阿里通义千问&#xff0c;百度文心…...

理解DDD领域驱动设计思想

一、引言 在软件开发的广袤领域中&#xff0c;领域驱动设计&#xff08;Domain-Driven Design&#xff0c;简称 DDD&#xff09;犹如一颗璀璨的明星&#xff0c;备受瞩目。对于期望运用 DDD 开展项目的研发人员而言&#xff0c;明晰 DDD 的本质是实现其有效应用的基石。需注意…...

音频剪辑软件哪个好用?五大音频剪辑软件分享

如果你正打算在家自学视频制作&#xff0c;那么恭喜你&#xff0c;你已经踏上了一段充满魔法与惊喜的旅程&#xff01;不过&#xff0c;别忘了&#xff0c;视频的灵魂不仅仅在于画面&#xff0c;更在于那直击心灵的音效。 想象一下&#xff0c;一个精心剪辑的片段&#xff0c;…...

12.2 使用prometheus-sdk向pushgateway打点

本节重点介绍 : 使用golang sdk打prometheus4种指标&#xff0c;推送到pushgateway gauge、counter、histogram、summary的初始化4种类似的设置值的方法推送到pushgateway的方法 prometheus配置采集pushgateway&#xff0c;grafana上配大盘 golang-sdk 项目地址 https://git…...

HTTPS 详解

HTTPS 是以安全为目标的 HTTP 通道&#xff0c;它在 HTTP 中加入 SSL 层以提高数据传输的安全性。HTTP 被用于在 Web 浏览器和网站服务器之间传递信息&#xff0c;但以明文形式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如果攻击者截取了 Web 浏览器和网站服务…...

Microsoft Edge 使用方法与秘诀概览

目录 ​编辑引言 Microsoft Edge 功能与技巧概览 掌握这些设置技巧&#xff0c;让 Edge 浏览器的体验更干净 1. 使用阅读视图 2. 开启广告过滤 3. 管理扩展 4. 个性化新标签页 5. 使用网页截图 6. 清理浏览器缓存 7. 管理启动设置 8. 自定义地址栏建议 9. 使用内置笔…...

【视频】onvif、RTP、RTCP、SDP、RTSP、gb21818区别

ONVIF (Open Network Video Interface Forum): ONVIF是一个全球性的开放网络视频接口论坛&#xff0c;致力于发展基于IP网络的物联网设备的标准化。它提供了一个通用的标准接口&#xff0c;使不同厂商生产的网络视频产品能够互相兼容。 RTP (Real-time Transport Protocol): R…...

8-4 循环神经网络

对于 (8.4.2)中的函数 f f f&#xff0c;隐变量模型不是近似值。 毕竟 h t h_{t} ht​是可以仅仅存储到目前为止观察到的所有数据&#xff0c; 然而这样的操作可能会使计算和存储的代价都变得昂贵。 回想一下&#xff0c;我们在前面讨论过的具有隐藏单元的隐藏层。 值得注意的…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...