C++学习(day5)

news2024/9/20 16:58:57

文章目录

  • 一. 静态成员变量和函数(static)
    • 1. 静态成员变量
    • 2. 静态成员函数
  • 二. 类的继承(inhert)
    • 1. 继承
    • 2. 继承的作用
    • 3. 一个类B继承类A
    • 4. 继承格式
    • 5. 子类会继承父类的所有成员
    • 6. 当父子类中出现同名的成员时
    • 7. **继承中构造函数和析构函数调用顺序**
    • 8. **子类继承父类的步骤**
  • 三. 继承中特殊的成员函数
    • 1. 构造函数
    • 2. 析构函数
    • 3. **拷贝构造函数**
    • 4. **拷贝赋值函数**
  • 四. 多重继承
    • 多重继承会产生的问题:
  • 五. 虚继承
    • 1. 菱形继承(钻石继承)
    • 2. 虚继承格式

一. 静态成员变量和函数(static)

1. 静态成员变量

定义:

  • 由static修饰的成员变量,称为静态成员变量

格式:

  • static 成员变量 如: static int a;

权限:

  • 静态成员一般权限为public

注意:

  1. 静态成员不占用类的大小,独立于类体而存在,编译时在静态区分配空间

  2. 静态成员独立于类对象而存在,即使没有实例化对象,也能使用该静态成员,类名加作用域限定符

  3. 静态成员由所有类对象共享,一个类对象对其进行改变,所有类对象的该属性都改变

  4. 静态成员功能上类似于全局变量,但是,静态成员比全局变量更能体现类的封装性。

  5. 静态成员即使在内存上独立,但是也还是属于类中成员,其他类对象不能直接使用该属性

  6. 静态成员变量需要在全局处进行声明,声明时可以给定初始值,也可以不给,不给定初始值时,默认为0

2. 静态成员函数

定义:

  • 静态成员函数不隶属于某个类对象而独立存在,功能上类似于全局函数

格式:

  • static 函数名 如: static void test();

调用方式:

  • 类对象调用
  • 类名调用

注意事项:

  1. 静态成员函数中,只能使用静态成员变量,不能使用非静态成员变量

  2. 静态成员函数中,没有this指针,因为静态成员函数不依附于类对象,而this指针指代的就是类对象

  3. 静态成员函数与同名的非静态成员函数不构成重载关系,因为作用域不同

代码示例:

#include <iostream>

using namespace std;

class Stu
{
private:
    string name; // 字节长度 32
    int age;     // 字节长度 4

public:
    static double flag; // 共享数据,声明一个静态局部变量
    int num = 999;

    Stu() {}                                  // 无参构造
    Stu(string n, int a) : name(n), age(a) {} // 有参构造

    void show()
    {
        cout << "name = " << name << "  age = " << age << "  flag = " << flag << endl;
    }

    // static void show()           //静态成员函数和同名的非静态成员函数不构成重载关系,因为作用域不同
    static void display() // 静态成员函数
    {
        // cout<<"name = "<<name<<"  age = "<<age<<endl;    //在静态成员函数中,不能使用非静态成员变量
        cout << "flag = " << flag << endl; // 可以使用静态成员变量
    }
};

double Stu::flag = 520; // 在类外进行定义,并给定初始值,如果不给初始值,默认为0

int main()
{

    // cout<<"Stu :: num = "<<Stu::num<<endl;           //非静态成员变量,只能通过类对象调用
    cout << "Stu :: flag = " << Stu::flag << endl; // 静态成员变量,可以直接使用类名调用,无需实例化对象
    Stu::flag = 666;
    cout << "&Stu::flag = " << &Stu::flag << endl;

    Stu s1("zhangpp", 18);
    s1.show(); // 520

    Stu s2("lisi", 20);
    s2.show(); // 520

    cout << "&s1.flag = " << &s1.flag << endl;
    cout << "&s2.flag = " << &s2.flag << endl;

    s2.flag = 1314; // 其中一个类对象对其进行修改
    s2.show();      // 1314
    s1.show();      // 1314

    cout << sizeof(Stu) << endl; // 40,如果占类的内存,则应该是48

    // 通过类对象调用静态成员函数
    s1.display();
    // 通过类型进行调用
    // Stu::show();          //非静态成员函数只能通过类对象调用
    Stu::display(); // 静态成员函数可以通过类对象直接调用

    return 0;
}

二. 类的继承(inhert)

