西安石油大学期末考试C++真题解析

在这里插入图片描述
1、一、类型、返回值类型 二、参数表、函数重载

2、一、实例化 二、实例化的类型或类类是对象的蓝图,对象是类的实例化

3、const

4、一个 两个

5、一、公有继承 二、私有继承、保护继承

6、抽象类、实例化对象

7、函数模板、类模板

8、try、catch、throw

9、流插入运算符、流提取运算符

10、可以、可以

11、析构函数

程序阅读题:

#include <iostream>
int m = 10;
void a(int n) {
n = 15 / n;
m = m / 2;
}
int main() {
int n = 3;
a(n);
std::cout << "m=" << m << std::endl;
std::cout << "n=" << n << std::endl;
return 0;
}

这段代码的功能如下:

  1. 包含了iostream头文件以使用输入输出流。
  2. 定义了一个整型变量m并初始化为10。
  3. 声明了一个函数a,接受一个整型参数n。
  4. 在函数a中,将15除以参数n的值赋给n,然后m除以2的结果赋给m。
  5. 在主函数main中,定义了一个整型变量n并初始化为3。
  6. 调用函数a,并传入参数n。
  7. 使用cout输出m的值,并换行。
  8. 使用cout输出n的值,并换行。
  9. 返回0,表示程序正常结束。
    代码的执行流程如下:
  10. 声明一个整型变量m并初始化为10。
  11. 定义函数a,接受一个整型参数n。
  12. 在函数a中,将15除以参数n的值赋给n,然后将m除以2的结果赋给m。
  13. 在主函数main中,定义一个整型变量n并初始化为3。
  14. 调用函数a,并将参数n的值传入。
  15. 使用cout输出m的值为5,并换行。
  16. 使用cout输出n的值为3,并换行。
  17. 返回0,表示程序正常结束。
    最终输出结果为:
m=5
n=3

这段代码的功能是对变量m和n进行一些计算操作,并输出结果。

答案:m = 5,n = 3; 过程:a(3); ----> { n = 15/3; m = 10/2; } n是在main()函数中声明的,n = 3,所以n = 15/3 = 5,只在函数a()的作用域中n = 5,但是a()是 void 类型,没有返回值,因此,回到main()函数中后,n仍然等于3。而m是全局变量,在整个程序的任何一个地方更改m的值,m的值都将改变,因此a()函数改变m的值后,main()函数中的m的值也发生了相应的改变。所以 ,调用a(3)后,在main()函数中输出cout<<m<<" "<<n<<endl; 结果为: 5 3


#include <iostream>
using namespace std;

class PP {
    int x, y;
public:
    PP() {
        x = 3;
        y = 5;
    }
    PP(int i, int j) {
        x = i - y - j;
    }
    void Messages() {
        cout << "x=" << x << " y=" << y << endl;
    }
};

int main() {
    PP* p1 = new PP();
    PP p2(3, 4);
    p2.Messages();
    p1->Messages();
    
    delete p1; // 释放动态分配的内存

    return 0;
}

这段代码的分析过程如下:

  1. 包含了iostream头文件以使用输入输出流。
  2. 使用了using namespace std来避免每次都需要写std::前缀。
  3. 声明了一个名为PP的类。
  4. 在PP类中,定义了私有成员变量x和y。
  5. 提供了两个构造函数:一个无参构造函数,用于初始化x和y的值为3和5;一个有参构造函数,用于将传入的参数分别赋值给x和y。
  6. 定义了一个名为Messages的成员函数,用来输出x和y的值。
  7. 定义了主函数main。
  8. 在主函数中,通过使用new关键字动态地创建了一个PP类的对象p1,并调用了其无参构造函数。这里使用了指针p1来存储对象的地址。
  9. 创建了一个PP类的对象p2,并调用了其有参构造函数,传入参数3和4。对象p2会在栈上分配内存。
  10. 调用p2的Messages函数,输出x和y的值,即输出"x=3 y=4"。
  11. 通过指针p1调用Messages函数,输出x和y的值,即输出"x=3 y=5"。
  12. 使用delete关键字释放动态分配的内存,即释放p1指向的对象的内存。
  13. 返回0,表示程序正常结束。
    最终输出结果为:
