C++语言学习(六)—— 类与对象(二)

目录

一、对象数组

二、对象指针

三、this 指针

四、类类型作为参数类型的三种形式

4.1 对象本身作为参数

4.2 对象指针作为参数

4.3 对象引用作为参数

五、静态成员

5.1 静态数据成员

5.2 静态成员函数

六、友元机制

6.1 友元函数

6.2 友元类

七、类的组合

八、数据成员的初始化和释放顺序

九、常对象与常成员

9.1 常对象

9.2 常成员

9.2.1 常成员函数

9.2.2 常成员数据


一、对象数组

在C++中,可以使用对象数组来存储和操作一组相关的对象。下面是一个示例:

class Student {
private:std::string name;int age;std::string gender;public:// 构造函数Student(std::string n, int a, std::string g) {name = n;age = a;gender = g;}// Getter 和 Setter 方法std::string getName() {return name;}void setName(std::string n) {name = n;}int getAge() {return age;}void setAge(int a) {age = a;}std::string getGender() {return gender;}void setGender(std::string g) {gender = g;}
};int main() {// 声明一个存储 Student 对象的数组Student students[10];// 初始化数组中的每个对象students[0] = Student("张三", 18, "男");students[1] = Student("李四", 19, "女");// ...// 访问对象数组中的元素std::cout << "第一个学生的姓名是:" << students[0].getName() << std::endl;std::cout << "第二个学生的年龄是:" << students[1].getAge() << std::endl;// 修改对象数组中的元素students[0].setName("王五");students[1].setAge(20);return 0;
}

在上面的示例中,Student 是一个自定义的类,有姓名、年龄和性别等属性。然后在main函数中声明了一个名为students对象数组,用来存储多个学生对象。可以通过索引访问和操作每个学生对象。最后,通过对象数组可以方便地对一组学生对象进行管理和操作。

二、对象指针

对象指针是指指向对象的指针变量。在C++中,可以通过使用对象指针来操作对象的成员和调用成员函数。

通过对象指针可以访问对象的成员,使用 ->运算符可以在指针上调用成员函数和访问成员变量。例如,studentPtr->getName()会调用Student对象的getName()函数。

下面是一个示例:

class Student {
private:std::string name;int age;std::string gender;public:// 构造函数Student(std::string n, int a, std::string g) {name = n;age = a;gender = g;}// Getter 和 Setter 方法std::string getName() {return name;}void setName(std::string n) {name = n;}int getAge() {return age;}void setAge(int a) {age = a;}std::string getGender() {return gender;}void setGender(std::string g) {gender = g;}
};int main() {// 声明一个指向 Student 对象的指针Student* studentPtr;// 创建一个 Student 对象,并将指针指向该对象Student student("张三", 18, "男");studentPtr = &student;// 通过指针访问对象的成员std::cout << "学生的姓名是:" << studentPtr->getName() << std::endl;std::cout << "学生的年龄是:" << studentPtr->getAge() << std::endl;// 通过指针调用对象的成员函数studentPtr->setName("王五");studentPtr->setAge(20);return 0;
}

在上面的示例中,Student是一个自定义的类,有姓名、年龄和性别等属性。然后在main函数中声明了一个名为studentPtr指针变量,用来指向Student对象。通过使用 &操作符,我们将指针studentPtr指向了一个实际的Student对象 student

注意:

  • 当使用对象指针时,必须确保指针指向的对象是有效的(未被销毁)。否则,在使用指针访问成员时可能会导致程序崩溃或未定义行为。

三、this 指针

this指针是一个指向当前对象的指针,它可以在类的成员函数中使用。在C++中,每个非静态成员函数都有一个隐含的this指针,它指向调用该函数的对象。通过this指针,可以在成员函数中访问和操作对象的成员变量和成员函数。

下面是一个示例:

class MyClass {
private:int value;public:// 构造函数MyClass(int v) {value = v;}// 成员函数void printValue() {std::cout << "对象的值是:" << value << std::endl;}void setValue(int v) {this->value = v;}void printAddress() {std::cout << "对象的地址是:" << this << std::endl;}
};int main() {MyClass obj(10);obj.printValue();obj.setValue(20);obj.printValue();obj.printAddress();return 0;
}

在上面的示例中,MyClass是一个包含一个私有成员变量value和一些成员函数的类。在printValue函数中,我们使用this指针来访问对象的成员变量value并打印出来。在setValue函数中,我们使用this指针来设置对象的成员变量value的值。

this指针还可以用于获取对象的地址,如printAddress函数所示。通过打印this指针,我们可以看到它指向的是创建的对象的地址。

注意:

  • this指针是一个常量指针,不能被修改和赋值。所以不能将this指针作为参数传递给其他函数或赋值给其他指针变量。它只能被用于访问当前对象的成员。

四、类类型作为参数类型的三种形式

4.1 对象本身作为参数

在C++中,可以将一个类类型的对象本身作为参数传递给函数。这意味着函数可以直接操作和修改对象的成员变量和成员函数。

示例如下:

#include <iostream>class MyClass {
public:int x;MyClass(int a) {x = a;}void func() {std::cout << "x的值为: " << x << std::endl;}
};void modifyObject(MyClass obj) {obj.x = 10;
}int main() {MyClass obj(5);obj.func(); // 输出: x的值为: 5modifyObject(obj);obj.func(); // 输出: x的值为: 5(对象本身不会被修改)return 0;
}

在上面的示例中,我们定义了一个名为MyClass的类,它包含一个整型成员变量和一个成员函数func()。然后,我们定义了一个函数modifyObject(),它接受一个MyClass对象作为参数。在modifyObject()函数中,我们试图修改传递进来的对象的 x成员变量的值,但实际上,这个修改只在modifyObject()函数内部生效,并不会影响到调用函数时传递的原始对象。所以,在主函数main()中,我们调用modifyObject(obj)后,再次输出obj.x的值时,它的值仍然是调用前的原始值。

注意:

  • 当将一个对象作为参数传递给函数时,C++会调用对象的拷贝构造函数来创建一个新的对象。这意味着函数内部对该对象的修改不会影响到原始对象。如果希望在函数内部修改原始对象的值,可以将对象作为引用或指针来传递。

4.2 对象指针作为参数

在C++中,我们可以将对象指针作为函数的参数来传递对象。使用对象指针作为参数可以使函数对对象进行原地修改,而不必复制对象或返回新对象。

下面是一个简单的示例,展示了如何将对象指针作为参数传递:

#include <iostream>class MyClass {
public:int num;void printNum() {std::cout << "The number is: " << num << std::endl;}
};// 接受对象指针作为参数的函数
void updateNum(MyClass* obj, int newNum) {obj->num = newNum;
}int main() {MyClass obj;obj.num = 10;obj.printNum();  // 输出: The number is: 10updateNum(&obj, 20);obj.printNum();  // 输出: The number is: 20return 0;
}

在上面的示例中,我们定义了一个MyClass类,它包含一个整数成员变量num 和一个打印成员变量的函数printNum()。我们还定义了一个名为updateNum()的函数,它接受一个MyClass对象指针和一个新的整数值,并将对象的num变量更新为新值。

main()函数中,我们创建一个MyClass对象obj,并将其变量设置为10。我们调用updateNum()函数,将obj的指针和新值20作为参数传递。这样,updateNum()函数就可以直接操作objnum变量,并将其值更新为20。最后,我们再次调用printNum()函数来验证num变量是否已经更新为20。

注意:

  • 在使用对象指针时要确保对象是有效的,并在不再需要时及时释放内存。

4.3 对象引用作为参数

在C++中,我们可以将对象引用作为函数的参数来传递对象使用对象引用作为参数可以使函数对对象进行原地修改,而不必复制对象或返回新对象。与对象指针相比,不需要使用额外的操作符来访问成员变量。同时,对象引用也自动处理了对象是否为有效的情况,因此不需要在使用之前进行额外的检查。