面对对象的三大特性

  • 封装
  • 继承
  • 多态

1. 继承

所谓继承,就是基于一个已有的类去定义一个新类的过程

2. 继承的作用

  1. 能够大大提高代码的复用性,父类有的属性和行为,在子类中无需再次定义,直接使用即可

  2. 继承是多态的必要条件,没有继承,就没有多态

3. 一个类B继承类A

  • 此时我们称A类为父类、基类

  • B类称为子类、派生类

4. 继承格式

class B:继承方式 A
{
    //子类拓展成员
};

继承方式:

父类:public|protected|private|不能访问public|protected|private|不能访问public|protected|private|不能访问
继承方式publicprotectedprivate
子类:public|protected|不能访问|不能访问protected|protected|不能访问|不能访问private|private|不能访问|不能访问

注意:

  1. 继承方式其实就是子类继承父类中访问权限的最高权限
  2. 默认继承方式是私有继承,常用的继承方式是public
#include <iostream>

using namespace std;

class Person
{
public:
    string name; // 32

protected:
    int pwd; // 银行卡密码   4

private:
    int money; // 私房钱   4

public:
    Person() { cout << "Person::无参构造" << endl; }
    Person(string n, int p, int m) : name(n), pwd(p), money(m) { cout << "Person::有参构造" << endl; }

    void show()
    {
        cout << "Person::name = " << name << endl;   // 自己的公有成员,类内可以被访问
        cout << "Person::pwd = " << pwd << endl;     // 自己的受保护成员,类内可以被访问
        cout << "Person::money = " << money << endl; // 自己的私有成员,类内可以被访问
    }
};

// 定义一个学生类,继承自Person类
class Stu : public Person
// class Stu : Person            //如果不加继承方式,默认为私有继承
{
public:
    int num; // 学号   4

private:
    double score; // 成绩  8

public:
    Stu() {}
    Stu(int n, double s) : num(n), score(s) {}
    ~Stu() {}

    void display()
    {
        cout << "Stu::name = " << name << endl; // 继承自父类的公共权限下成员,子类中也是公共的,类内能被访问
        cout << "Stu::pwd = " << pwd << endl;   // 继承自父类的受保护权限下成员,子类中也是受保护的,类内能被访问
        // cout<<"Stu::money = "<<money<<endl;   //继承自父类的私有权限下成员,子类中是不可访问的
        cout << "Stu::num = " << num << endl;     // 自己类中的公有成员,类内能被访问
        cout << "Stu::score = " << score << endl; // 自己类中的私有成员,类内能被访问
    }
};

int main()
{
    cout << sizeof(Stu) << endl; // 子类继承的父类中所有的成员,包括私有成员

    Stu s;                                    // 调用子类的无参构造
    cout << "Stu::name = " << s.name << endl; // 继承自父类的公共权限下成员,子类中也是公共的,类外能被访问
    // cout<<"Stu::pwd = "<<s.pwd<<endl;         //继承自父类的受保护权限下成员,子类中也是受保护的,类外不能被访问
    // cout<<"Stu::money = "<<s.money<<endl;   //继承自父类的私有权限下成员,子类中是不可访问的,类外也不能被访问
    cout << "Stu::num = " << s.num << endl; // 自己类中的公有成员,类内能被访问,类外也能被访问
    // cout<<"Stu::score = "<<s.score<<endl;        //自己类中的私有成员,类内能被访问,类外不能被访问

    return 0;
}

5. 子类会继承父类的所有成员

  1. 子类会继承父类中的所有成员,包括私有成员

  2. 想要对子类从父类中继承下来那部分成员的空间申请以及初始化,必须在子类的构造函数的初始化列表中显性调用父类的有参构造来完成。

  3. 如果没有在子类的初始化列表中显性调用父类的有参构造,则系统会自动调用父类的无参构造,来完成对继承下来的成员的空间申请以及初始化

  4. 如果父类中只有有参构造,没有显性定义无参构造,则第3条会报错

  5. 在实例化子类的过程中,虽然会调用父类的构造函数,但是,仅仅是使用父类构造函数完成对子类中从父类继承下来成员的构造,并没有实例化父类对象,所有,最终实例化的类对象只有子类一个

  6. 所谓继承关系(is a),其本质是一个包含关系(has a)

image-20230423165942124

#include <iostream>

using namespace std;