x=3 y=4
x=3 y=5

该代码主要展示了类的定义与使用。其中,类PP包含了两个构造函数、两个私有成员变量和一个成员函数。在主函数中,通过对象和指针分别创建并使用了PP类的实例。通过调用成员函数Messages,可以输出对象的成员变量x和y的值。最后,通过delete关键字释放了通过new关键字动态分配的内存,以避免内存泄漏。


分析一下过程#include <iostream>
using namespace std;
class A {
int a;
public:
A(int aa = 0) : a(aa) {
cout << a << "    ";
}
~A() {
cout << "析构";
}
};
int main() {
A x[2] = {2};
cout << endl;
return 0;
}

这段代码的分析过程如下:

  1. 包含了iostream头文件以使用输入输出流。
  2. 使用了using namespace std来避免每次都需要写std::前缀。
  3. 声明了一个名为A的类。
  4. 在A类中,定义了一个私有成员变量a。
  5. 提供了一个构造函数A,其中使用了参数的默认值0,用于初始化a的值。构造函数会输出a的值。
  6. 定义了一个析构函数~A,用于在对象被销毁时输出一条提示信息。
  7. 定义了主函数main。
  8. 在主函数中,创建了一个名为x的A类对象数组,数组大小为2。数组中的第一个对象会调用构造函数,并将参数2传入进行初始化。构造函数会输出2。数组中的第二个对象会使用参数的默认值0进行初始化。构造函数会输出0。
  9. 在主函数中,输出一个空行。
  10. 返回0,表示程序正常结束。
    最终输出结果为:
2    0    析构析构

代码的执行过程如下:

  1. 主函数开始执行。
  2. 创建一个名为x的A类对象数组,数组大小为2。
  3. 数组中的第一个对象会调用构造函数A(2),因此构造函数会输出2。
  4. 数组中的第二个对象会使用参数的默认值0进行初始化,因此构造函数会输出0。
  5. 在主函数中,输出一个空行。
  6. 主函数执行完毕,对象数组x会被销毁,先销毁第二个对象(析构函数输出"析构"),再销毁第一个对象(析构函数输出"析构")。
    因此,最终的输出结果是"2 0 析构析构"。(** 析构析构中间没有空!!!**)

#include <iostream>
using namespace std;

class A {
    int a, b;

public:
    A() {
        a = 0;
        b = 0;
    }
    A(int m) {
        a = m;
        b = 0;
    }
    A(int m, int n) {
        a = m;
        b = n;
    }

    void print() {
        cout << "a=" << a << " b=" << b << endl;
    }
};

int main() {
    A a, a2(5), a3(5, 15);

    a.print();
    a2.print();
    a3.print();

    return 0;
}

修正后的代码的运行结果为:

a=0 b=0
a=5 b=0
a=5 b=15

代码的执行过程如下:

  1. 包含了iostream头文件以使用输入输出流。
  2. 使用了using namespace std来避免每次都需要写std::前缀。
  3. 声明了一个名为A的类。
  4. 在A类中,定义了两个私有成员变量a和b。
  5. 提供了三个构造函数:
    • 默认构造函数A(),将a和b都初始化为0。
    • 构造函数A(int m),将a初始化为m,b初始化为0。
    • 构造函数A(int m, int n),将a初始化为m,b初始化为n。
  6. 定义了一个成员函数print(),用于输出a和b的值。
  7. 定义了主函数main。
  8. 在主函数中,分别创建了三个A类对象a、a2和a3,分别使用了不同的构造函数进行初始化。
  9. 依次调用a、a2和a3的print()函数,分别输出a和b的值。
  10. 返回0,表示程序正常结束。
    因此,最终的运行结果为:
a=0 b=0
a=5 b=0
a=5 b=15

#include <iostream>
using namespace std;