下面是一个简单的示例,展示了如何将对象引用作为参数传递:

#include <iostream>class MyClass {
public:int num;void printNum() {std::cout << "The number is: " << num << std::endl;}
};// 接受对象引用作为参数的函数
void updateNum(MyClass& obj, int newNum) {obj.num = newNum;
}int main() {MyClass obj;obj.num = 10;obj.printNum();  // 输出: The number is: 10updateNum(obj, 20);obj.printNum();  // 输出: The number is: 20return 0;
}

在上面的示例中,我们定义了一个MyClass类,它包含一个整数成员变量num和一个打印成员变量的函数printNum()。我们还定义了一个名为updateNum()的函数,它接受一个MyClass对象引用和一个新的整数值,并将对象的num变量更新为新值。

main()函数中,我们创建一个MyClass对象obj,并将其num变量设置为10。然后,我们调用updateNum()函数,将obj和新值20作为参数传递。这样,updateNum()函数就可以直接操作objnum变量,并将其值更新为20。最后,我们再次调用printNum()函数来验证num变量是否已经更新为20。

注意:

  • 一旦对象引用作为参数传递给函数,函数内部对对象的修改将会影响到原始对象。因此,在使用对象引用作为函数参数时,要格外小心,确保不会意外修改对象的状态。

五、静态成员

静态成员是类的成员,而不是对象的成员。它们与类相关联,而不是与特定的对象相关联。静态成员在类的所有对象之间共享,并且可以通过类名来访问,而不需要创建类的实例。

静态成员可以是静态数据成员或静态成员函数。静态数据成员在类中只有一个实例,并且可以在所有对象之间共享。静态成员函数不依赖于任何特定对象的实例,可以直接通过类名来调用。

5.1 静态数据成员

在C++中,静态数据成员是类的特殊成员,它被该类的所有对象所共享,而不是每个对象独立拥有。静态数据成员的值在类的所有对象中是相同的。

静态数据成员具有以下特点:

  1. 静态数据成员属于整个类,而不是类的某个具体对象。它在内存中只有一份拷贝,而不是每个对象都有一份。
  2. 静态数据成员可以在类的内部声明,在类的外部进行定义和初始化。在定义时,需要在成员名称前加上static关键字,同时需要在类的外部进行变量的定义和初始化。
  3. 静态数据成员的作用域限定在所属的类内部,可以通过类名和作用域解析操作符::来直接访问。
  4. 静态数据成员可以在类的对象之间共享数据,可以用于在对象之间传递共享的数据。

以下是一个示例:

class MyClass {
public:static int myStaticVar;  // 静态数据成员的声明static int getStaticVar() {  // 静态成员函数可以直接访问静态数据成员return myStaticVar;}
};int MyClass::myStaticVar = 0;  // 静态数据成员的定义和初始化int main() {MyClass obj1;MyClass obj2;obj1.myStaticVar = 5;cout << obj1.myStaticVar << endl;  // 输出 5cout << obj2.myStaticVar << endl;  // 输出 5,静态数据成员在所有对象中共享cout << MyClass::myStaticVar << endl;  // 通过类名访问静态数据成员return 0;
}

在以上示例中,myStaticVar是一个静态成员变量,通过类名来访问。通过对象obj1obj2来访问myStaticVar,它们都共享相同的值。静态成员函数getStaticVar()可以直接访问静态数据成员。

5.2 静态成员函数

在C++中,静态成员函数是属于整个类的,而不是类的某个对象,它不依赖于特定的对象实例。静态成员函数可以直接通过类名来调用,而不需要创建对象。

静态成员函数具有以下特点:

  1. 静态成员函数没有this指针,因此不能直接访问非静态成员变量和非静态成员函数。它只能访问静态成员变量和静态成员函数。
  2. 静态成员函数可以在类的内部声明,在类的外部进行定义。
  3. 静态成员函数的调用方式是通过类名和作用域解析操作符::来调用。