class Person
{
public:
    string name; // 32

protected:
    int pwd; // 银行卡密码   4

private:
    int money; // 私房钱   4

public:
    Person() { cout << "Person::无参构造" << endl; }
    Person(string n, int p, int m) : name(n), pwd(p), money(m) { cout << "Person::有参构造" << endl; }

    void show()
    {
        cout << "Person::name = " << name << endl;   // 自己的公有成员,类内可以被访问
        cout << "Person::pwd = " << pwd << endl;     // 自己的受保护成员,类内可以被访问
        cout << "Person::money = " << money << endl; // 自己的私有成员,类内可以被访问
    }
};

// 定义一个学生类,继承自Person类
class Stu : public Person
// class Stu : Person            //如果不加继承方式,默认为私有继承
{
public:
    int num; // 学号   4

private:
    double score; // 成绩  8

public:
    Stu() : Person("张三", 123456, 10000000) // 显性调用了父类的无参构造
    {
        cout << "Stu::无参构造" << endl;
    }

    Stu(int n, double s, string n1, int p1, int m1) : Person(n1, p1, m1), num(n), score(s)
    {
        cout << "Stu::有参构造" << endl;
    }

    ~Stu() {}

    void display()
    {
        cout << "Stu::name = " << name << endl; // 继承自父类的公共权限下成员,子类中也是公共的,类内能被访问
        cout << "Stu::pwd = " << pwd << endl;   // 继承自父类的受保护权限下成员,子类中也是受保护的,类内能被访问
        // cout<<"Stu::money = "<<money<<endl;   //继承自父类的私有权限下成员,子类中是不可访问的
        cout << "Stu::num = " << num << endl;     // 自己类中的公有成员,类内能被访问
        cout << "Stu::score = " << score << endl; // 自己类中的私有成员,类内能被访问
    }
};

int main()
{
    //    Stu s1;

    //    s1.display();

    Stu s2(1001, 99, "lisi", 8888888, 666666);
    // s2.display();

    return 0;
}

6. 当父子类中出现同名的成员时

  1. 不会报错,此时子类中会重复出现两个该成员

  2. 如果直接在子类中,或者使用子类对象进行直接使用,那么使用的是子类自己定义的该成员

  3. 如果非要使用父类继承下来的该成员,则需要在成员名前加父类名和作用域限定符

7. 继承中构造函数和析构函数调用顺序

构造时:先构造父类,再构造子类

析构时:先析构子类,再析构父类

8. 子类继承父类的步骤

  1. 全盘吸收父类中中的所有成员

  2. 改造父类中的成员,可以使用继承方式对父类的相关权限改造

    也可以使用using关键字改变父类的相关权限

    using 父类::成员名;

  3. 拓展新成员

三. 继承中特殊的成员函数

1. 构造函数

构造函数不会被继承,父子类中有自己的构造函数

  1. 需要在子类的构造函数的初始化列表中,显性调用父类的构造函数,来完成对子类中从父类继承下来成员的空间申请以及初始化工作

  2. 如果没有显性调用父类的有参构造,则系统会自动调用父类的无参构造,,来完成对子类中从父类继承下来成员的空间申请以及初始化工作

  3. 先构造父类,再构造子类

2. 析构函数

析构函数不会被重载,父子类中有自己的析构函数

  1. 无需在子类的析构函数中,显性调用父类的析构函数,系统会在析构子类的同时,自动调用父类的析构函数,完成对子类从父类中继承下来成员的内存回收工作

  2. 先析构子类,在析构父类

  3. 对于指针成员,父类中的指针由父类的析构函数完成内存释放,子类中的指针有子类的析构函数完成内存释放。

3. 拷贝构造函数

拷贝构造函数不会被继承,父子类中有自己的拷贝构造函数

  1. 需要在拷贝构造函数的初始化列表中,显性调用父类的拷贝构造函数,来完成对子类中从父类继承下来成员的空间申请以及初始化工作

  2. 如果没有在子类的拷贝构造函数中显性调用父类的拷贝构造函数,则系统会自动调用父类的无参构造

  3. 拷贝构造函数涉及深浅拷贝问题

4. 拷贝赋值函数

拷贝赋值函数不会被继承,父子类中有自己的拷贝赋值函数

  1. 需要在拷贝赋值函数的函数体内,显性调用父类的拷贝赋值函数,来完成对子类从父类中继承成员的赋值

  2. 如果没有在拷贝赋值函数函数体内,显性调用父类的拷贝赋值函数,则对父类继承下来的成员,保持原值不变

  3. 拷贝赋值函数涉及深浅拷贝问题

