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

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关键字,表示该变量是一个常成员数据。在构造函数初始化列表中对常成员数据进行初始化。

常成员数据的特点如下:

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

相关文章:

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

目录 一、对象数组 二、对象指针 三、this 指针 四、类类型作为参数类型的三种形式 4.1 对象本身作为参数 4.2 对象指针作为参数 4.3 对象引用作为参数 五、静态成员 5.1 静态数据成员 5.2 静态成员函数 六、友元机制 6.1 友元函数 6.2 友元类 七、类的组合 八、…...

3d选择模型后不能旋转什么原因?怎么解决?---模大狮模型网

在3D建模和渲染的过程中&#xff0c;旋转模型是常见的操作。然而&#xff0c;有时在选择了模型后&#xff0c;却发现无法进行旋转&#xff0c;这可能会让许多用户感到困扰。本文将探讨3D选择模型后不能旋转的可能原因&#xff0c;并提供相应的解决方法。 一、3D选择模型后不能旋…...

从入门到精通:详解Linux环境基础开发工具的使用

前言 在这篇文章中&#xff0c;我将深入学习和理解Linux环境基础开发工具的使用。无论你是初学者还是有一定经验的开发者&#xff0c;相信这篇文章都会对你有所帮助。我们将详细讲解软件包管理器、编辑器、编译器、调试器、自动化构建工具以及版本控制工具的使用。 Linux软件…...

linux(centos 7)安装 node

linux&#xff08;centos 7&#xff09;安装 node 下载对应版本&安装解压配置环境变量使配置文件生效验证是否安装成功附加 目前node最新版本是 node-v22.0.0 官网下载地址&#xff1a;https://registry.npmmirror.com/binary.html?pathnode/latest-v22.x/node-v22.0.0-li…...

C++之第九课

课程列表 今天&#xff0c;我们要学习一种结构&#xff1a;循环结构。 循环的方法有3种。 今天先将第1种for学了&#xff1a; int a;//循环变量 int b; for(a1;a<10;a){//像if那样“打包”cout<<a<<" ";b; } 当然&#xff0c;也可以这样写&#…...

618精选编程书单推荐:优质知识提升你的代码力

前言 在这个快速发展的技术时代&#xff0c;不断学习和提升自己的编程技能是每位程序员的必修课。今天&#xff0c;我为大家精心挑选了一系列编程技术书籍&#xff0c;它们将是你技术成长道路上的宝贵财富。 文章目录 前言编程之路&#xff1a;为何阅读书籍是不可或缺的书籍的…...

使用httpx异步获取高校招生信息:一步到位的代理配置教程

概述 随着2024年中国高考的临近&#xff0c;考生和家长对高校招生信息的需求日益增加。了解各高校的专业、课程设置和录取标准对于高考志愿填报至关重要。通过爬虫技术&#xff0c;可以高效地从各高校官网获取这些关键信息。然而&#xff0c;面对大量的请求和反爬机制的挑战&a…...

使用Java Stream API的map方法将包含Long类型ID的流转换为String数组

在这个例子中&#xff0c;idList是一个包含Long类型ID的列表。我们使用stream()方法创建一个流&#xff0c;然后应用map(String::valueOf)方法将Long类型的ID转换为String类型。最后&#xff0c;我们使用toArray(String[]::new)方法将流中的元素收集到一个新的String[]数组中。…...

centos 安装nginx 并配置https ssl

进入你要安装的目录 一般是/usr/local/ wget https://nginx.org/download/nginx-1.24.0.tar.gz解压安装包&#xff1a;使用以下命令解压下载的Nginx安装包&#xff1a; tar -zxvf nginx-1.24.0.tar.gz在编译和安装Nginx之前&#xff0c;确保您的系统上已安装了必要的编译工具和…...

Jenkins 自动化部署

Post Steps部分 Exec cmmand cd /data/build/test-admin/ rm -f app.jar rm -f Dockerfile cp target/app.jar ./ cp docker/Dockerfile ./docker build -t test-admin . docker tag test-admin 192.168.1.100/test/test-admin:1.2-SNAPSHOT docker push 192.168.1.100/test/…...