class A {
public:
    A() {
        cout << "generate class A" << endl;
    }
    ~A() {
        cout << "destroy class A" << endl;
    }
};

class B : public A {
public:
    B() {
        cout << "generate class B" << endl;
    }
    ~B() {
        cout << "destroy class B" << endl;
    }
};

int main() {
    B b;

    return 0;
}

这段代码定义了两个类A和B,并在主函数中创建了一个B类对象b。类A和类B都定义了构造函数和析构函数,并且类B继承自类A。
在程序执行过程中,首先创建了一个B类对象b。由于B类是A类的子类,因此在创建B类对象时,会先调用A类的构造函数,然后再调用B类的构造函数。因此,首先输出"generate class A",然后输出"generate class B"。
当程序执行完毕时,会先销毁B类对象b,调用B类的析构函数,输出"destroy class B",然后调用A类的析构函数,输出"destroy class A"。
因此,最终的运行结果为:

generate class A
generate class B
destroy class B
destroy class A

#include <iostream>
using namespace std;
class Base {
int x;
public:
virtual void Set(int b) {
x = b;
cout << "x=" << x << endl;
}
};
class Derived : public Base {
protected:
int y;
public:
void Set(int d) {
y = d;
cout << "y=" << y << endl;
}
};
int main() {
Base Bobj;
Derived Dobj;
Base* p;
p = &Bobj;
p->Set(100);
p = &Dobj;
p->Set(200);
return 0;
}

这段代码定义了两个类Base和Derived,并在主函数中创建了一个Base类对象Bobj和一个Derived类对象Dobj。类Base和类Derived都定义了函数Set,并且类Derived继承自类Base。
在程序执行过程中,首先创建了一个Base类对象Bobj和一个Derived类对象Dobj。
接下来,声明了一个Base指针变量p,并将p指向Bobj。然后通过p调用Set(100)函数,由于Set函数是虚函数,所以会根据指针指向的对象类型调用相应的函数。这里p指向的是Base类对象Bobj,所以调用了Base类的Set函数,输出"x=100"。
然后,将p指向Dobj。再次通过p调用Set(200)函数,同样根据指针指向的对象类型调用相应的函数。这里p指向的是Derived类对象Dobj,所以调用了Derived类的Set函数,输出"y=200"。
因此,最终的运行结果为:

x=100
y=200

#include <iostream>
using namespace std;

template <class T>
T min(T x, T y) {
    cout << "function1: ";
    return (x <= y) ? x : y;
}

int min(int x, int y) {
    cout << "function2: ";
    return (x < y) ? x : y;
}

int main() {
    int i = 5, j = 6;
    double d = 1.22, f = 13.21;

    cout << min(i, j) << endl;
    cout << min(d, f) << endl;
    cout << min(d, i) << endl;

    return 0;
}

这段代码定义了一个函数模板min和一个重载的min函数。函数模板min可以接受任意类型的参数,而重载的min函数只接受两个int类型的参数。
在主函数中,创建了两个int类型的变量i和j,并分别初始化为5和6。还创建了两个double类型的变量d和f,并分别初始化为1.22和13.21。
接下来,使用cout输出调用min(i, j)的结果,由于传入的是两个int类型的参数,因此调用的是重载的min函数,输出"function2: 5"。
然后,使用cout输出调用min(d, f)的结果,由于传入的是两个double类型的参数,因此调用的是函数模板min,输出"function1: 1.22"。
最后,使用cout输出调用min(d, i)的结果,由于传入的是一个double类型和一个int类型的参数,因此调用的是函数模板min,输出"function1: 1.22"。
因此,最终的运行结果为:

function2: 5
function1: 1.22
function1: 1.22

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    int k = 11;
    cout << "k=" << hex << k << endl;
    float d = 12.34144;
    cout << "d=" << setw(10) << setprecision(5) << setfill('*') << dec<< d << endl;
    
    return 0;
}