以下是一个示例:

class MyClass {
public:static int myStaticVar;  // 静态数据成员的声明static int getStaticVar() {  // 静态成员函数的定义return myStaticVar;}static void setStaticVar(int value) {myStaticVar = value;}
};int MyClass::myStaticVar = 0;  // 静态数据成员的定义和初始化int main() {MyClass::setStaticVar(5);  // 通过类名调用静态成员函数cout << MyClass::getStaticVar() << endl;  // 通过类名调用静态成员函数return 0;
}

在以上示例中,getStaticVar()setStaticVar()都是静态成员函数,可以直接通过类名来调用。静态成员函数可以用于访问和操作静态数据成员,而不依赖于具体的对象实例。

六、友元机制

友元机制是C++中一种特殊的访问权限控制机制,它允许一个类或函数访问另一个类的私有成员。

在C++中,可以使用friend关键字将一个函数或类声明为友元。被声明为友元的函数或类可以直接访问其它类的私有和保护成员,而不受访问权限的限制。

6.1 友元函数

友元函数是指被声明为某个类的友元的函数,可以访问该类的私有成员和保护成员。通过友元函数,可以实现一些与该类有关的操作,即使这些操作不属于该类的成员函数。

以下是一个友元函数的示例:

class MyClass {
private:int privateData;public:MyClass(int data) : privateData(data) {}friend int friendFunction(MyClass& obj);
};int friendFunction(MyClass& obj) {// 友元函数可以访问私有成员return obj.privateData;
}int main() {MyClass myObj(5);int data = friendFunction(myObj);cout << "Private data: " << data << endl;return 0;
}

在上述示例中,MyClass类声明了一个友元函数friendFunction(),并将其声明为友元。friendFunction()函数可以访问MyClass私有成员privateData

main()函数中,我们创建了一个MyClass对象myObj,并将其初始化为5。然后调用friendFunction()函数,该函数访问了myObj的私有成员privateData并返回它。最后,我们将返回的私有数据打印到控制台上。

通过友元函数,我们可以方便地访问类的私有成员,但同样需要谨慎使用,以保护数据的封装性。

6.2 友元类

友元类是指一个类被声明为另一个类的友元,可以访问该类的私有成员和保护成员。这样,友元类可以在其成员函数中访问被友元类的私有成员。

以下是一个友元类的示例:

class FriendClass {
private:int privateData;public:FriendClass(int data) : privateData(data) {}friend class MyClass;
};class MyClass {
public:void accessPrivateData(FriendClass& obj) {// 友元类可以访问私有成员int data = obj.privateData;cout << "Private data: " << data << endl;}
};int main() {FriendClass friendObj(5);MyClass myObj;myObj.accessPrivateData(friendObj);return 0;
}

在上述示例中,FriendClass类被声明为MyClass类的友元类。因此,在MyClass类中的成员函数accessPrivateData()中,可以访问FriendClass类的私有成员privateData

main()函数中,我们创建了一个FriendClass对象friendObj,并将其初始化为5。然后,我们创建了一个MyClass对象myObj,并调用其成员函数accessPrivateData(),将friendObj作为参数传递给它。accessPrivateData()函数可以访问friendObj的私有成员privateData,并将其打印到控制台上。

通过友元类,类之间的访问限制可以得到打破,但同样需要谨慎使用,以保护数据的封装性。

七、类的组合

在C++中,类的组合是指一个类包含另一个类的对象作为其成员。通过组合,一个类可以使用另一个类的功能,并将其封装在自己的实现中。

组合是一种常用的实现方式,它允许类之间建立关联关系,并共享彼此的功能。通过组合,我们可以构建更加复杂和灵活的类结构。

下面是一个示例,展示了如何在C++中使用类的组合:

// 定义一个矩形类
class Rectangle {
private:int width;int height;public:Rectangle(int w, int h) {width = w;height = h;}int calculateArea() {return width * height;}
};// 定义一个房间类,使用矩形类的对象作为成员
class Room {
private:Rectangle area;int numOfWindows;public:Room(int w, int h, int windows) : area(w, h) {numOfWindows = windows;}int calculateTotalArea() {return area.calculateArea() * numOfWindows;}
};int main() {// 创建一个房间对象Room myRoom(10, 12, 4);// 计算房间的总面积int totalArea = myRoom.calculateTotalArea();// 输出结果cout << "Total area of the room: " << totalArea << endl;return 0;
}

在上面的示例中,Rectangle类表示一个矩形,它有一个calculateArea方法来计算矩形的面积。Room类表示一个房间,它有一个calculateTotalArea方法来计算房间的总面积,通过将Rectangle类的对象作为成员变量area来实现矩形的组合。通过创建一个Room对象,我们可以调用其方法来计算房间的总面积。

八、数据成员的初始化和释放顺序

在C++中,类的数据成员的初始化和释放顺序是按照它们在类中的声明顺序确定的。初始化顺序是在进入构造函数的初始化列表之前确定的,而释放顺序是在析构函数中完成的;通过使用初始化列表,在构造函数中可以确保数据成员正确初始化。而在析构函数中,数据成员的释放顺序与初始化顺序相反。

下面是一个示例,展示了数据成员初始化和释放顺序的规则:

class MyClass {
private:int x;int y;int z;public:MyClass(int a, int b, int c) : x(a), y(b), z(c) {// 构造函数}~MyClass() {// 析构函数}
};

在上面的示例中,MyClass类有三个整型数据成员:xyz。在构造函数中,我们使用初始化列表来初始化这些成员变量,按照它们在类中的声明顺序:先初始化x,然后是y,最后是z。在析构函数中,成员变量的释放顺序与初始化顺序相反,先释放z,然后是y,最后是x

注意:

  • 如果一个数据成员是一个对象或者指向一个对象的指针,在构造函数中如果需要使用它,那么它必须在初始化列表中进行初始化。

九、常对象与常成员

9.1 常对象

常对象是指被声明为const的对象,即对象的值在创建后就不能被修改。

常对象的定义方法

  • 在对象声明时直接加上const关键字。
const ClassName obj; // 声明一个常对象
  • 使用类型别名或引用来声明常对象。
typedef const ClassName CObj; // 声明一个常对象的类型别名CObj
CObj obj; // 声明一个常对象

常对象的特点如下:

  1. 常对象的状态是只读的,无法通过任何途径修改其成员变量的值。
  2. 常对象只能调用其类中被声明为const的成员函数,不能调用非const成员函数。
  3. 常对象可以调用常成员函数,因为常成员函数不会修改任何成员变量的值。

常对象在实际编程中有很多用途,例如:

  • 在函数中传递常对象作为参数,以防止函数修改对象的值。
  • 在类的成员函数中,常对象可以被用作参数或返回值,以保证函数的纯粹性。
  • 常对象可以用于实现单例模式中的只读实例。

通过使用常对象,可以提高程序的安全性和可维护性,避免对象值的意外修改。

9.2 常成员

9.2.1 常成员函数

常成员函数指的是在类中声明的成员函数加上const关键字,表示该函数不会修改对象的状态。常成员函数可以被常对象调用,确保对象在调用该函数时不会被修改。

常成员函数的定义方式

class ClassName {
public:void functionName() const;
};

在函数声明后加上const关键字,表示该函数是一个常成员函数。常成员函数可以在类的内部或外部进行定义。

常成员函数的特点如下:

  • 常成员函数不能修改对象的非常量数据成员。它只能读取数据成员的值,而不能修改它们。
  • 常成员函数只能调用其他常成员函数,而不能调用非常成员函数。这是为了保证在常成员函数中不会修改对象的状态。

9.2.2 常成员数据

常成员数据指的是在类中声明的成员变量加上const关键字,表示该变量的值在对象创建后就不能被修改。常成员数据必须在类的构造函数初始化列表中进行初始化。

常成员数据的定义方式为:

class ClassName {
private:const int variableName;
public:ClassName(int value) : variableName(value) {}
};

在成员变量的类型前加上const关键字,表示该变量是一个常成员数据。在构造函数初始化列表中对常成员数据进行初始化。

常成员数据的特点如下:

  • 常成员数据的值在对象创建后就不能被修改,它们被视为对象的常量。
  • 常成员数据只能在构造函数的初始化列表中进行初始化,而不能在构造函数内部或其他成员函数中进行修改。

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

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

相关文章

【LakeHouse】Apache Iceberg + Amoro 助力网易构建云原生湖仓

Apache Iceberg Amoro 助力网易构建云原生湖仓 1.云原生湖仓背景与挑战2.Apache Iceberg 、Amoro 与云原生2.1 Apache Iceberg2.2 Amoro 简介 3.Apache Iceberg Amoro 云原生实践3.1 云上湖仓案例一3.2 云上湖仓案例二3.3 云上湖仓案例三 4.Amoro 未来发展规划 出品社区&…

【代码随想录——回溯算法二周目】

1. 组合总和 var (path []intres [][]int )func combinationSum(candidates []int, target int) [][]int {path make([]int, 0)res make([][]int, 0)dfs(candidates,target,0,0)return res }func dfs(candidates []int, target int,tempTarget int,start int) {if tempTarg…

Django-auth组件

Django-auth组件 1 表结构 我们从python manage.py migrate为我们创建的auth组件内置的表开始看 auth_user&#xff1a;用户表存储用户信息&#xff08;登录admin后台&#xff09; 里面的字段分两类&#xff1a;用户基本信息&#xff08;用户名&#xff0c;邮箱&#xff0c;密…

华为OD机试【找出通过车辆最多颜色】(java)(100分)

1、题目描述 在一个狭小的路口&#xff0c;每秒只能通过一辆车&#xff0c;假设车辆的颜色只有 3 种&#xff0c;找出 N 秒内经过的最多颜色的车辆数量。 三种颜色编号为0 &#xff0c;1 &#xff0c;2。 2、输入描述 第一行输入的是通过的车辆颜色信息[0,1,1,2] &#xff0…

嵌入式0基础开始学习 ⅠC语言(4)循环结构

0.问题引入 求0~100数据之和&#xff1a; int sum 0; sum 1234....100; 废手&#xff0c;那么有没有一种好的方法取操作呢&#xff1f; int sum 0; int i 1; sum sum i; // sum 01; …

GB28181协议中常用SDP信息的含义

u字段&#xff1a;u行应填写视音频文件的URI。该URI取值有两种方式&#xff1a;简捷方式和普通方式。简捷方式直接采用产生该历史媒体的媒体源&#xff08;如某个摄像头&#xff09;的设备ID&#xff08;应符合6.1.2的规定&#xff09;以及相关参数&#xff08;如回放类型、下载…

Three.js——二维平面、二维圆、自定义二维图形、立方体、球体、圆柱体、圆环、扭结、多面体、文字

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

在Mac电脑下怎么部署QAnything?

在Mac电脑下部署QAnything&#xff0c;可以选择使用纯Python环境进行部署&#xff0c;这种方式不依赖GPU&#xff0c;适合在Mac等笔记本电脑上运行。以下是基于QAnything的纯Python环境安装教程的步骤[18]&#xff1a; 安装要求 Python 3.10&#xff08;建议使用Anaconda3来管…

RabbitMQ-默认读、写方式介绍

1、RabbitMQ简介 rabbitmq是一个开源的消息中间件&#xff0c;主要有以下用途&#xff0c;分别是&#xff1a; 应用解耦&#xff1a;通过使用RabbitMQ&#xff0c;不同的应用程序之间可以通过消息进行通信&#xff0c;从而降低应用程序之间的直接依赖性&#xff0c;提高系统的…

功率电感的设计步骤

文章目录 1&#xff1a;高导磁气隙&#xff08;铁氧体&#xff09;1.1设计原理1.2 设计步骤 2 铁粉芯2.1&#xff1a;设计原理2.2&#xff1a;设计步骤 TI电感设计 学习视频原链接 截图 1 截图1 截图1 截图 2 截图2 截图2 1&#xff1a;高导磁气隙&#xff08;铁氧体&#…

基于机器学习判断面部微表情发现哪些人更容易诊有帕金森病

1. 概述 帕金森病&#xff08;Parkinson’s disease&#xff0c;PD&#xff09;是一种慢性、进展性的神经退行性疾病&#xff0c;主要影响运动系统。该病症以大脑中黑质致密部多巴胺能神经元的逐渐丧失为特征&#xff0c;导致多巴胺&#xff08;一种重要的神经递质&#xff09…

【Qt】深入探索Qt窗口与对话框:从创建到管理:QDockWidget(浮动窗口)、QDialog(对话框)

文章目录 前言&#xff1a;1. 浮动窗口2. 对话框介绍2.1. 示例&#xff1a;主窗口中&#xff0c;通过点击按钮&#xff0c;弹出一个新的对话框。2.2. 创建自定义对话框2.2.1. 纯代码的方式2.2.2. 图形化界面的方式 3. 模态对话框 和 非模态对话框4. Qt 内置对话框4.1. 消息对话…

Nginx R31 doc-12-NGINX SSL Termination 安全加密

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat nginx 系列 从零手…

Git Submodules:深入理解与应用

在大型项目或跨多个独立项目的开发中&#xff0c;代码管理往往变得复杂。Git Submodules 是 Git 提供的一个强大功能&#xff0c;允许你在一个 Git 仓库&#xff08;称为父仓库&#xff09;中嵌套另一个 Git 仓库&#xff08;称为子模块仓库&#xff09;。本文将详细介绍 Git S…

Linux/Windows下如何同时运行服务端和客户端

假设服务端和客户端程序分别为server.c和client.c注意顺序&#xff01; 先运行服务端&#xff0c;后运行客户端先结束客户端&#xff0c;后结束客户端 编译 gcc -o server server.cgcc -o server client.c运行 # 先运行服务器 ./server# 再运行客户端 ./client./表示当前目录…

Hybrid Block Storage for Efficient Cloud Volume Service——论文泛读

TOS 2023 Paper 论文阅读笔记整理 问题 传统桌面和服务器应用程序向云的迁移给底层云存储带来了高性能、高可靠性和低成本的挑战。由于这些传统应用程序的I/O模式和一致性要求&#xff0c;与采用特定编程模型和范式&#xff08;如MapReduce[22]和RDD[52]&#xff09;的云原生…

香橙派AIpro(OrangePi AIPro)开发板初测评

开发板简介 最近&#xff0c;我拿到手一款Orange Pi AI Pro 开发板&#xff0c;它是香橙派联合华为精心打造的高性能AI 开发板&#xff0c;最早发布于2023年12月&#xff0c;其搭载了昇腾AI 处理器&#xff0c;可提供8TOPS INT8 的计算能力&#xff0c;内存提供了8GB 和16GB两…

基于jeecgboot-vue3的Flowable新建流程定义(一)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、vue3版本因为流程分类是动态的&#xff0c;不再固定了&#xff0c;所以新建的时候需要选择建立哪种流程类型的流程 代码如下&#xff1a; <!-- 选择模型的流程类型对话框 -->&…

算法提高之一个简单的整数问题2

算法提高之一个简单的整数问题2 核心思想&#xff1a;线段树 懒标记&#xff1a;add存每个子节点需要加的数pushdown&#xff1a;将懒标记向下存 同时清除本行懒标记 #include <iostream>#include <cstring>#include <algorithm>using namespace std;type…

数据结构(六)图

2024年5月26日一稿(王道P220) 6.1 图的基本概念 6.1.1 图的定义 6.2 图的存储及基本操作 6.2.1邻接矩阵法 6.2.2 邻接表