#include <iostream>

using namespace std;

class Person
{
public:
    string name; // 32

protected:
    int pwd; // 银行卡密码   4

private:
    int money; // 私房钱   4

public:
    Person() { cout << "Person::无参构造" << endl; }
    Person(string n, int p, int m) : name(n), pwd(p), money(m) { cout << "Person::有参构造" << endl; }
    ~Person() { cout << "Person::析构函数" << endl; }

    void show()
    {
        cout << "Person::name = " << name << endl;   // 自己的公有成员,类内可以被访问
        cout << "Person::pwd = " << pwd << endl;     // 自己的受保护成员,类内可以被访问
        cout << "Person::money = " << money << endl; // 自己的私有成员,类内可以被访问
    }

    // 定义person拷贝构造函数
    Person(const Person &other) : name(other.name), pwd(other.pwd), money(other.money)
    {
        cout << "Person::拷贝构造函数" << endl;
    }

    // 定义person的拷贝赋值函数
    Person &operator=(const Person &other)
    {
        if (this != &other)
        {
            this->name = other.name;
            this->pwd = other.pwd;
            this->money = other.money;
        }
        cout << "Person::拷贝赋值函数" << endl;

        return *this;
    }
};

// 定义一个学生类,继承自Person类
class Stu : public Person
// class Stu : Person            //如果不加继承方式,默认为私有继承
{
public:
    int num; // 学号   4
    // using Person::pwd;              //改造父类中继承下来成员的权限
    // using Person::money;           //对父类中继承下来的私有权限不能修改

private:
    double score; // 成绩  8

    // using Person::name;

public:
    Stu() : Person("张三", 123456, 10000000) // 显性调用了父类的无参构造
    {
        cout << "Stu::无参构造" << endl;
    }

    Stu(int n, double s, string n1, int p1, int m1) : Person(n1, p1, m1), num(n), score(s)
    {
        cout << "Stu::有参构造" << endl;
    }

    ~Stu() { cout << "Stu::析构函数" << endl; } // 析构函数

    // 定义子类的拷贝构造函数
    // 父类的引用可以指向子类的对象
    Stu(const Stu &other) : Person(other), num(other.num), score(other.score)
    {
        cout << "Stu::拷贝构造函数" << endl;
    }

    // 定义子类的拷贝赋值函数
    Stu &operator=(const Stu &other)
    {
        if (this != &other)
        {
            this->num = other.num;
            this->score = other.score;

            // 显性调用父类的拷贝赋值函数
            //*(Person::this) = other;   //Person::operator=(other);
            Person::operator=(other);
        }
        cout << "Stu::拷贝赋值函数" << endl;

        return *this;
    }

    void show()
    {
        this->Person::show(); // 在子类中调用父类继承下来的同名函数

        cout << "Stu::name = " << Person::name << endl; // 继承自父类的公共权限下成员,子类中也是公共的,类内能被访问
        cout << "Stu::pwd = " << pwd << endl;           // 继承自父类的受保护权限下成员,子类中也是受保护的,类内能被访问
        // cout<<"Stu::money = "<<money<<endl;   //继承自父类的私有权限下成员,子类中是不可访问的
        cout << "Stu::num = " << num << endl;     // 自己类中的公有成员,类内能被访问
        cout << "Stu::score = " << score << endl; // 自己类中的私有成员,类内能被访问
    }
};

int main()
{

    //    s1.display();

    Stu s2(1001, 99, "lisi", 8888888, 666666);
    // s2.Person::show();                   //此时调用子类从父类中继承下来的show函数
    // s2.show();                            //此时调用的是子类自己拓展的show函数

    // cout<<"s2.pwd = "<<s2.pwd<<endl;
    Stu s1(s2); // 调用拷贝构造

    Stu s3; // 无参构造

    s3 = s2; // 调用拷贝赋值函数

    s3.show();

    return 0;
}

四. 多重继承

一个子类,可以由多个父类共同派生出来,该子类拥有所有父类的特征。

定义格式:

class 子类: 继承方式1 父类1, 继承方式2 父类2,。。。,继承方式n 父类n
{
    //子类拓展成员
}

