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

asp.netmvc 做网站/seo公司优化排名

asp.netmvc 做网站,seo公司优化排名,网站的站外优化,北京旧房改造装修哪家好凡是面向对象的语言,都有三大特性,继承,封装和多态,但并不是只有这三个特性,是因为者三个特性是最重要的特性,那今天我们一起来看多态! 目录 1.多态的概念 1.1虚函数 1.2虚函数的重写 1.3虚…

         凡是面向对象的语言,都有三大特性,继承,封装和多态,但并不是只有这三个特性,是因为者三个特性是最重要的特性,那今天我们一起来看多态!


目录

1.多态的概念

1.1虚函数

1.2虚函数的重写

1.3虚函数重写的两个例外

1.子类的虚函数可以不加virtual

2. 协变(基类与派生类虚函数返回值类型不同)

1.4如何实现一个不能被继承的类

2. 多态的定义及实现

2.1多态调用

2.2普通调用:

2.3析构函数建议加virtual吗? 

2.4抽象类

2.5接口继承和实现继承

3.多态的实现原理

3.1.虚表(虚函数表)

3.2多态的实现

3.3静态多态和动态多态

3.4单继承的多态实现

3.5多继承的多态实现

4.一些常考的多态的问题

总结:


1.多态的概念

多态,就是不同对象去完成某一种行为时,产生的不同状态。

举例说明:日常生活中,我们去买票,尤其买火车票时,总会有不同的结果。当成人买的时候,就是原价,学生就是半价,军人就是优先买票,这都体现了多态。不同对象完成某一行为,产生不同状态。

那实现多态前,我们首先得清楚一些概念:

1.1虚函数

虚函数:即被virtual修饰的类成员函数称为虚函数。
class A
{
public:virtual void func(){cout << "A" << endl;}
};

1.2虚函数的重写

我们之前在继承的时候,学习过重定义(隐藏),现在在多态这一节,又出现了重写,那到底是什么呢?我们来看一看

重定义(隐藏):首先在两个不同的类中(父类,子类)(构成继承),只要函数名相同,就会构成重定义(隐藏)。

重写(覆盖):在重定义的基础上,除了函数名要相同,还有返回值,参数都得相同,这才构成重写。

举个例子:

class A
{
public:virtual void func(){cout << "A" << endl;}
};
class B:public A
{
public:virtual void func()  //重写{cout << "B" << endl;}
};

总结就是:虚函数的重写条件:子类和父类都是虚函数,且函数名,返回值,参数都必须相同(三同),这才能构成虚函数的重写。

1.3虚函数重写的两个例外

1.子类的虚函数可以不加virtual

因为是继承关系,父类的虚函数也被继承下来,所以子类的可以不加virtual。(建议还是都写上)

class A
{
public:virtual void func(){cout << "A" << endl;}
};
class B:public A
{
public:void func(){cout << "B" << endl;}
};

2. 协变(基类与派生类虚函数返回值类型不同)

意思是:三同中,返回值可以不同,但要求返回值必须是父子类关系的指针或引用。(其他父子类关系的指针或者引用也可以)

class person
{
public:virtual person* func()  //本父子类指针或引用{return this;}
};class student:public person
{
public:virtual student* func() //本父子类指针或引用{return this;}
};

其他父子类关系的指针或者引用也可以:

class A
{};
class B:public A
{};class person
{
public:virtual A* func(){return nullptr;}
};class student:public person
{
public:virtual A* func(){return nullptr;}
};

但是父类的返回值不可以为子类的指针。

1.4如何实现一个不能被继承的类

方法一:是需要把它的构造函数写为私有即可,无法构造,就不可能被继承;

方法二:类定义时,加final(c++11),最终类,不能被继承


class A final
{};
class B:public A
{};

若final给虚函数,虚函数则不能被重写

class A
{virtual void func()final{}
};
class B:public A
{virtual void func(){}
};

override是来判断是否已经重写(检查重写)