给出的代码是正确的。以下是代码的执行过程和运行结果:

  1. 包含了iostream和iomanip头文件以使用输入输出流和格式化输出的函数。
  2. 使用了using namespace std来避免每次都需要写std::前缀。
  3. 定义了主函数main
  4. 声明了一个int类型的变量k,并初始化为11。
  5. 使用cout输出"k=",然后使用hex表示输出k的十六进制形式,输出结果为b。
  6. 声明了一个float类型的变量d,并初始化为12.34144。
  7. 使用cout输出"d=",然后使用setw(10)表示输出宽度为10个字符,使用setprecision(5)表示保留小数点后5位,使用setfill(‘‘)表示填充字符为’’。
  8. 使用dec表示以十进制格式输出。
  9. 最后使用cout输出d的值,输出结果为"*****12.34144"。
    因此,最终的运行结果为:
k=b
d=*****12.34144

#include <iostream>

class A {
    int x;

public:
    A() {
        x = 2;
    }

    void print() {
        std::cout << "x = " << x << std::endl;
    }

    void operator++() {
        x += 5;
    }

    void operator--() {
        x -= 2;
    }
};

int main() {
    A a;
    ++a;
    a.print();
    --a;
    a.print();

    return 0;
}

这段代码定义了一个类 A,并在 main() 函数中使用该类。

A 包含一个私有成员变量 x,默认初始化为 2。类 A 还定义了以下成员函数:

  • print() 函数用于输出变量 x 的值。
  • operator++() 重载了前置递增运算符,将变量 x 的值增加 5。
  • operator--() 重载了前置递减运算符,将变量 x 的值减少 2。

main() 函数中,首先创建了一个类 A 的对象 a,调用构造函数初始化 x 的值为 2。接着,通过 ++ax 的值增加 5,并调用 a.print() 输出结果。然后,通过 --ax 的值减少 2,并再次调用 a.print() 输出结果。

所以,程序的输出结果应为:

x = 7
x = 5

代码逻辑比较简单,它主要演示了对类 A 进行成员函数重载和对对象进行递增和递减操作的功能。


#include <iostream>

class Base {
    int x, y;

public:
    Base(int x, int y) : x(x), y(y) {}

    void Move(int m, int n) {
        x += m;
        y += n;
    }

    void Show() {
        std::cout << "Base(" << x << "," << y << ")" << std::endl;
    }
};

class Derived : private Base {
    int x1, yl;

public:
    Derived(int i, int j, int m, int n) : Base(i, j), {x1=m, yl=n;}

    void Show() {
        std::cout << "Next(" << x1 << "," << yl << ")" << std::endl;
    }

    void Move{Move(2,3);}
     

    void Show1() {
        Base::Show();
        Show();
    }
};

int main() {
    Base b(1, 2);
    b.Show();

    Derived d(3, 4, 10, 15);
    d.Move1();
    d.Show();
    d.Show1();
    return 0;
}

这段代码定义了两个类 BaseDerived,并在 main 函数中创建了对象进行测试。

首先,让我们逐行分析代码:

#include <iostream>

这一行代码包含了标准输入输出流库,使得我们可以使用 std::cout 来输出信息。

接下来是类 Base 的定义:

class Base {
    int x, y;

public:
    Base(int x, int y) : x(x), y(y) {}

    void Move(int m, int n) {
        x += m;
        y += n;
    }

    void Show() {
        std::cout << "Base(" << x << "," << y << ")" << std::endl;
    }
};

Base 有两个私有成员变量 xy,表示整数坐标。构造函数 Base(int x, int y) 用于初始化这两个成员变量。成员函数 Move(int m, int n)xy 分别增加 mn。成员函数 Show() 输出 xy 的值。

接下来是类 Derived 的定义:

class Derived : private Base {
    int x1, y1;

public:
    Derived(int i, int j, int m, int n) : Base(i, j), x1(m), y1(n) {}

    void Show() {
        std::cout << "Next(" << x1 << "," << y1 << ")" << std::endl;
    }

    void Move() {
        Base::Move(2, 3);
    }