多重继承会产生的问题:

  1. 多个父类中出现同名的成员,在子类中会产生歧义,此时访问时需要加上父类名和作用域限定符

  2. 需要在子类的构造函数初始化列表中,显性调用多个父类的构造函数,完成对数据的初始化

  3. 父类的构造函数调用顺序,跟继承顺序有关,跟调用顺序无关

#include <iostream>

using namespace std;

class A
{
protected:
    int value_a;
    int num;

public:
    A() { cout << "A::无参构造" << endl; }
    A(int a, int n) : value_a(a), num(n) { cout << "A::有参构造" << endl; }
};

class B
{
protected:
    int value_b;
    int num;

public:
    B() { cout << "B::无参构造" << endl; }
    B(int b, int n) : value_b(b), num(n) { cout << "B::有参构造" << endl; }
};

// 定义一个C类,公共继承者A类和B类
// 调用父类的构造函数顺序,跟继承顺序有关
class C : public B, public A
{
private:
    string name;

public:
    C() {}
    // 调用父类的构造函数的顺序,跟是否先调用构造函数无关
    C(int n1, int v1, int n2, int v2, string n) : B(n2, v2), A(n1, v1), name(n)
    {
        cout << "C::有参构造" << endl;
    }

    void show()
    {
        cout << "value_a = " << value_a << endl;
        cout << "value_b = " << value_b << endl;
        cout << "name = " << name << endl;

        cout << "num = " << A::num << endl; // 此时输出的是从A类继承下来的num
        cout << "num = " << B::num << endl; // 此时输出的是从B类继承下来的num
    }
};

int main()
{
    cout << sizeof(C) << endl;

    C c(1, 2, 3, 4, "zahngpp");
    return 0;
}

五. 虚继承

1. 菱形继承(钻石继承)

2020030312021513.png

该继承就成为菱形继承

对于公共基类(A),的成员,会根据不同路径传递给汇聚子类,那么,此时汇聚子类中,就会保留多份公共基类传下来的数据 访问起来会有歧义,而且也没必要保留那么多数据,造成汇聚子类内存爆炸

2. 虚继承格式

  1. 虚继承是解决菱形继承问题,保证汇聚子类中只保留一份公共基类传下来的数据

  2. 在生成中间子类时,在继承方式前加关键字 virtual即可

  3. 在构造子类时,原本只需调用直接父类的构造函数即可完成对继承下来成员的初始化,但是,在虚继承情况下,由于公共基类的数据只串一份数据给汇聚子类,不确定通过哪一条路径传递,索性直接由公共基类直接对其进行构造

  4. 要求在汇聚子类的初始化列表中,显性调用公共基类的构造函数,完成对从公共基类继承下来成员的空间开辟和初始化工作

#include <iostream>

using namespace std;

class A //------>公共基类
{
protected:
    int aa;

public:
    A() { cout << "A::无参构造" << endl; }
    A(int a) : aa(a) { cout << "A::有参构造" << endl; }
};

// 由公共基类生成中间子类
class B : virtual public A
{
protected:
    int bb;

public:
    B() { cout << "B::无参构造" << endl; }
    B(int a, int b) : A(a), bb(b) { cout << "B::有参构造" << endl; }
};

class C : virtual public A
{
protected:
    int cc;

public:
    C() { cout << "C::无参构造" << endl; }
    C(int a, int c) : A(a), cc(c) { cout << "C::有参构造" << endl; }
};

// 由两个中间子类生成汇聚子类
class D : public B, public C
{
private:
    int dd;

public:
    D() { cout << "D::无参构造" << endl; }
    D(int a1, int a2, int b, int c, int d) : A(a1), B(a1, b), C(a2, c), dd(d) { cout << "D::无参构造" << endl; }

    void show()
    {
        cout << "bb = " << bb << endl;
        cout << "cc = " << cc << endl;
        cout << "dd = " << dd << endl;
        // cout<<"aa = "<<B::aa<<endl;        //从A->B->D传下来的aa变量
        // cout<<"aa = "<<C::aa<<endl;        //从A->C->D传下来的aa变量
        cout << "aa = " << aa << endl; // 由于是虚继承,汇聚子类中只保留一份公共基类的数据
    }
};

int main()
{
    cout << sizeof(D) << endl; // 20

    D t(1, 2, 3, 4, 5); // 调用有参构造

    t.show();

    return 0;
}