class A
{virtual void func(int){}
};
class B:public A
{virtual void func()override{}
};

2. 多态的定义及实现

首先多态实现的前提必须是继承!

多态实现的两个条件:

1.必须使用父类(基类)的指针或者引用调用虚函数;

2.被调用的函数必须是虚函数,且子类(派生类)必须对虚函数进行重写;

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了
PersonPerson对象买票全价,Student对象买票半价。

2.1多态调用

class Person
{
public:virtual void Buyticket(){cout << "Person:全价" << endl;}
};class Student:public Person
{
public:virtual void Buyticket(){cout << "Student:半价" << endl;}
};void func(Person& p) //切片
{p.Buyticket();
}int main()
{Person p;Student s;func(p);func(s);
}

2.2普通调用:

不符合多态条件即可:

void func(Person p)//不是指针或者引用,就是对象
{p.Buyticket();
}int main()
{Person p;Student s;func(p);func(s);
}

 

那么我们可以发现:

普通调用跟调用对象的类型有关;

多态调用必须是父类的指针或者引用,无论是是哪个对象传,他都会指向该对象中父类的那一部分(切片),进而调用该对象中的虚函数。一句话,多态调用跟 指针/引用 指向的对象有关

2.3析构函数建议加virtual吗? 

我们看一个例子:

class Person
{
public:~Person(){cout << "Person delete" << endl;delete _p;}
protected:int* _p = new int[10];
};class Student :public Person
{
public:~Student(){cout << "Student delete" << endl;delete _s;}
protected:int* _s = new int[20];
};int main()
{//Person p;//Student s;Person* ptr1 = new Person;Person* ptr2 = new Student;delete ptr1;delete ptr2;
}

我们都知道,析构函数自动调用,在继承中,子类会先析构,调用子类的析构函数以后,自动再调用父类的析构函数。

但这用情况还适用吗?

先看一下结果:

我们发现,居然调用了两次父类的析构函数 !!!

这种情况就会造成子类对象中的成员变量没有释放,导致内存泄露!!

我们知道:

delete有两种行为:1.使用指针调用析构函数;2.operator delete(ptr)

所以使用指针调用析构函数是普通调用(不满足多态调用的条件),普通调用是跟调用的对象类型有关,类型都是Person,所以只会调用person的析构函数

但此时我们更希望的是多态调用,所以建议加virtual,指针指向的对象是哪个,就调用哪个的析构函数。但此时我们会想,析构函数名字都不一样,这能构成重写吗?当然可以,那是因为编译器会自动把父类子类的析构函数名字换成一样的:ptr->destructor()。

那么就可以实现我们预期的效果:

所以我们建议:再写析构函数时,可以无脑给父类的析构函数加virtual,防止出现上面的情况,导致内存泄露 。

普通调用时,时普通调用;父类的指针或者引用调用时,时多态调用,互不影响! 

2.4抽象类

在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口
类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生
类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。
class Car
{
public:virtual void Drive() = 0;
};class BMW :public Car
{
public:virtual void Drive(){cout << "BMW-操控" << endl;}
};
void Test()
{Car* pBMW = new BMW;pBMW->Drive();
}int main()
{Test();
}

总结:有些类不需要类的对象,可以在写成纯虚函数。

2.5接口继承和实现继承

接口继承针对虚函数;实现继承针对普通函数。

普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实
现。
虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成
多态,继承的是接口。
学了这么多,来做一道题温习一下:(很坑)

