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

贵州app开发公司/国内做seo最好公司

贵州app开发公司,国内做seo最好公司,长沙哪里有做网站的公司,海南发展文章目录 初始化列表语法结构定义和使用案例初始化列表初始化常量成员: 注意事项 运算符重载加法运算符重载语法结构示例注意事项 减法运算符重载语法结构示例注意事项 等于运算符重载等于运算符 的重载语法示例注意事项 大于运算符重载大于运算符 > 的重载语法…

文章目录

  • 初始化列表
    • 语法结构
    • 定义和使用
    • 案例
      • 初始化列表初始化常量成员:
    • 注意事项
  • 运算符重载
    • 加法运算符重载
      • 语法结构
      • 示例
      • 注意事项
    • 减法运算符重载
      • 语法结构
      • 示例
      • 注意事项
    • 等于运算符重载
      • 等于运算符 == 的重载语法
      • 示例
      • 注意事项
    • 大于运算符重载
      • 大于运算符 > 的重载语法
      • 示例
      • 注意事项
    • ++运算符重载
      • 前置加加运算符 (++operand)
        • 语法结构和定义
        • 示例
        • 注意事项(前置加加运算符)
      • 后置加加运算符 (operand++)
        • 语法结构和定义
        • 示例
        • 注意事项(后置加加运算符)
    • <<运算符重载
      • 语法结构和定义
      • 示例
      • 注意事项
  • 静态变量和函数
    • 静态变量(静态成员变量)
      • 语法结构和定义:
      • 案例:
      • 注意事项:
    • 静态函数(静态成员函数)
      • 语法结构和定义:
      • 案例:
      • 注意事项:
  • 友元
    • 友元函数
      • 语法结构和定义:
      • 案例:
      • 注意事项:
    • 友元类
      • 声明
      • 案例:
      • 注意事项:

初始化列表

初始化列表(initializer list)在C++中是一种用来初始化类、结构体、数组等数据结构的语法结构。它可以在定义变量时直接初始化,也可以在构造函数中初始化成员变量。

语法结构

ConstructorName(Type1 arg1, Type2 arg2, ...) : member1(arg1), member2(arg2), ... {// constructor body
}

这里是初始化列表的组成部分

ConstructorName:构造函数的名称,与类名相同。

参数列表:构造函数可以接受的参数列表,这些参数用来初始化类的成员变量。

冒号(:):初始化列表以冒号开头。

成员初始化:每个成员初始化的语法是 memberName(arg),其中 memberName 是类的成员变量名,arg 是用来初始化该成员变量的值。

构造函数体:可选的构造函数体,用来执行更多的初始化操作或者其他逻辑。

定义和使用

在变量定义时的初始化:

int arr[3] = {1, 2, 3}; // 初始化数组
std::vector<int> vec = {4, 5, 6}; 
// 初始化向量在构造函数中的初始化:
class Example {
public:int x;double y;// 构造函数使用初始化列表Example(int a, double b) : x(a), y(b) {// 构造函数体}
};

在上面的例子中,Example类的构造函数使用初始化列表来初始化成员变量x和y。

案例

初始化列表初始化成员变量:

class Point {
private:int x, y;public:// 使用初始化列表初始化成员变量Point(int x_val, int y_val) : x(x_val), y(y_val) {// 可选的构造函数体}
};

初始化列表初始化常量成员:

class Circle {
private:const double pi;double radius;public:// 初始化常量成员 piCircle(double r) : pi(3.14159), radius(r) {// 构造函数体}
};

注意事项

初始化顺序:初始化列表中的成员变量初始化顺序与它们在类中声明的顺序一致,而不是它们在初始化列表中出现的顺序。

初始化常量成员:常量成员变量(如上例中的pi)只能通过初始化列表来初始化,不能在构造函数体内赋值。

成员变量类型:初始化列表只能用于初始化非静态成员变量,静态成员变量不能在构造函数初始化列表中初始化。

没有默认值:如果类的某个成员变量没有在初始化列表中初始化,它将使用默认的构造函数进行初始化(如果有的话)。

效率:初始化列表的使用可以避免不必要的默认构造和拷贝操作,因此在效率上可能比在构造函数体内进行初始化更好。

运算符重载

加法运算符重载

语法结构

加法运算符 + 的重载语法如下:

ReturnType operator+(const ClassName& obj) {// 加法运算的实现// 可以访问对象的成员变量和方法return ReturnType(result);
}

其中:

  • ReturnType:是加法运算的结果类型,可以是对象、引用或者基本数据类型。
  • operator+:是加法运算符的函数名,用于重载加法运算符。
  • ClassName:是定义加法运算符的类名。
  • const ClassName& obj:是右操作数,即用于与当前对象进行加法运算的对象。

函数体内部实现了加法的逻辑,并返回加法结果。

示例

下面是一个使用加法运算符重载的示例:

#include <iostream>class Complex {
private:double real;double imag;public:Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}// 重载加法运算符+Complex operator+(const Complex& other) {Complex temp;temp.real = real + other.real;temp.imag = imag + other.imag;return temp;}void display() {std::cout << real << " + " << imag << "i" << std::endl;}
};int main() {Complex c1(2.3, 4.5);Complex c2(3.4, 5.6);Complex c3;c3 = c1 + c2; // 使用重载的+运算符std::cout << "Sum of ";c1.display();std::cout << "and ";c2.display();std::cout << "is ";c3.display();return 0;
}

在这个例子中,Complex类表示复数,重载了加法运算符 +,使得可以对两个 Complex 对象进行相加操作。在 main() 函数中,创建了两个复数对象 c1 和 c2,然后通过 c1 + c2 进行加法运算,并将结果赋给 c3。

注意事项

参数类型:通常情况下,加法运算符重载的参数应当是同类的对象或者可以转换为同类对象的类型。

返回类型:加法运算符重载函数通常返回一个新的对象,代表加法的结果。

修改对象:一般情况下,不应该在加法运算符重载中修改参数对象本身的状态,而是应当返回一个新的对象表示结果。

友元函数:如果需要在加法运算符重载函数中访问私有成员变量,可以将其声明为友元函数。

连续加法:重载的加法运算符也支持链式调用,例如 c1 + c2 + c3。

保持语义一致性:加法运算符重载的结果应当符合加法的数学意义,并且不应引入歧义或者不合理的行为。

减法运算符重载

当涉及到在 C++ 中重载减法运算符 - 时,它与重载加法运算符类似,允许用户定义对自定义类型的减法操作。下面是减法运算符重载的语法结构、示例和一些注意事项:

语法结构

减法运算符 - 的重载语法如下:

ReturnType operator-(const ClassName& obj) {// 减法运算的实现// 可以访问对象的成员变量和方法return ReturnType(result);
}

其中:

  • ReturnType:是减法运算的结果类型,可以是对象、引用或者基本数据类型。
  • operator-:是减法运算符的函数名,用于重载减法运算符。
  • ClassName:是定义减法运算符的类名。
  • const ClassName& obj:是右操作数,即用于与当前对象进行减法运算的对象。

函数体内部实现了减法的逻辑,并返回减法结果。

示例

下面是一个使用减法运算符重载的示例,假设我们仍然使用复数 Complex 类:

#include <iostream>class Complex {
private:double real;double imag;public:Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}// 重载减法运算符-Complex operator-(const Complex& other) {Complex temp;temp.real = real - other.real;temp.imag = imag - other.imag;return temp;}void display() {std::cout << real << " + " << imag << "i" << std::endl;}
};int main() {Complex c1(5.7, 8.4);Complex c2(3.2, 1.6);Complex c3;c3 = c1 - c2; // 使用重载的-运算符std::cout << "Difference of ";c1.display();std::cout << "and ";c2.display();std::cout << "is ";c3.display();return 0;
}

在这个示例中,Complex 类再次表示复数,重载了减法运算符 -,允许对两个 Complex 对象进行减法操作。在 main() 函数中,创建了两个复数对象 c1 和 c2,然后通过 c1 - c2 进行减法运算,并将结果赋给 c3。

注意事项

参数类型和返回类型:与加法运算符类似,减法运算符重载函数的参数应当是同类的对象或者可以转换为同类对象的类型,返回类型通常是表示减法结果的新对象。

对象状态:遵循良好的实践,不要在减法运算符重载中修改参数对象本身的状态,而是应当返回一个新的对象表示结果。

友元函数:如有需要,可以将减法运算符重载函数声明为友元函数以访问私有成员变量。