VUE3好看的酒网站模板源码

文章目录 1.设计来源1.1 首页界面1.2 十大名酒界面1.3 名酒新闻界面1.4 联系我们界面1.5 在线留言界面 2.效果和结构2.1 动态效果2.2 代码结构 3.VUE框架系列源码4.源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/detai…...

索引压缩技术详解

在现代搜索引擎和信息检索系统中&#xff0c;索引压缩技术是提高存储效率和检索速度的关键手段。本文将深入探讨几种常见的索引压缩技术&#xff0c;包括词典压缩、倒排列表压缩算法、文档编号重排序以及静态索引裁剪。 词典压缩 1.1 基础概念 词典&#xff08;Dictionary&am…...

完全匹配企业需求的替代FTP升级软件怎么找

企业在处理数据传输时&#xff0c;效率和安全性是关键。尽管传统的FTP曾被广泛采用&#xff0c;但因其传输慢、安全性不足和难以管理等问题&#xff0c;已不再满足现代企业的需求。许多企业正在寻找能够满足其需求的FTP替代方案&#xff0c;但市场上选择众多&#xff0c;找到合…...

动态规划:分割等和子集

参考资料&#xff1a;代码随想录 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 这道题是01背包问题的抽象&#xff0c;这道题的难点在于怎么绕明白遍历顺序是从后往前。 题目中给的nums数组&#xff0c;以nums[1,5,11,5]为例&#xff0c;可以分析为有4个物…...

踩坑——纪实

开发踩坑纪实 1 npm安装1.1 查看当前的npm镜像设置1.2 清空缓存1.3 修改镜像1.4 查看修改结果1.5 重新安装vue 2 VScode——NPM脚本窗口找不到3 springboot项目中updateById()失效4 前端跨域4.1 后端加个配置类4.2 CrossOrigin注解 5 路由出口6 springdoc openapi3 swagger3文件…...

java实现websocket的五种方式(mark下)

java实现websocket的五种方式 java 实现 websocket的五种方式_java_萧曵 丶-GitCode 开源社区...

网络安全技术心得体会

网络与信息安全技术心得体会 通过对网络安全这门课程的学习&#xff0c;我进一步了解了网络安全技术的相关知识。大致来说&#xff0c;所谓网络安全指的是对网络系统中各类软硬件和数据信息等提供保护屏障&#xff0c;确保数据信息不受到恶意侵入、窃取等破坏&#xff0c;保证…...

光耦合器的特性和应用概述

光耦合器又称光电耦合器&#xff0c;是现代电子学中必不可少的元件&#xff0c;确保隔离电路之间安全有效的信号传输。本文探讨了光耦合器的特性及其多样化应用&#xff0c;强调了它们在各种电子系统中的关键作用。 什么是光耦合器&#xff1f; 光耦合器是一种设计用于利用光传…...

工作干到抑郁了,要不要辞职?

在知乎上看到以为网友提问&#xff1a;工作干到抑郁&#xff0c;该不该辞职&#xff1f; 今天和大家聊聊这个话题&#xff0c;如果你也有类似的情况&#xff0c;希望这篇文章能帮到你。 熟悉瑶琴的朋友&#xff0c;都知道瑶琴在去年有一次裸辞的经历。离职前&#xff0c;严重的…...

Vs Code插件位置:

Vs Code插件位置&#xff1a; C:\Users\dell.vscode\extensions...

521源码-免费源码-子比主题最新版7.6绕授权破解完整教程

首先&#xff0c;zibll主题授权是向api.zibll.com发送请求&#xff0c;api.zibll.com就验证这个请求&#xff0c;如果参数(比如header)正确那么授权成功&#xff0c;然而众所周知&#xff0c;服务器可以修改本地host文件&#xff0c;来实现某些特定功能&#xff0c;把host文件加…...