class A
{
public:virtual void func(int val = 1){ std::cout << "A->" << val << std::endl; }virtual void test(){ func(); }
};class B : public A
{
public:void func(int val = 0){ std::cout << "B->" << val << std::endl; 
};int main(int argc, char* argv[])
{B*p = new B;p->test();  return 0;
}A: A->0    B: B->1    C: A->1    D: B->0    E: 编译出错      F: 以上都不正确若是ptr->func(),就是B类对象直接调用,就是普通调用,普通调用跟对象类型有关。
普通调用在编译时就会静态绑定,在编译时调用的函数以及函数的默认值就已经确定,子类调用子类自己的函数,跟父类没有任何关系,函数都是子类编译时就已经静态绑定的,所以缺省值依然是0。最终结果是B->0

答案选哪个??

首先我们了解的第一点是,继承父类的成员,会原封不动的继承到子类;

我们接下来看:创建了一个B对象的指针,指针来调用p->test(),这时候,会直接调用父类中的test,再this->func(),此时的this的类型是A*,因为test处于A类中,继承到B中,也会原封不动的继承过去,this依然是A*,所以父类的指针调用虚函数,满足多态的调用,多态调用是看指针指向的对象,又因为p调用的test,所以指针指向B对象,所以会调用B的重写的func虚函数,所以最终答案是B->1.(其实多态调用一直是调的父类的接口,再根据指向的对象去调用具体的实现,后面会详细讲到)

当B对象自己调用函数func时,当不是多态调用时,就会直接调用自己的func(),缺省值还是自己的val=0.


3.多态的实现原理

3.1.虚表(虚函数表)

来先看一道题:

class Base1
{
public:virtual void Func1(){cout << "Func1()" << endl;}};class Base2
{
public:virtual void Func1(){cout << "Func1()" << endl;}
private:int _b = 1;
};
sizeof(Base1),sizeof(Base2),它所占的字节数是多少?

通过之前学习的内容,我们可以了解到,如果类中没有成员变量,只有成员函数,会留一个字节进行占位,因为成员函数在代码段,所以Base1的大小是1吗?

原来不是我们想象的那样子,是事实上,来看:

凡是有虚函数的,都会有一个虚函数表指针来存虚函数,简称虚表指针,存虚函数的表叫做虚函数表,简称虚表。

VFptr(全程vftable)是一个指针, 指向虚表,虚表中存的是虚函数的地址。

所以我们知道,原来只要有虚函数,就会有虚表指针,所以Base1的字节大小是,4字节;

Base2的字节大小是,加上内存对齐,_b占四字节,vtf占四字节,8字节。

对于同一类实例化出的不同的对象,他们的虚表是公用的:

class A
{public:virtual void func(){}
}int main()
{A b;A c;
}

我们了解虚表和虚表指针以后,那么多态到底如何实现呢?

3.2多态的实现

来看一段代码:

class Base
{
public:virtual void Func1(){cout << "Base::Func1()" << endl;}virtual void Func2(){cout << "Base::Func2()" << endl;}void Func3(){cout << "Base::Func3()" << endl;}private:int _b = 1;char _ch;
};class Derive : public Base
{
public:virtual void Func1(){cout << "Derive::Func1()" << endl;}void Func3(){cout << "Derive::Func3()" << endl;}
private:int _d = 2;
};int main()
{Base b;Derive d;//普通调用Base* ptr = &b;ptr->Func3();ptr = &d;ptr->Func3();
//多态调用ptr = &b;ptr->Func1();ptr = &d;ptr->Func1();
}

多态调用:

ptr是父类的指针,无论指向哪个对象都只能看到该对象父类的部分(切片),那么多态调用怎么调用呢?通过虚表指针来调用虚函数,完成重写的虚函数会在虚表对应的位置进行覆盖,变成重写后的虚函数,进而调用。(一句话,我也不知道我调用谁,我指向谁,就调用谁的虚函数,进而完成动态绑定,完成多态调用)

 静态绑定:编译时,通过类型就确定调用函数的地址,然后直接call完成调用

通过反汇编可以看到:

静态绑定,一步完成;动态绑定得很多步完成。 

3.3静态多态和动态多态

1. 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为也称为静态多态
比如:函数重载
2. 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体
行为,调用具体的函数,也称为动态多态

总结:多态调用就是依靠虚表实现,指向谁,就调用谁的虚函数

虚表是存在代码段中的。

3.4单继承的多态实现

class Base {
public:virtual void func1() { cout << "Base::func1" << endl; }virtual void func2() { cout << "Base::func2" << endl; }
private:int a;
};class Derive :public Base {
public:virtual void func1() { cout << "Derive::func1" << endl; }virtual void func3() { cout << "Derive::func3" << endl; }void func4() { cout << "Derive::func4" << endl; }
private:int b;
};int main()
{Base b;Derive d;}

我们知道Base对象中的虚表有func1和func2,子类对虚函数进行重写,func1重写,func2不变:

  

那么子类自己的虚函数func3在不在虚表里面呢?

为了更方便观察,我们可以实现一个打印虚表的函数:

typedef void(*VFTptr)();  //函数指针,重命名必须写到里面
void Print(VFTptr VFT[])  //函数指针数组
{int i = 0;while (VFT[i])  //虚表中,vs默认以空结束。{printf("[%d]%p->", i, VFT[i]);VFT[i]();i++;}cout << endl;
}
int main()
{Base b;Derive d;Print((VFTptr*)(*(int*)&b)); //先取地址,再强转VFTptr的地址,然后解引用取到地址,再强转为VFT*类型,进而传参调用Print((VFTptr*)(*(void**)&d));//换为void**原因是因为,机器若是32位,指针大小就是4字节,若是64位,就是8字节//所以换为void**更普适,先取地址,再强转void**,void*解引用,那么这就根据机器的位数来决定指针的大小了
}

我们可以发现,虚函数func3也会存在虚表中。

 3.5多继承的多态实现

typedef void(*VFTptr)();
void Print(VFTptr VFT[])
{int i = 0;while (VFT[i]){printf("[%d]%p->", i, VFT[i]);VFT[i]();i++;}cout << endl;
}class Base1 {
public:virtual void func1() { cout << "Base1::func1" << endl; }virtual void func2() { cout << "Base1::func2" << endl; }
private:int b1;
};class Base2 {
public:virtual void func1() { cout << "Base2::func1" << endl; }virtual void func2() { cout << "Base2::func2" << endl; }
private:int b2;
};class Derive : public Base1, public Base2 {
public:virtual void func1() { cout << "Derive::func1" << endl; }virtual void func3() { cout << "Derive::func3" << endl; }
private:int d1;
};int main()
{Base1 b1;Base2 b2;Print((VFTptr*)(*(void**)&b1));Print((VFTptr*)(*(void**)&b2));Derive d;Print((VFTptr*)(*(void**)&d));//Base1的虚表Print((VFTptr*)(*(void**)((char*)&d + sizeof(Base1))));//Base2的虚表//Base2* ptr=&d;//Print((VFTptr*)(*(void**)ptr)); //也可以这样找到虚表指针}

 我们知道多继承下多态的实现,子类继承多个父类,只有当父类有虚函数,多继承时才有虚表。

当子类也有虚函数时,这时子类的虚函数放到第一个继承的父类的虚表中,我们可以从上面代码结果看出。


再来练习题目:

下列输出的结果是什么?

class A{
public:A(char *s) { cout << s << endl; }~A(){}
};class B :public A
{
public:B(char *s1, char*s2) :A(s1) { cout << s2 << endl; }
};class C : public A
{
public:C(char *s1, char*s2) :A(s1) { cout << s2 << endl; }
};class D :public C, public B
{
public:D(char *s1, char *s2, char *s3, char *s4) : B(s1, s2), C(s1, s3),A(s1){cout << s4 << endl;}
};int main() {D *p = new D("class A", "class B", "class C", "class D");delete p;return 0;
}
A:class A class B class C class D 
B:class D class B class C class A
C:class D class C class B class A
D:class A class C class B class D

答案是哪个呢?

首先D肯定是最后一个才被初始化的,构造函数先走初始化列表,B,C,A,那肯定是A先被初始化,因为B,C中都有A,A不初始化,B,C没办法初始化;其次要看继承的顺序,D先继承C,再继承B,所以先初始化C,再初始化B.最终答案就是D

第二题:

class Base1 {public:  int _b1;};
class Base2 { public:  int _b2; };
class Derive : public Base2, public Base1 
{ public: int _d; };int main(){Derive d;Base1* p1 = &d;Base2* p2 = &d;Derive* p3 = &d;return 0;
}
A:p1 == p2 == p3              B:p1 > p2 == p3         C:p1 == p3 != p2        D:p1 != p2 != p3

答案选哪个呢?

子类首先继承了Base2,再继承了Base1,所以模型应该是这样的:

所以没有答案,答案应该是:p3==p2<p1. 

所以通过上面这两个例子,我们可以看的出,其实实现继承时,继承的顺序是非常重要的,有关谁先被创建。


4.一些常考的多态的问题

1. 什么是多态?
多态分为静态多态和动态多态;
静态多态是在编译时,自动和所调用的类型所绑定,从而确定函数地址,直接调用
动态多态是在运行时,根据父类指针所指向的对象,指向父类调父类的虚函数,指向子类调子类中父类那部分重写以后的虚函数。
2. 什么是重载、重写(覆盖)、重定义(隐藏)?
重载:同一作用域,只有函数名相同,参数不同的函数
重定义(隐藏):在两个不同的类中(两个不同的作用域),只要函数名相同就构成了重定义
重写:在构成重定义(隐藏)的基础上,函数得是虚函数,且函数名,参数,返回值必须相同
3. 多态的实现原理?
简而言之:虚表的重要性,离不开虚表,和虚函数的重写;指向谁就调用谁
4. inline函数可以是虚函数吗?
可以(语法角度上看),不过编译器就忽略inline属性,这个函数就不再是inline,因为虚函数要放到虚表中去。如果inline函数不是虚函数,就还会有inline这个属性
5. 静态成员可以是虚函数吗?
不能,因为静态成员函数没有this指针,静态成员函数在类没有实例化对象之前就已经分配空间了,不用实例化对象也可以调用,但是对于virtual虚函数,它的调用恰恰使用this指针。在有虚函数的类实例中,this指针调用vptr指针,指向的是vtable(虚函数列表),通过虚函数列表找到需要调用的虚函数的地址。总体来说虚函数的调用关系是:this指针->vptr(4字节)->vtable ->virtual虚函数。所以说,static静态函数没有this指针,也就无法找到虚函数了。所以静态成员函数不能是虚函数。他们的关键区别就是this指针。
6. 构造函数可以是虚函数吗?
不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的,你连虚表指针都没有,还怎么调用构造函数??
7. 析构函数可以是虚函数吗?什么场景下析构函数是虚函数?
可以,并且最好把基类的析构函数定义成虚函数。防止多态调用析构函数时,重复调用一个对象的虚函数,发生内存泄漏。
8. 对象访问普通函数快还是虚函数更快?
我们得分具体情况:
普通调用时:当然是普通函数和虚函数都是一样的;
多态调用时:当然普通函数更快,虚函数的调用会先去找虚表指针,找到虚表,再去调用虚函数
9. 虚函数表是在什么阶段生成的,存在哪的?
虚函数表是在编译阶段就生成的,一般情况下存在代码段(常量区)的。
10. C++菱形继承的问题?虚继承的原理?
注意这里不要把虚函数表和虚基表搞混了:
菱形继承为了避免数据冗余,会用虚基表来解决,虚基表是用来存偏移量,进而通过偏移量来找到虚基类;
虚继承是虚函数的重写,通过虚表指针找到虚表,进而调用虚表中的虚函数
11. 什么是抽象类?抽象类的作用?
抽象类是在虚函数后面写上=0,它强制必须重写子类的虚函数,不写就不可以实例化出对象,另外抽象类体现出了接口继承关系。

总结:

这一节,我们完完整整把多态的全部内容都讲了一遍,当然途中大家肯有会有不懂的地方,因为这是难点,我在编写这边文章的时候,也是反反复复思考和学习,所以大家需要反复思考观看,不懂得可以在评论区回复,或者私信我哦!​​​​​​​

大家加油!!! 

相关文章:

【C++】非常重要的——多态

凡是面向对象的语言&#xff0c;都有三大特性&#xff0c;继承&#xff0c;封装和多态&#xff0c;但并不是只有这三个特性&#xff0c;是因为者三个特性是最重要的特性&#xff0c;那今天我们一起来看多态&#xff01; 目录 1.多态的概念 1.1虚函数 1.2虚函数的重写 1.3虚…...

发票账单很多?python助你批量完成数据提取

每天面对成堆的发票&#xff0c;无论是税务发票还是承兑单据&#xff0c;抑或是其他各类公司数据要从照片、PDF等不同格式的内容中提取&#xff0c;我们都有必要进行快速办公的能力提升。因此&#xff0c;我们的目标要求就十分明显了&#xff0c;首先要从图片中获取数据&#x…...

[闪存2.1] NAND FLASH特性串烧 | 不了解闪存特性,你能用好闪存产品吗?

前言 为了利用好闪存, 发挥闪存的优势, 以达到更好的性能和使用寿命, 那自然要求了解闪存特性。 闪存作为一种相对较新的存储介质, 有很多特别的特性。 一.闪存的特性 凡是采用Flash Memory的存储设备,可以统称为闪存存储。我们经常谈的固态硬盘(SSD),可以由volatile/…...

面试官问我按钮级别权限怎么控制,我说v-if,面试官说再见

最近的面试中有一个面试官问我按钮级别的权限怎么控制&#xff0c;我说直接v-if啊&#xff0c;他说不够好&#xff0c;我说我们项目中按钮级别的权限控制情况不多&#xff0c;所以v-if就够了&#xff0c;他说不够通用&#xff0c;最后他对我的评价是做过很多东西&#xff0c;但…...

阿里云服务器使用教程:CentOS 7安装nginx详细步骤

目录 1、下载nginx压缩包 2、配置nginx安装所需环境 3、解压nginx压缩包 4、编译安装nginx 5、nginx启动...

Android JNI浅析、Java和Native通信对象的传值和回调

简单了解一下jni JNI是一个本地编程接口&#xff0c;它允许运行在Java虚拟机的Java代码与用其他语言&#xff08;如C,C和汇编&#xff09;编写的库交互。 jni函数签名 首先看一下java类型对应的jni类型&#xff1a; Java类型符号BooleanZByteBCharCShortSIntILongJFloatFDo…...

linux目录/usr/lib/systemd/system目录详解

文章目录前言一. systemd介绍二. service 脚本详解2.1 [Unit] 区块2.2 [Service] 区块2.3 [Install] 区块总结前言 init的进化经历了这么几个阶段&#xff1a; CentOS 5: SysV init,串行 CentOS 6&#xff1a;Upstart,并行&#xff0c;借鉴ubuntu CentOS 7&#xff1a;Syste…...

408考研计算机之计算机组成与设计——知识点及其做题经验篇目4:CPU的功能和基本结构

随着考研的慢慢复习&#xff0c;我们逐渐进入了计算机组成与设计的第五章中央处理器。它原名为CPU。姓C&#xff0c;名PU&#xff0c;字中央处理器&#xff0c;号计组难点&#xff0c;乃计算机之中心与核心部件&#xff0c;小编称之曰能算能控&#xff0c;赐名曰九天宏教普济生…...

2022-12-10青少年软件编程(C语言)等级考试试卷(五级)解析

2022-12-10青少年软件编程(C语言)等级考试试卷(五级)解析T1、漫漫回国路 2020年5月,国际航班机票难求。一位在美国华盛顿的中国留学生,因为一些原因必须在本周内回到北京。现在已知各个机场之间的航班情况,求问他回不回得来(不考虑转机次数和机票价格)。 时间限制:10…...

刷题专练之链表(一)

文章目录前言一、 移除链表元素1.题目介绍2.思路3.代码二、反转链表1.题目介绍2.思路3.代码三、链表的中间结点1.题目介绍2.思路3.代码四、链表的中间结点1.题目介绍2.思路3.代码前言 以下是链表经常考的面试题&#xff0c;我在这里进行归纳和讲解&#xff0c;采取的是循序渐进…...

elasticsearch高级查询api

yml配置 #es配置 spring:elasticsearch:rest:uris: 192.168.16.188:9200添加依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>使用编程的形式…...

力扣-股票的资本损益

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1393. 股票的资本损益二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他…...

蓝桥杯刷题冲刺 | 倒计时26天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.路径2.特别数的和3.MP3储存4.求和1.路径 题目 链接&#xff1a; 路径 - 蓝桥云课 (lanqiao.cn…...

嵌入式软件开发之Linux 用户权限管理

目录 Ubuntu 用户系统 权限管理 权限管理命令 权限修改命令 chmod 文件归属者修改命令 chown Ubuntu 用户系统 Ubuntu 是一个多用户系统&#xff0c;我们可以给不同的使用者创建不同的用户账号&#xff0c;每个用户使用各自的账号登陆&#xff0c;使用用户账号的目的一是方便…...

2023-03-15 RabbitMQ

RabbitMQ整合 官网erlang版本 : 20.3.8.x 官方rabbitMq版本&#xff1a; rabbitmq-server-generic-unix-3.7.14.tar.xz 1.安装 1.1 安装erlang 1.安装环境 yum -y install make gcc gcc-c kernel-devel m4 ncurses-devel openssl-devel2.在/usr/local/下创建erlangapp文件…...

二叉树链式结构的实现

文章目录1.二叉树的遍历1.1前序、中序以及后序遍历1.2代码测试1.3层序遍历1.4二叉树遍历习题2.节点个数以及高度2.1二叉树节点个数2.2叶子节点个树2.3第k层节点个数2.4树的高度1.二叉树的遍历 1.1前序、中序以及后序遍历 学习二叉树结构&#xff0c;最简单的方式就是遍历。所…...

蓝桥杯刷题冲刺 | 倒计时28天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.卡片2.数字三角形3.购物单4.回文日期1.卡片 题目 链接&#xff1a; 卡片 - 蓝桥云课 (lanqiao…...

一文带你吃透操作系统

文章目录1. 进程、线程管理2. 内存管理3. 进程调度算法4. 磁盘调度算法5. 页面置换算法6. 网络系统7. 锁8. 操作系统知识点文章字数大约1.9万字&#xff0c;阅读大概需要65分钟&#xff0c;建议收藏后慢慢阅读&#xff01;&#xff01;&#xff01;1. 进程、线程管理 进程和线程…...

计算机网络英文简称汇总

分类名词全拼汉译概述B2CBusiness-to-Consumer商对客概述P2PPeer-to-Peer对等概述C/SClient-Server服务器-客户机概述ITUInternational Telecommunication Union国际电信联盟概述IEEEInstitute of Electrical and Electronics Engineers电气与电子工程师协会概述ICCCInternatio…...

腾讯云云服务器标准型S5性能配置简单测评

腾讯云服务器标准型S5实例CPU采用Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;主频2.5GHz&#xff0c;睿频3.1GHz&#xff0c;标准型S5云服务器基于全新优化虚拟化平台&#xff0c;配有全新的Intel Advanced Vector Extension (AVX-512) 指令集&#…...

RK3568平台开发系列讲解(Linux系统篇)消息队列

🚀返回专栏总目录 文章目录 一、创建消息队列二、发送和接收消息三、内核结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢消息队列在如下两个方面上比管道有所增强: 消息队列中的数据是有边界的,发送端和接收端能以消息为单位进行交流,而不再是无分隔的字节流…...

2021电赛国一智能送药小车(F题)设计报告

2021电赛国一智能送药小车&#xff08;F题&#xff09;设计报告 【写在前面的话】 电赛是一个很奇妙的过程&#xff0c;可能有些人觉得电赛的门槛太高&#xff0c;那便意味着&#xff0c;当你决定要参加电赛的那一刻起&#xff0c;这一段路、这些日子就注定不会太轻松&#xf…...

刚工作3天就被裁了....

前言 还有谁&#xff1f;刚上三天班就被公司公司的工作不适合我&#xff0c;叫我先提升一下。 后面我也向公司那边讨要了一个说法&#xff0c;我只能说他们那边的说辞让我有些不服气。 现在之所以把这件事上记录一下&#xff0c;一是记录一下自己的成长轨迹&#xff0c;二是…...

docker安装elasticsearch与head教程完整版—.NET Core Web Api与elasticsearch打造全站全文搜索引擎

默认已经有docker环境 下载与安装 elasticsearch &#xff0c;从hub.docker里面可以看到最新版本的镜像&#xff0c;选择你想要的版本 本教程是以 7.17.7 为案例&#xff0c;为啥不适用最新的&#xff0c;首先个人一般需用最新的版本&#xff0c;如果有亢很难填&#xff0c;其次…...

蓝桥冲刺31天之315

没有一个冬天不可逾越 也没有一个春天不会来临 所有美好的食物&#xff0c;都会有一个等待的过程 低谷时蛰伏&#xff0c;静默时沉淀 做三四月的事&#xff0c;在八九月自有答案 目录 A&#xff1a;0的个数 题目描述: 输入格式 输出格式 样例输入 样例输出 评测用例规模与…...

常见排序算法

/懂了和写出来是两码事啊啊......orz./ Talk is cheap, show me the code 一、快速排序 直接背模板就能过&#xff1a; 当xq[lr>>1]的边界情况 此时x取的是序列中间靠左的位置(如果序列个数为奇,则取正中间,如果为偶,则取中间靠左),此时如果元素个数为2, 则中间靠左就…...

C语言实现学生成绩管理系统思考

学生成绩管理系统思考 作业要求&#xff1a; 目录 思路 基本函数 学习理解大佬的代码&#xff1a; 完成作业&#xff1a; 思路 学生成绩管理系统&#xff0c;首先要初始化系统&#xff0c; 用C语言做学生实验管理系统要求实现对某班学生3门课程&#xff08;包括语文、数…...

C++11中Lambda新特性

1.定义 lambda匿名函数的语法格式&#xff1a; [外部变量访问方式说明符](参数)mutablenoexcept/throw()->返回值类型 {函数体; };其中各部分的含义分别为&#xff1a; a.[外部变量方位方式说明符] []方括号用于向编译器表明当前是一个lambda表达式&#xff0c;其不能被省略…...

【jvm系列-01】初识虚拟机与java虚拟机

初识虚拟机与java虚拟机一&#xff0c;虚拟机与java虚拟机1&#xff0c;虚拟机2&#xff0c;java虚拟机3&#xff0c;jvm整体结构图4&#xff0c;jvm的架构模型5&#xff0c;jvm的生命周期6&#xff0c;jvm的种类划分6.1&#xff0c;Sun Classic Vm6.2&#xff0c;Exact VM6.3&…...

「Python 基础」数据库应用编程

Python 定义了一套 DB-API&#xff0c;任何数据库要连接到 Python&#xff0c;只需要提供符合 Python 标准的数据库驱动即可&#xff1b; 文章目录1. 连接 SQLite1. 建表、插入数据2. 查询数据2. 连接 MySQL1. 安装驱动2. 演示连接3. SQLAlchemy1. 安装2. DBSession3. add4. qu…...