连续减法:重载的减法运算符同样支持链式调用,例如 c1 - c2 - c3。

语义一致性:确保减法运算符重载的行为符合减法的数学定义,避免引入歧义或者不合理的操作。

等于运算符重载

当你在 C++ 中重载等于运算符 ==,你可以自定义两个对象相等的条件。这种重载允许你用更符合你自定义类型特性的方式来比较对象的相等性。

等于运算符 == 的重载语法

等于运算符的重载语法如下:

bool operator==(const ClassName& obj) const {// 判断当前对象和参数对象是否相等的逻辑// 返回 true 表示相等,返回 false 表示不相等
}

其中:

  • bool:等于运算符需要返回一个布尔值,表示对象是否相等。
  • operator==:是等于运算符的函数名,用于重载等于运算符。
  • ClassName:是定义等于运算符的类名。
  • const ClassName& obj:是右操作数,即用于与当前对象进行比较的对象。

const 关键字和成员函数后面的 const 保证了该成员函数不会修改对象的成员变量。

示例

假设我们继续使用复数 Complex 类来示范等于运算符的重载:

#include <iostream>class Complex {
private:double real;double imag;public:Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}// 重载等于运算符==bool operator==(const Complex& other) const {return (real == other.real) && (imag == other.imag);}void display() const {std::cout << real << " + " << imag << "i" << std::endl;}
};int main() {Complex c1(2.0, 3.0);Complex c2(2.0, 3.0);Complex c3(4.0, 1.5);if (c1 == c2) {std::cout << "c1 and c2 are equal." << std::endl;} else {std::cout << "c1 and c2 are not equal." << std::endl;}if (c1 == c3) {std::cout << "c1 and c3 are equal." << std::endl;} else {std::cout << "c1 and c3 are not equal." << std::endl;}return 0;
}

在这个示例中,Complex 类重载了等于运算符 ==,以便比较两个复数对象的实部和虚部是否相等。在 main() 函数中,创建了三个复数对象 c1、c2 和 c3,并使用 c1 == c2 和 c1 == c3 来演示等于运算符的使用。

注意事项

语义一致性:确保你的等于运算符重载与你的类型的语义一致。比如,在复杂类型中,可能需要比较多个成员变量而不仅仅是一个。

友元函数:如有必要,等于运算符重载可以声明为友元函数,以便访问私有成员变量。

对称性:等于运算符应当是对称的,即 a == b 应当和 b == a 具有相同的效果。

大于运算符重载

大于运算符 > 的重载语法

大于运算符的重载语法与等于运算符类似,它允许您自定义两个对象之间的大小比较条件。

bool operator>(const ClassName& obj) const {// 判断当前对象是否大于参数对象的逻辑// 返回 true 表示当前对象大于参数对象,返回 false 表示不大于
}

其中:

  • bool:大于运算符需要返回一个布尔值,表示当前对象是否大于参数对象。
  • operator>:是大于运算符的函数名,用于重载大于运算符。
  • ClassName:是定义大于运算符的类名。
  • const ClassName& obj:是右操作数,即用于与当前对象进行比较的对象。

const 关键字和成员函数后面的 const 保证了该成员函数不会修改对象的成员变量。

示例

继续使用之前的 Complex 类来演示大于运算符的重载:

#include <iostream>class Complex {
private:double real;double imag;public:Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}// 重载大于运算符>bool operator>(const Complex& other) const {// 比较复数的模(模长)double this_modulus = real * real + imag * imag;double other_modulus = other.real * other.real + other.imag * other.imag;return this_modulus > other_modulus;}void display() const {std::cout << real << " + " << imag << "i" << std::endl;}
};int main() {Complex c1(2.0, 3.0);Complex c2(4.0, 1.5);if (c1 > c2) {std::cout << "c1 is greater than c2." << std::endl;} else {std::cout << "c1 is not greater than c2." << std::endl;}return 0;
}

在这个示例中,Complex 类重载了大于运算符 >,以便比较两个复数对象的模(即模长)是否满足大于关系。在 main() 函数中,创建了两个复数对象 c1 和 c2,并使用 c1 > c2 来演示大于运算符的使用。

注意事项

语义一致性:确保您的大于运算符重载与您的类型的语义一致。比如,在复杂类型中,可能需要比较多个成员变量而不仅仅是一个。