    void ShowAll() {
        Base::Show();
        Show();
    }
};

Derived 私有继承自 Base,意味着 Derived 类中的成员函数可以访问 Base 类的公有成员函数。类 Derived 有两个私有成员变量 x1y1,表示另外一组整数坐标。构造函数 Derived(int i, int j, int m, int n) 初始化基类 Base 的成员变量,以及派生类 Derived 自己的成员变量。成员函数 Show() 输出派生类的坐标。成员函数 Move() 调用基类 BaseMove() 函数,并传递参数 (2, 3) 来增加 Base 对象的坐标。成员函数 ShowAll() 先调用基类 BaseShow() 函数,然后再调用派生类 DerivedShow() 函数。

最后是 main 函数:

int main() {
    Base b(1, 2);
    b.Show();

    Derived d(3, 4, 10, 15);
    d.Move();
    d.Show();
    d.ShowAll();

    return 0;
}

main 函数中,首先创建了一个 Base 对象 b,并调用其成员函数 Show() 输出 (1, 2)。接下来,创建了一个 Derived 对象 d,并通过构造函数进行初始化。然后,调用 d.Move() 函数,使得基类 Base 的坐标增加 (2, 3)。接着,调用 d.Show() 输出派生类 Derived 的坐标 (10, 15)。最后,调用 d.ShowAll() 函数,先输出基类 Base 的坐标 (1, 2),然后输出派生类 Derived 的坐标 (10, 15)

根据代码的逻辑,以下是程序运行后的输出结果:

Base(1, 2)
Next(10, 15)
Base(3, 4)
Next(10, 15)

首先,使用 Base 类创建对象 b,然后调用 b.Show() 输出 (1, 2)

接着,使用 Derived 类创建对象 d,并传入参数 (3, 4, 10, 15) 进行初始化。然后,调用 d.Move() 函数,将基类 Base 的坐标增加 (2, 3)

接下来,调用 d.Show() 输出派生类 Derived 的坐标 (10, 15)

最后,调用 d.ShowAll() 函数,先输出基类 Base 的坐标 (3, 4),然后输出派生类 Derived 的坐标 (10, 15)

请注意,由于类 Base 的成员函数 Move()Show() 都没有声明为虚函数,因此在通过基类指针或引用调用这些函数时将无法实现多态性。在这个例子中,直接通过对象调用了相应的函数,而不是通过指针或引用。

程序填空

#include <iostream>

class A {
public:
——————————————————
    int x, y;

public:
    A(int i, int j) : x(i), y(j) {}
    
    void Show() {
        std::cout << "x: " << x << ", y: " << y << std::endl;
    }
};

int main() {
    A a(1, 2);
    a.Show(); // 调用 Show() 成员函数输出对象的坐标信息
    return 0;
}

程序设计题(共20分)

编写一个输出学校教师和后勒职员信息的程序。设计基类People,属性包括“工号”和“姓名”:派生类教师类Teacher和后勒职员类worker中分别新增属稚“职称”和“工龄”,并设计主函数进行测试。要求:
1,定义构造函数和输出成员函数:
2.使用扩充继承实现派生类人员信息的输出。
根据你的需求,我为你提供了一个满足要求的 C++ 程序示例:

#include <iostream>
#include <string>

// 基类 People
class People {
protected:
    int id;         // 工号
    std::string name;   // 姓名

public:
    People(int id, const std::string& name)
        : id(id), name(name) {}

    // 输出成员函数
    void display() const {
        std::cout << "工号: " << id << std::endl;
        std::cout << "姓名: " << name << std::endl;
    }
};

// 派生类 Teacher
class Teacher : public People {
private:
    std::string title;  // 职称

public:
    Teacher(int id, const std::string& name, const std::string& title)
        : People(id, name), title(title) {}

    // 输出成员函数(覆盖基类的 display 函数)
    void display() const {
        People::display();  // 先调用基类的 display 函数
        std::cout << "职称: " << title << std::endl;
    }
};