前端基础入门三大核心之HTML篇:Webpack、Vite、Grunt、Gulp的场景与实战运用

前端基础入门三大核心之HTML篇&#xff1a;Webpack、Vite、Grunt、Gulp的场景与实战运用 一、Webpack&#xff1a;模块打包与优化的集大成者基本概念与作用应用场景实战例 二、Vite&#xff1a;快速开发的现代化构建利器基本概念应用场景实战例 三、Gulp&#xff1a;任务自动化…...

java面试框架篇(Spring常见问题、SpringBoot、SpringMVC、mybatis经典问题、SpringCloud组件)

文章目录 面试专题-java框架篇1. spring常见问题1.1. spring是什么?1.2. 谈谈你对AOP的理解1.3. 谈谈你对IOC的理解1.4. Spring Boot、 Spring MVC和Spring有什么区别1.5. spring bean 生命周期1.6. spring事务传播机制有哪些?1.7. 循环依赖1.8. spring框架中使用了哪些设计模…...

HarmonyOS之ArkUI布局设计常见细节

这里写目录标题 1. Button设置带有渐变色的背景图片无效1.1 问题分析1.2 成功案例 2. 路由跳转失败2.1 问题分析 1. Button设置带有渐变色的背景图片无效 1.1 问题分析 说明&#xff1a;设置颜色渐变需先设置backgroundColor为透明色。 Button($r(app.string.login), { type…...

元宇宙虚拟线上会议,可应用于哪些行业和领域?

随着科技的飞速进步和互联网的广泛普及&#xff0c;线上元宇宙会议以其独特的魅力和优势&#xff0c;逐渐崭露头角&#xff0c;积木易搭旗下的元宇宙数字营销平台——视创云展&#xff0c;为线上元宇宙会议提供了全方位的服务&#xff0c;不仅涵盖了场景搭建、数字人互动、在线…...

【C++刷题】优选算法——递归第二辑

全排列 vector<vector<int>> vv; void dfs(vector<int>& nums, vector<int>& v, vector<bool>& check) {if(v.size() nums.size()){vv.push_back(v);return;}for(int i 0; i < nums.size(); i){if(check[i] false){v.push_ba…...

【GO基础】1. Go语言环境搭建

Go语言环境搭建 Go的三种安装方式Go标准包安装Windows 安装验证是否安装成功 4.Go的第一个程序 Hello World.go Go的三种安装方式 Go有多种安装方式&#xff0c;可以选择自己适合的。这里介绍三种最常见的安装方式&#xff1a; Go源码安装&#xff1a;这是一种标准的软件安装…...

Py之llama-parse:llama-parse(高效解析和表示文件)的简介、安装和使用方法、案例应用之详细攻略

Py之llama-parse&#xff1a;llama-parse(高效解析和表示文件)的简介、安装和使用方法、案例应用之详细攻略 目录 llama-parse的简介 llama-parse的安装和使用方法 1、安装 2、使用方法 第一步&#xff0c;获取API 密钥 第二步&#xff0c;安装LlamaIndex、LlamaParse L…...

Python库之Scrapy的高级用法深度解析

Python库之Scrapy的高级用法深度解析 引言 Scrapy是一个强大的Web爬虫框架&#xff0c;它提供了丰富的功能和灵活的扩展性&#xff0c;使得在Python中编写爬虫变得简单而高效。本文将深入探讨Scrapy的高级用法&#xff0c;帮助读者充分利用Scrapy的强大功能。 目录 引言Scr…...

Rust Tarui 中的 Scrcpy 客户端,旨在提供控制安卓设备的鼠标和按键映射,类似于游戏模拟器。

Scrcpy-mask 为了实现电脑控制安卓设备&#xff0c;本人使用 Tarui Vue 3 Rust 开发了一款跨平台桌面客户端。该客户端能够提供可视化的鼠标和键盘按键映射配置。通过按键映射实现了实现类似安卓模拟器的多点触控操作&#xff0c;具有毫秒级响应速度。该工具可广泛用于电脑控…...