友元函数:如有必要,大于运算符重载可以声明为友元函数,以便访问私有成员变量。

对称性:大于运算符应当是对称的,即 a > b 应当和 b < a 具有相同的效果。

++运算符重载

当我们讨论 “++” 运算符在 C++ 中的重载时,通常会涉及到两种形式:前置加加运算符(++operand)和后置加加运算符(operand++)。下详细解释这两种运算符的重载语法结构、定义、案例和注意事项。

前置加加运算符 (++operand)

语法结构和定义

前置加加运算符 ++ 的重载形式如下:

ReturnType operator++() {// 增加操作数的值// 返回增加后的操作数
}

其中:

  • ReturnType:是返回值的类型,通常是引用类型,以便支持连续操作。
  • operator++:是前置加加运算符的函数名,用于重载前置加加运算符。
  • ():代表这是一个函数调用。

操作数被隐式地作为当前对象(this)传递给运算符函数。

示例

以下是一个示例,演示了如何重载前置加加运算符:

#include <iostream>class Integer {
private:int value;public:Integer(int v = 0) : value(v) {}// 重载前置加加运算符++Integer& operator++() {++value;return *this;}void display() const {std::cout << "Value: " << value << std::endl;}
};int main() {Integer num(5);++num;  // 使用前置加加运算符num.display();  // 输出 Value: 6return 0;
}

在这个示例中,Integer 类重载了前置加加运算符 ++,使得可以直接对 Integer 类型的对象进行自增操作。

注意事项(前置加加运算符)

返回类型:通常应该返回引用类型 ReturnType&,以支持链式调用和修改对象本身。

副作用:前置加加运算符会直接修改对象的值,应该确保操作的一致性和正确性。

成员函数声明:通常应将前置加加运算符声明为类的成员函数,以便访问对象的私有成员变量。

后置加加运算符 (operand++)

语法结构和定义

后置加加运算符 ++ 的重载形式如下:

ReturnType operator++(int) {// 创建一个副本以便于后续返回// 增加操作数的值// 返回之前的副本
}

其中:

  • ReturnType:是返回值的类型,通常是原始类型(非引用)。
  • operator++:是后置加加运算符的函数名,用于重载后置加加运算符。
  • (int):这是一个额外的参数,但通常不使用该参数。
示例

以下是一个示例,演示了如何重载后置加加运算符:

#include <iostream>class Integer {
private:int value;public:Integer(int v = 0) : value(v) {}// 重载后置加加运算符++Integer operator++(int) {Integer temp(value);  // 创建一个副本++value;  // 增加操作数的值return temp;  // 返回之前的副本}void display() const {std::cout << "Value: " << value << std::endl;}
};int main() {Integer num(5);Integer old_num = num++;  // 使用后置加加运算符num.display();  // 输出 Value: 6old_num.display();  // 输出 Value: 5return 0;
}

在这个示例中,Integer 类重载了后置加加运算符 ++,返回原始值的副本,并在返回之前增加了对象的值。

注意事项(后置加加运算符)

返回类型:通常应该返回对象的原始类型,而不是引用,以避免悬挂引用问题。
参数:后置加加运算符通常需要一个额外的 int 参数(可以不使用),用于区分前置和后置形式。
效率:后置加加运算符需要创建一个对象的副本,因此可能比前置加加运算符稍慢。

<<运算符重载

重载左移运算符 << 在 C++ 中常用于自定义类的输出格式,使得类对象可以像内置类型一样直接输出到标准输出流(如 std::cout)。下面详细解释如何在 C++ 中重载左移运算符 <<。

语法结构和定义

左移运算符 << 的重载形式如下:

ReturnType operator<<(std::ostream& os, const YourClass& obj) {// 输出 obj 到 ostream os 中return os;  // 返回 ostream 对象
}

其中:

  • ReturnType:通常是 std::ostream&,因为左移运算符重载的目的是为了支持链式输出。
  • operator<<:是左移运算符的函数名,用于重载左移运算符。
  • std::ostream& os:是输出流对象的引用,如 std::cout。
  • const YourClass& obj:是要输出的类对象的引用,通常是常量引用以避免不必要的复制。

示例

以下是一个示例,演示了如何重载左移运算符 <<:

#include <iostream>class Point {
private:int x;int y;public:Point(int x = 0, int y = 0) : x(x), y(y) {}// 重载左移运算符<<friend std::ostream& operator<<(std::ostream& os, const Point& obj) {os << "Point(" << obj.x << ", " << obj.y << ")";return os;}
};int main() {Point p1(3, 4);Point p2(-1, 8);std::cout << "Point p1: " << p1 << std::endl;std::cout << "Point p2: " << p2 << std::endl;return 0;
}

在这个示例中,Point 类重载了左移运算符 <<,使得可以直接输出 Point 对象到标准输出流 std::cout 中。

注意事项

友元函数:通常将左移运算符重载函数声明为类的友元函数,以便访问类的私有成员变量。

返回类型:应该返回 std::ostream& 类型,以支持链式输出。

引用参数:对象参数应该是常量引用 const YourClass&,避免不必要的复制。

静态变量和函数

在C++中,静态变量(静态成员变量)和静态函数(静态成员函数)属于类的静态成员,它们不依赖于类的实例而存在,而是与类本身关联。以下是它们的语法结构、定义、案例和注意事项:

静态变量(静态成员变量)

语法结构和定义:

静态成员变量由关键字 static 声明,通常在类的声明中定义,但在类的定义外初始化。

定义格式为:static type variable_name;

class MyClass {
public:static int count;// other members...
};// 类的定义外部初始化
int MyClass::count = 0;

案例:

#include <iostream>class MyClass {
public:static int count;MyClass() {count++;}
};int MyClass::count = 0;int main() {MyClass obj1;MyClass obj2;MyClass obj3;std::cout << "Number of objects created: " << MyClass::count << std::endl;return 0;
}

输出:

Number of objects created: 3

注意事项:

  • 静态变量被所有类对象共享,它们在程序的生命周期内只有一份实例。

  • 静态成员变量必须在类的定义外部进行初始化。

  • 可以通过类名和作用域解析运算符 :: 来访问静态成员变量,如 MyClass::count。

静态函数(静态成员函数)

语法结构和定义:

静态成员函数也由关键字 static 声明。

静态函数可以直接访问类的静态成员变量和其他静态成员函数,但不能直接访问非静态成员变量和非静态成员函数。

定义格式为:static return_type function_name(parameters);
class MyClass {
public:static void staticFunction() {std::cout << "This is a static function." << std::endl;}
};

案例:

#include <iostream>class MyClass {
public:static void staticFunction() {std::cout << "This is a static function." << std::endl;}void normalFunction() {std::cout << "This is a normal function." << std::endl;}
};int main() {MyClass::staticFunction();MyClass obj;obj.normalFunction();// Accessing static function through object (not recommended):obj.staticFunction(); // valid but not recommendedreturn 0;
}

输出

This is a static function.
This is a normal function.
This is a static function.

注意事项:

  • 静态函数不能直接访问非静态成员变量或非静态成员函数,因为它们没有隐含的 this 指针。

  • 可以通过类名直接调用静态函数,也可以通过对象调用静态函数,但不推荐后者,因为静态函数不依赖于具体对象。

友元

友元(friend)在C++中是一种机制,允许某些函数或类访问另一个类的私有成员。友元可以是一个函数、一个类、或者整个类中的所有函数。这种机制打破了C++中的封装性,因此需要谨慎使用。

友元函数

语法结构和定义:

友元函数声明在目标类的内部,但定义在类的外部。

友元函数的声明以关键字 friend 开始,后面跟随函数原型。
class MyClass {
private:int privateData;public:MyClass() : privateData(0) {}friend void friendFunction(MyClass &obj);
};void friendFunction(MyClass &obj) {// 友元函数可以访问目标类的私有成员obj.privateData = 100;
}

案例:

#include <iostream>class MyClass {
private:int privateData;public:MyClass() : privateData(0) {}friend void friendFunction(MyClass &obj);void displayPrivateData() {std::cout << "Private data: " << privateData << std::endl;}
};void friendFunction(MyClass &obj) {obj.privateData = 100; // 可以访问私有成员 privateData
}int main() {MyClass obj;friendFunction(obj); // 调用友元函数obj.displayPrivateData(); // 输出 Private data: 100return 0;
}

输出

Private data: 100