D : public B, public C
{
private:
int dd;

public:
D() { cout << “D::无参构造” << endl; }
D(int a1, int a2, int b, int c, int d) : A(a1), B(a1, b), C(a2, c), dd(d) { cout << “D::无参构造” << endl; }

void show()
{
    cout << "bb = " << bb << endl;
    cout << "cc = " << cc << endl;
    cout << "dd = " << dd << endl;
    // cout<<"aa = "<<B::aa<<endl;        //从A->B->D传下来的aa变量
    // cout<<"aa = "<<C::aa<<endl;        //从A->C->D传下来的aa变量
    cout << "aa = " << aa << endl; // 由于是虚继承,汇聚子类中只保留一份公共基类的数据
}

};

int main()
{
cout << sizeof(D) << endl; // 20

D t(1, 2, 3, 4, 5); // 调用有参构造

t.show();

return 0;

}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

反垃圾邮件产品测试评价方法示意图

声明 本文是学习信息安全技术 反垃圾邮件产品技术要求和测试评价方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 反垃圾邮件产品测试评价方法 测试环境 反垃圾邮件产品的典型测试环境如图1所示。 图1 反垃圾邮件产品典型测试环境示意图 测试设…

快速识别 SLI 指标的方法:VALET

SLI&#xff0c;Service Level Indicator&#xff0c;服务等级指标&#xff0c;其实就是我们选择哪些指标来衡量我们的稳定性。而 SLO&#xff0c;Service Level Objective&#xff0c;服务等级目标&#xff0c;指的就是我们设定的稳定性目标&#xff0c;比如“几个 9”这样的目…

Android音视频开发-OpenGL ES正交投影实现方法

本文实例为大家分享了OpenGL ES正交投影展示的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 绘制正方形 在最开始绘制的六边形里面好像看起来挺容易的&#xff0c;也没有出现什么问题&#xff0c;接下来不妨忘记前面绘制六边形的代码&#xff0c;让我们按照自己的…

设计模式——组件协作模式之模板方法模式

文章目录 前言一、“组件协作” 模式二、模板方法模式1、动机2、源码分析讲解①、结构化软件设计②、面向对象软件设计 三、模板方法模式定义四、结构要点总结 前言 一、“组件协作” 模式 现代软件专业分工之后的第一个结果是 “框架与应用程序的划分”&#xff0c;“组件协作…

部署LVS-NAT群集实验

一、 实验准备 负载调度器&#xff1a;内网关 ens33&#xff1a;192.168.109.12&#xff0c;外网关 ens37&#xff1a;12.0.0.1外网 Web节点服务器1&#xff1a;192.168.109.13 Web节点服务器2&#xff1a;192.168.109.14 NFS服务器&#xff1a;192.168.109.11 客户端&#xf…

C#基础学习--其他主题

目录 概述 字符串 使用StringBuilder类 把字符串解析为数据值 关于可空类型的更多内容 为可空类型赋值 使用空接合运算符 Main方法 文档注释 嵌套类型 析构函数和dispose模式 概述 再本章中会讲解一些重要的杂项知识 字符串 字符串是Unicode字符串数组 字符串是不可…

ISO-27145故障诊断说明

ISO-27145故障诊断说明 2.1 27145目录说明 ISO27145-1: 这里边介绍的是一般信息和用例定义&#xff1b; ISO27145-2: 这里边介绍的是与排放相关的通用数据规则&#xff0c;用于查询&#xff1b; ISO27145-3: 这里边主要介绍了支持的服务 12服务 14服务 19服务 22服务 31服务&…

【移动端网页布局】移动端网页布局基础概念 ⑧ ( 移动端页面布局方案 | 单独制作的移动端页面 - 主流 | 响应式页面兼容移动端 - 开发难度较大 )

文章目录 一、移动端页面布局方案1、单独制作的移动端页面2、响应式页面兼容移动端 一、移动端页面布局方案 移动端页面方案 : 单独制作的移动端页面 : 主流开发方案 , PC 端 与 移动端 访问的是不同的页面 , 目前的 京东 / 淘宝 等电商网站移动端页面采取的该方案 ;响应式页面…

高效编程----VSCode+ChatGPT插件

VSCode中使用ChatGPT插件 首先在VSCode中打开扩展面板&#xff0c;搜索ChatGPT&#xff0c;安装蓝色圈出插件&#xff0c;如图所示&#xff1a; 安装完成后&#xff0c;需要重启VSCode 注册账号&#xff0c;如图所示&#xff1a; 然后在ChatGPT对话框中输入信息即可使用&#…