// 派生类 Worker
class Worker : public People {
private:
    int workYears;  // 工龄

public:
    Worker(int id, const std::string& name, int workYears)
        : People(id, name), workYears(workYears) {}

    // 输出成员函数(覆盖基类的 display 函数)
    void display() const {
        People::display();  // 先调用基类的 display 函数
        std::cout << "工龄: " << workYears << "年" << std::endl;
    }
};

int main() {
    People p(1, "张三");
    p.display();
    std::cout << std::endl;

    Teacher t(2, "李四", "教授");
    t.display();
    std::cout << std::endl;

    Worker w(3, "王五", 5);
    w.display();
    std::cout << std::endl;

    return 0;
}

在这个程序中,定义了一个基类 People,以及两个派生类 TeacherWorker,并实现所需的构造函数和输出成员函数。基类 People 包含工号和姓名属性,并提供了 display 函数用于输出成员信息。派生类 TeacherWorker 分别新增了职称和工龄属性,并通过覆盖 display 函数实现了派生类成员信息的输出。

main 函数中,创建了一个基类 People 的对象 p,以及两个派生类对象 TeacherWorker 的对象 tw。分别调用它们的 display 函数,输出各自的成员信息。

程序输出结果为:

工号: 1
姓名: 张三

工号: 2
姓名: 李四
职称: 教授

工号: 3
姓名: 王五
工龄: 5年

当你运行这个程序时,它将创建一个基类 People 的对象 p,并使用构造函数初始化工号为1,姓名为"张三"。然后调用 display 函数输出该对象的成员信息:

工号: 1
姓名: 张三

接下来,程序创建一个派生类 Teacher 的对象 t,并使用构造函数初始化工号为2,姓名为"李四",职称为"教授"。由于 Teacher 类中覆盖了基类 Peopledisplay 函数,所以在调用 t.display() 时会先调用基类的 display 函数,输出工号和姓名,然后再输出职称:

工号: 2
姓名: 李四
职称: 教授

然后,程序创建一个派生类 Worker 的对象 w,并使用构造函数初始化工号为3,姓名为"王五",工龄为5年。同样地,由于 Worker 类中覆盖了基类 Peopledisplay 函数,所以在调用 w.display() 时会先调用基类的 display 函数,输出工号和姓名,然后再输出工龄:

工号: 3
姓名: 王五
工龄: 5年

这样,程序通过扩充继承实现了输出不同类的人员信息,并且派生类中新增的属性也得以正确输出。

这个程序示例展示了面向对象编程中的继承和多态的概念。基类 People 定义了所有人员共有的属性和行为,而派生类 TeacherWorker 在继承基类的同时增加了各自独有的属性,并通过覆盖基类的函数实现了特定的行为。这种设计使得我们可以在统一的接口下操作不同类型的对象,并根据对象的实际类型调用对应的函数。

在这个程序中,我们使用了面向对象编程的三大特性之一:继承。通过继承,派生类可以从基类继承属性和方法,并且可以添加自己的额外属性和方法。这使得我们可以利用代码的复用性,避免重复编写相似的代码。

在示例中,Teacher 类和 Worker 类分别是基类 People 的派生类。它们继承了 People 类中的成员变量 idname,并分别新增了属于自己的成员变量 titleworkYears

为了实现继承,我们使用了 public 访问修饰符来指定派生类对基类成员的访问权限。具体来说,在 Teacher 类和 Worker 类的定义中,我们使用 : public People 将它们声明为公有继承关系。

此外,在 Teacher 类和 Worker 类中,我们还覆盖(override)了基类 People 中的 display 函数。通过使用相同的函数名称和签名,派生类可以重写(override)基类中已经存在的函数,并且通过关键字 override 明确表明这是对基类函数的重写。在派生类中,我们先调用基类的 display 函数,然后再在输出中添加额外的信息,实现了对派生类的特定输出。