注意事项:

  • 友元函数并不是目标类的成员函数,它没有 this 指针,因此不能直接访问类的成员。
  • 友元函数在访问目标类的私有成员时不受访问权限限制。
  • 友元函数的声明需要在目标类中进行,但定义可以在类外部进行。
    友元类

除了友元函数,C++还支持友元类,即一个类可以将另一个类声明为自己的友元,这样被声明的友元类就可以访问声明它为友元的类的所有成员,包括私有成员。

友元类

声明

class FriendClass {
public:void accessMyClassPrivateData(MyClass &obj) {obj.privateData = 200; // 可以访问目标类的私有成员}
};class MyClass {
private:int privateData;friend class FriendClass; // 声明FriendClass为友元类public:MyClass() : privateData(0) {}void displayPrivateData() {std::cout << "Private data: " << privateData << std::endl;}
};

案例:

#include <iostream>class FriendClass {
public:void accessMyClassPrivateData(MyClass &obj) {obj.privateData = 200; // 可以访问目标类的私有成员}
};class MyClass {
private:int privateData;friend class FriendClass; // 声明FriendClass为友元类public:MyClass() : privateData(0) {}void displayPrivateData() {std::cout << "Private data: " << privateData << std::endl;}
};int main() {MyClass obj;FriendClass friendObj;friendObj.accessMyClassPrivateData(obj); // 通过友元类访问私有成员obj.displayPrivateData(); // 输出 Private data: 200return 0;
}

输出

 Private data: 200

注意事项:

  • 友元类的声明会影响整个类的封装性,因此应慎重考虑使用。
  • 友元关系是单向的,声明了 A 类为 B 类的友元并不意味着 B 类也是 A 类的友元。
  • 友元关系不能被继承,子类不能访问父类的友元。

相关文章:

C++——类和对象(初始化列表和运算符重载与静态与友元)

文章目录 初始化列表语法结构定义和使用案例初始化列表初始化常量成员&#xff1a; 注意事项 运算符重载加法运算符重载语法结构示例注意事项 减法运算符重载语法结构示例注意事项 等于运算符重载等于运算符 的重载语法示例注意事项 大于运算符重载大于运算符 > 的重载语法…...

【WPF】图片剪裁-ImageCropping

【WPF】图片剪裁-ImageCropping 背景技术栈实现思路核心代码界面布局Style处理逻辑使用技巧预览下载背景 机缘巧合吧,当时在全网寻找图像剪裁工具,但大都不能满足需求,于是决定动手写。当然如果只是为了完成这么一个功能就没有必要记录了,主要是不依赖与第三方图像库,且实…...

C++的模板(十二):forward模板

标准库的std::forward模板有一个类型T参数。在实际使用时&#xff0c;T取什么值应该不存在疑惑&#xff1a; class A { public:A() {}A(int n):n(n) {}template <class T> A(T &&a);void print(A &&a) { printf("A&&\n"); }void pri…...

docker desktop历史版本安装

1.安装choco Windows安装 choco包管理工具-CSDN博客 2.通过choco安装 下面例子为安装旧版2.3.0.2,其它版本类似 Chocolatey Software | Docker Desktop 2.3.0.2 https://download.docker.com/win/stable/45183/Docker%20Desktop%20Installer.exe choco install docker-des…...

Ubuntu系统成功安装Docker教程

服务器版本&#xff1a; Ubuntu 22.04.3 LTS 1. 卸载旧版本 Docker 的旧版本被称为 docker&#xff0c;docker.io 或 docker-engine 。如果已安装&#xff0c;需要卸载&#xff1a; sudo apt-get remove docker docker-engine docker.io containerd runc2. 更新 apt 软件包 …...

C++ 匹配并提取包括加中括号的日期时间的正则表达式

在C中&#xff0c;你可以使用std::regex库来匹配包含日期和时间的字符串。以下是一个简单的例子&#xff0c;它展示了如何使用正则表达式来匹配形如[YYYY-MM-DD HH:MM:SS]的字符串。include <iostream> #include <string> #include <regex> int main() { …...

一文-深入了解Ansible常见模块、安装和部署

1 Ansible 介绍 Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的&#xff08;集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点&#xff09;自动化运维工具, 其功能实现基于ss…...

etcd的备份与恢复

一 为什么使用etcd 与ZooKeeper相比&#xff0c;etcd更简单&#xff0c;安装、部署和使用更加容易&#xff0c;并且etcd的某些功能是ZooKeeper所没有的。因此&#xff0c;在很多场景下&#xff0c;etcd 比ZooKeeper更受用户的青&#xff0c;具体表现在如下几个方面: 1 etcd更…...

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

我在2021年底开始使用Polars和DuckDB。我立刻意识到这些库很快就会成为数据科学生态系统的核心。自那时起&#xff0c;这些库的受欢迎程度呈指数级增长。 在这篇文章中&#xff0c;我做出了一些关于未来几年数据科学领域的发展方向和原因的预测。 这篇文章旨在检验我的预测能力…...

【postgresql】pg_dump备份数据库

pg_dump 介绍 pg_dump 是一个用于备份 PostgreSQL 数据库的实用工具。它可以将数据库的内容导出为一个 SQL 脚本文件或其他格式的文件&#xff0c;以便在需要时进行恢复或迁移。 基本用法 pg_dump [选项] [数据库名] 命令选项 -h 或 --host&#xff1a;指定数据库服务器的主…...

服务器的80和443端口关闭也能申请SSL证书

一、简介 在服务器的80和443端口关闭的情况下&#xff0c;确实可以申请SSL证书&#xff0c;但申请过程和方法会根据证书类型和验证方式的不同而有所差异。 通常如果是网站域名申请SSL证书&#xff0c;哪怕服务器的80、443端口都打不开&#xff0c;也可以通过DNS解析的方式来验…...

Odoo17应用、模型、字段

新建最简应用 先启用开发人员模式。 新建一个没有菜单项的空壳应用(模块/插件)&#xff1a; 必须至少包含 2 个文件&#xff1a; __manifest__.py 文件和文件 __init__.py 。 该 __init__.py 文件目前可以保持为空&#xff0c;我们将在下一章中返回。另一方面&#xff0c;该…...

Airtest的控制手机滑动位置偏差修正方法总结

提起Airtest的控制手机滑动位置&#xff0c;就会想起swipe&#xff0c;因为这种方法比较常见&#xff0c;对于没有精度控制的朋友完全够用&#xff0c; 我现在遇到精度控制时&#xff0c;大家都觉得精度不够&#xff0c;现在我对滑动精度控制&#xff0c;找到比较好的方法&…...

【机器学习】Grid Search: 一种系统性的超参数优化方法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Grid Search: 一种系统性的超参数优化方法引言什么是Grid Search&#xff1f;Gr…...

Laravel Passport:API认证的瑞士军刀

Laravel Passport&#xff1a;API认证的瑞士军刀 在现代Web应用中&#xff0c;API的安全认证是一个核心问题。Laravel Passport提供了一个全面的解决方案&#xff0c;用于构建OAuth2.0认证服务器。它使得API的认证变得简单而强大&#xff0c;支持多种认证方式&#xff0c;包括…...

SpringBoot Bean管理

我们知道可以通过Spring当中提供的注解Component以及它的三个衍生注解&#xff08;Controller、Service、Repository&#xff09;来声明IOC容器中的bean对象&#xff0c;同时我们也学习了如何为应用程序注入运行时所需要依赖的bean对象&#xff0c;也就是依赖注入DI。 本篇主要…...

Qt5.12.2安装教程

文章目录 文章介绍下载连接安装教程 文章介绍 安装Qt5.12.2 下载连接 点击官网下载 安装包下载完毕 安装教程 点开设置&#xff0c;添加临时储存库&#xff0c;复制连接“https://download.qt.io/online/qtsdkrepository/windows_x86/root/qt/” 点击测试&#xff0…...

2024年大数据高频面试题(中篇)

文章目录 Kafka为什么要用消息队列为什么选择了kafkakafka的组件与作用(架构)kafka为什么要分区Kafka生产者分区策略kafka的数据可靠性怎么保证ack应答机制(可问:造成数据重复和丢失的相关问题)副本数据同步策略ISRkafka的副本机制kafka的消费分区分配策略Range分区分配策略…...

Python编程工具PyCharm和Jupyter Notebook的使用差异

在编写Python程序时需要用到相应的编程工具&#xff0c;PyCharm和Jupyter Notebook是最常用2款软件。 PyCharm是很强大的综合编程软件&#xff0c;代码提示、代码自动补全、语法检验、文本彩色显示等对于新手来说实在太方便了&#xff0c;但在做数据分析时发现不太方便&#xf…...

顶顶通呼叫中心中间件-被叫路由、目的地绑定(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-被叫路由、目的地绑定(mod_cti基于FreeSWITCH) 1、配置分机 点击分机 -> 找到你需要设置的分机 ->呼叫路由设置为external&#xff0c;这里需要设置的分机是呼叫的并不是坐席的分机呼叫路由 2、配置拨号方案 点击拨号方案 -> 输入目的地绑定 …...

【数据集处理工具】根据COCO数据集的json标注文件实现训练与图像的文件划分

根据COCO数据集的json标注文件实现训练与图像的文件划分 一、适用场景&#xff1a;二、COCO数据集简介&#xff1a;三、场景细化&#xff1a;四、代码优势&#xff1a;五、代码 一、适用场景&#xff1a; 适用于一个常见的计算机视觉项目应用场景&#xff0c;特别是当涉及到使…...

vue 如何做一个动态的 BreadCrumb 组件,el-breadcrumb ElementUI

vue 如何做一个动态的 BreadCrumb 组件 el-breadcrumb ElementUI 一、ElementUI 中的 BreadCrumb 定义 elementUI 中的 Breadcrumb 组件是这样定义的 <template><el-breadcrumb separator"/"><el-breadcrumb-item :to"{ path: / }">主…...

FFmpeg播放视频

VS2017+FFmpeg6.2.r113110+SDL2.30.5 1.下载 ShiftMediaProject/FFmpeg 2.下载SDL2 3.新建VC++控制台应用 3.配置include和lib 4.把FFmpeg和SDL的dll 复制到工程Debug目录下,并设置调试命令...

重叠区间的求和

#摘抄 GetGeneLength/src/GetGeneLength/GetGeneLength.py at main PoShine/GetGeneLength GitHub def main(): """ Extract gene length based on featureCount calculation gene nonredundant exon length method. """ # 引…...

java包装类 及其缓存

Java 包装类&#xff08;Wrapper Class&#xff09;是将基本数据类型转换为对象的方式&#xff0c;每个基本数据类型在 java.lang 包中都有一个相应的包装类&#xff1a; Boolean 对应基本类型 boolean Character 对应基本类型 char Integer 对应基本类型 int Float 对应基本…...

大龄程序员的出路在哪里?

对于许多资深程序员而言&#xff0c;年龄并非职业发展的桎梏&#xff0c;反而如同陈年的美酒&#xff0c;随着时间的流逝愈发醇厚。他们手握的是丰富的经验和不断进阶的技能&#xff0c;而这些都为他们打开了职业发展的无数扇大门。让我们一同探索这些令人心动的可能性吧&#…...

Unity不用脚本实现点击按钮让另外一个物体隐藏

1.首先在场景中创建一个按钮和一个其他随便什么东西 2.点击按钮中的这个加号 3.然后将刚刚你创建的物体拖到这里来 4.然后依次点击下面这些给按钮绑定事件 5.运行游戏并点击按钮&#xff0c;就会发现拖进来的物体消失了 总结&#xff1a;如果按钮的功能单一&#xff0c;可以使用…...

RAG技术-为自然语言处理注入新动力

引言&#xff1a; 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术以其独特的方式&#xff0c;正在改变我们与机器的交互方式。RAG技术结合了大语言模型的强大能力&#xff0c;使得机器在理解和…...

Docker安装ELK(简易版)

1、下载ELK镜像&#xff1a;打开终端&#xff0c;并执行以下命令以下载Elasticsearch、Logstash和Kibana的Docker镜像。您也可以根据需要选择其他版本&#xff1a; docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.6 docker pull docker.elastic.co/logstash…...

WPF项目实战视频《一》(主要为WPF基础知识)

1.WPF布局&#xff1a; Grid&#xff0c;stackPanel&#xff0c;wrapPanel&#xff0c;DockPanel&#xff0c;UniformGrid Grid 按行列布局&#xff0c; Grid.ColumnDefinitions列&#xff0c;Grid.RowDefinitions行 Grid.Row“0” Grid.Column“0” stackPanel 默认从上往下排…...