[oeasy]python0137_相加运算_python之禅_import_this_显式转化

变量类型 相加运算 回忆上次内容 上次讲了是从键盘输入变量input 函数 可以有提示字符串需要有具体的变量接收输入的字符串 输入单个变量没有问题 但是输入两个变量之后一相加就非常离谱 怎么办呢&#xff1f;&#x1f914; 基本实验 回到 游乐场 做个 实验 两个整数 相加…

C++STL——map与set的模拟实现

map与set的模拟实现 map与set的部分源码参考改造红黑树红黑树的迭代器补全set与map的实现完整代码 map与set的部分源码参考 map和set的底层都是由红黑树实现的。 所以这里将上次实现的红黑树插入拿来用。 首先想一想&#xff0c;搜索二叉树不能修改值&#xff0c;因为会破坏整…

第十章 装饰者模式

文章目录 前言一、装饰者模式定义装饰者模式 UML图 二、装饰者模式解决星巴克咖啡订单完整代码Drink 抽象 饮料类Coffee 咖啡类继承 Drink 做一个缓冲层Espresso 意大利咖啡 继承 CoffeeLongBlack 咖啡ShortBlack 咖啡装饰者&#xff0c;调料牛奶巧克力豆浆咖啡店测试程序添加 …

01-yolo算法

要点&#xff1a; 归纳 YOLOv5 github 1 YOLO v1 1) 将一幅图像分成SxS个网格(grid cell)&#xff0c;如果某个object的中心 落在这个网格中&#xff0c;则这个网格就负责预测这个object。 2)每个网格要预测B个bounding box&#xff0c;每个bounding box 除了要预测位置之…

TortoiseSVN使用-合并分支代码

文章目录 3.4.12 合并分支代码TortoiseSVN有2种合并方式演示场景1&#xff1a;&#xff08;合并一个版本范围 Merge a range of revisions&#xff09;演示场景2&#xff1a;&#xff08;合并两个不同的树 Merge two different trees&#xff09;&#xff0c;不设置主分支版本演…

初窥Edubuntu 23.04:装有教育软件的Ubuntu桌面

导读4月20日&#xff0c;Edubuntu将作为Ubuntu官方口味卷土重来&#xff0c;作为即将发布的Ubuntu 23.04&#xff08;Lunar Lobster&#xff09;的一部分&#xff0c;所以我认为让你们先看看这个重制版中包含的内容是个好主意。 Edubuntu以前被称为Ubuntu教育版&#xff0c;最…

Anaconda安装及tensorflow安装

1.下载Anaconda安装包&#xff0c;并安装好 官网下载网址&#xff1a;https://www.anaconda.com/download/ 清华映像站&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 注意&#xff1a;注意安装anaconda时一定要把环境变量加入windows环境中。若没有…

C语言---函数介绍详解

生活的全部意义在于无穷地探索尚未知道的东西,在于不断地增加更多的知识——左拉 文章目录 前言函数模块化程序设计方法函数的定义函数的分类函数定义角度库函数自定义函数 函数形式角度无参函数有参函数 函数兼有其他语言中的函数和过程两种功能的角度有返回值函数无返回值函…

ENVI 国产高分2号(GF-2)卫星数据辐射定标 大气校正 影像融合

1.数据 高分2号卫星数据&#xff0c;包含&#xff1a; MSS-1\2多光谱数据&#xff0c;4m分辨率&#xff1b; Pan-1\2全色波段数据&#xff0c;0.8m分辨率。 2.处理软件 ENVI5.3 国产插件下载地址&#xff1a;ENVI App Store (geoscene.cn) 首先下载插件文件&#xff1b; …

Spring的事务传播行为

事务传播行为 多个声明的事务的方法在相互调用的时候&#xff0c;这个是事务应该如何去传递。 比如说methodA()调用methodB(), 那么这两个方法都显示了开启了事务&#xff0c;那么methodB()是开启一个新的事务还是继续在methodA()这个事务里面去执行就取决于所谓的事务传播的…

多兴趣推荐召回模型:ComiRec

前言 多兴趣向量召回系列&#xff1a; 通过Youtube DNN推荐模型来理解推荐流程 多兴趣召回模型&#xff1a;MIND 推荐系统可以表达为序列推荐问题的形式&#xff0c;序列推荐任务是通过用户的历史行为来预测用户下一个感兴趣的item&#xff0c;这也与真实场景的推荐场景是符…