这个示例还展示了多态(polymorphism)的概念。多态允许我们通过基类指针或引用来操作派生类对象,以达到统一的接口。在 main 函数中,我们创建了基类 People 的对象 p,以及派生类 TeacherWorker 的对象 tw。然后,我们分别调用它们的 display 函数,尽管它们的类型不同,但由于多态性,它们都会调用正确的成员函数来输出各自的信息。

总结起来,继承和多态是面向对象编程中非常重要的概念。它们提供了代码的组织和重用的机制,使得程序更加灵活和可扩展。通过继承,我们可以构建出更丰富的类层次结构,通过多态,我们可以以统一的方式操作不同类型的对象。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot初始化接口CommandLineRunner

CommandLineRunner的使用 接口定义使用执行顺序使用 Order 注解实现Orderd接口排序总结 接口定义 Spring官方给出的接口定义 package org.springframework.boot;FunctionalInterface public interface CommandLineRunner {void run(String... args) throws Exception; }在 Sp…

Facebook如何与品牌合作,提升用户体验?

Facebook是全球最大的社交媒体平台之一&#xff0c;每天有数亿用户在上面发布内容、互动交流。对于品牌来说&#xff0c;与Facebook合作可以帮助它们扩大影响力、吸引更多潜在客户。 但是&#xff0c;与Facebook合作不仅仅是在平台上发布广告&#xff0c;还需要更深入的合作来…

如何在 Spring Boot 中使用反向代理

如何在 Spring Boot 中使用反向代理 介绍 在分布式系统中&#xff0c;反向代理是一项非常重要的技术。通过反向代理&#xff0c;可以将客户端的请求转发到后端的多台服务器上&#xff0c;实现负载均衡和故障转移等功能。本文将介绍如何在 Spring Boot 应用中使用反向代理。 环…

Flink DataStream之创建执行环境

新建project&#xff1a; pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://ma…

iMazing 2.16官方下载使用起来安全吗?

鉴于苹果设备的封闭性与安全性&#xff0c;我们大部分情况下都需要搭配iTunes进行设备的管理。但作为一款全方位的iOS设备管理软件&#xff0c;iMazing竟然可以突破iTunes的限制&#xff0c;与设备直接连接&#xff0c;进行备份、管理等操作。 因此&#xff0c;很多人都会有疑…

OpenStack(T版)——块存储(Cinder)服务介绍与安装

文章目录 OpenStack(T版)——块存储(Cinder)服务介绍与安装安装和配置(controller)准备(1)创建数据库(2)加载admin user的环境变量(3)创建Identity服务凭据(4)创建Cinder 块存储服务组件的API endpoint 安装和配置Cinder块存储服务组件(1)安装软件包(2)编辑/etc/cinder/cinder.…

【Java可执行命令】(三)API文档生成工具javadoc: 深入解析Java API文档生成工具javadoc ~

Java可执行命令详解之javadoc 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.1.1 可选参数&#xff1a;-d < directory>3.1.2 可选参数&#xff1a;-sourcepath < pathlist>3.1.3 可选参数&#xff1a;-classpath < pathlist>3.1.4 可选参数&#xff1…

工业RFID在自动化控制中的解决方案

在工业自动化控制领域中&#xff0c;利用RFID技术可以对物品、设备和工具的进行追踪&#xff0c;可以有效提高生产效率和管理水平。下面我们就一起来了解一下&#xff0c;RFID在工业自动化控制中的解决方案是什么样的。 工业RFID在自动化控制中的解决方案 在工业生产过程中&a…

使用 Jetpack Compose 构建 LinearProgressIndicator

欢迎阅读这篇关于如何使用 Jetpack Compose 构建 LinearProgressIndicator&#xff08;线性进度指示器&#xff09;的博客。Jetpack Compose 是 Google 推出的一款现代化 UI 工具包&#xff0c;用于构建 Android 界面。其声明式的设计使得 UI 开发更加简洁、直观。 什么是 Line…

AQS之Semaphore详解

AQS之Semaphore详解 一、Semaphore类的继承关系1. AbstractQueuedSynchronizer:提供了一个同步器的框架。2. Sync&#xff1a;Semaphore的内部类&#xff0c;提供了锁的具体实现。3. FairSync&#xff1a;Sync的子类&#xff0c;实现公平锁。4. NonfairSync:Sync的子类&#xf…

ARHUD驾车导航技术概览

ARHUD(Augmented Reality Head Up Display)&#xff0c;即增强现实与抬头显示的结合&#xff0c;是一种将渲染元素投影在真实世界的技术&#xff0c;也是目前用户理解成本最低的展示方式。 HUD功能第一次应用是在二战中&#xff0c;被应用在枪械和战斗机上&#xff0c;80年代初…

React hooks文档笔记(三) 状态

状态 一、如何设计组件状态的步骤二、状态构造原则1. 组相关状态2. 避免矛盾/互斥状态3. 避免多余状态4. 不要把props放进state&#xff0c;除非你特别想要阻止更新 三、状态保存/重置1. 相同位置的相同组件保留状态2. 同一位置不同元素reset状态 一、如何设计组件状态的步骤 …

组装电脑U盘重装Win10系统教程图解

当您需要对组装电脑进行重新安装Win10操作系统时&#xff0c;使用U盘是一种方便而有效的方法&#xff0c;U盘重装系统不仅可以帮助您解决各种系统问题&#xff0c;还能提供一个干净、稳定的系统环境。无论您是初学者还是有一定经验的用户&#xff0c;本教程将提供清晰的组装电脑…

游戏革命2023:AIGC拯救游戏厂商

文明史即工具史&#xff0c;纵观人类社会的演化&#xff0c;每一次的加速迭代&#xff0c;都有赖于关键性的技术突破。 前有蒸汽机到电力普及的生产力大爆发&#xff0c;以及计算机、互联网的诞生打开新世界&#xff0c;如今AIGC将再次推动先进技术工具的变革。 随着ChatGPT的…

观察者模式(二十)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了迭代器模式(十九), 如果没有看过, 请观看上一章 一. 观察者模式 引用 菜鸟教程里面 观察者模式介绍: https://www.runoob.com/design-pattern/observer-pattern.html 当对象间存在一对多关系时&#xff0c;则使用观察…

CSS之定位

作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 leftrighttopbottom 相对定位 position: relative 特点&#xff1a; 不脱标&#xff0c;占用自己原来位置显示模式特点保持不变设…

OpenStack(4)--NameSpace实现不同项目(租户)重叠网段

openstack通过namespace将不同项目&#xff08;租户&#xff09;的网络隔离&#xff0c;每个项目的管理员都需要对项目网络进行规划建设&#xff0c;这就导致不同项目之间会重复使用到某些网段&#xff0c;例如192.168.X.X就是管理员习惯使用的网段。 上一次我们新建位于vxlan…

【TCP/IP】多进程服务器的实现(进阶) - 多进程服务器模型及代码实现

经过前面的铺垫&#xff0c;我们已经具备实现并发服务器的基础了&#xff0c;接下来让我们尝试将之前的单任务回声服务器改装成多任务并发模式吧&#xff01; 多任务回声服务器模型 在编写代码前&#xff0c;先让我们大致将多任务&#xff08;回声&#xff09;服务器的模型抽象…

通过USB和wifi连接真机编写第一个脚本

目录 一、连接手机 1、通过usb数据线连接手机 2、无线连接手机 二、编写第一个脚本 一、连接手机 1、通过usb数据线连接手机 数据线连接手机并允许调试 cmd命令行执行&#xff1a; adb devices 如果没有显示device信息&#xff0c;请检查&#xff1a; 手机是否开启usb调…

配置了git config --global credential.helper store后,还是弹出输入密码框

使用http协议拉取代码时,每次pull/push都会弹出账号密码框,可以使用git的配置credential.helper来保存每次输入的账号密码到硬盘上,命令git config --global credential.helper store,store表示存到硬盘中,但是按照这样操作后git pull还是弹出密码框,通过git config --list发现…