类和对象---C++

类和对象目录

  • 类和对象
  • 1.封装
    • 1.1 封装的意义
    • 1.2 struct和class区别
    • 1.3 成员属性设置为私有
      • 1.3.1 联系---判断圆和点的位置关系
  • 2.对象的初始化和清理
    • 2.1 构造函数和析构函数
    • 2.2 构造函数的分类及调用
      • 2.2.1无参构造函数调用
      • 2.2.2有参构造函数调用
        • 2.2.2.1括号法
        • 2.2.2.2显式法
          • 2.2.2.2.1匿名对象测试
        • 2.2.2.3隐式转换法
    • 2.3 拷贝构造函数调用时机
      • 2.3.1初始化一个新对象
      • 2.3.2值传递的方式给函数参数传值
      • 2.3.3以值方式返回局部对象
    • 2.4 构造函数调用规则
      • 2.4.1 默认系统添加
      • 2.4.2 用户定义有参构造函数
      • 2.4.3 用户定义拷贝构造函数
    • 2.5深拷贝与浅拷贝
      • 2.5.1浅拷贝
      • 2.5.2深拷贝
    • 2.6 初始化列表
    • 2.7类对象作为类成员
    • 2.8静态成员
      • 2.8.1静态成员变量
      • 2.8.2静态成员函数

在这里插入图片描述

类和对象

C++面向对象的三大特性为:封装、继承、多态
C++认为万事万物都皆为对象,对象上有其属性和行为。

例如:

​ 人可以作为对象属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌…

​ 车也可以作为对象属性有轮胎、方向盘、车灯…,行为有载人、放音乐、放空调…

​ 具有相同性质的对象,我们可以抽象称为,例如,人属于人类,车属于车类。

注:类中的属性和行为,统一称为成员:
属性:又叫成员属性、成员变量;
行为:又叫成员函数、成员方法。

1.封装

1.1 封装的意义

封装是C++面向对象三大特性之一。

封装的意义:

  • 属性和行为作为一个整体,表现生活中的事物;
  • 将属性和行为加以权限控制

封装意义一:

​ 在设计类的时候,属性和行为写在一起,表现事物。

语法: class 类名{ 访问权限: 属性 / 行为 };

**示例1:**设计一个学生类,属性有姓名和学号;可以给姓名和学号赋值,可以显示学生的姓名和学号

示例代码:


class Student
{
public:  //公共权限:类内类外均可访问//属性string s_name;string s_card;//行为void assign_name(string name){s_name = name;}void assign_card(string card){s_card = card;}void print_value(){cout << "请输入学生姓名:" << s_name << endl;cout << "请输入学生学号:" << s_card<< endl;}
};int main()
{//实例化对象Student stu;stu.assign_name("lisi");stu.assign_card("123456");stu.print_value();system("pause");return 0;
}

在这里插入图片描述
封装意义二:

类在设计时,可以把属性和行为放在不同的权限下,加以控制。

访问权限有三种:

  1. public 公共权限 :类内可以访问 类外可以访问
  2. protected 保护权限 :类内可以访问 类外不可以访问(例如:儿子可以访问到父亲中的保护内容)
  3. private 私有权限 :类内可以访问 类外不可以访问(例如:儿子不可以访问到父亲中的私有内容)

示例:

class Person
{//姓名  公共权限
public:string m_Name;//汽车  保护权限
protected:string m_Car;//银行卡密码  私有权限
private:int m_Password;public:
//赋值函数,公共权限void func(){m_Name = "张三";m_Car = "法拉利";m_Password = 123456;}
};int main() {Person p;p.m_Name = "李四";//只可以访问到公共权限的内容//p.m_Car = "奔驰";  //保护权限类外访问不到//p.m_Password = 456789; //私有权限类外访问不到system("pause");return 0;
}

1.2 struct和class区别

在C++中 struct和class唯一的区别就在于 默认的访问权限不同

区别:

  • struct 默认权限为公共
  • class 默认权限为私有

1.3 成员属性设置为私有

**优点1:**将所有成员属性设置为私有,可以自己控制读写权限;
**优点2:**对于写权限,我们可以检测数据的有效性。

示例:

class Person {
public://姓名设置可读可写void setName(string name) {m_Name = name;}string getName(){return m_Name;}//获取年龄 int getAge() {return m_Age;}//隐私设置为只写void setSecret(string sec) {m_sec = sec;}private:string m_Name; //可读可写  姓名int m_Age=18; //只读  年龄string m_sec; //只写  隐私
};int main() {Person p;//姓名p.setName("张三");cout << "姓名: " << p.getName() << endl;//年龄cout << "年龄: " << p.getAge() << endl;//隐私设置p.setSecret("I love you!");system("pause");return 0;
}

在这里插入图片描述

1.3.1 联系—判断圆和点的位置关系

头文件(class.h):类声明

#pragma once
#include <iostream>
using namespace std;class Point
{
public://设置x,y坐标void Set(int a, int b);//获取坐标int Get_x();int Get_y();
private:int x;int y;
};class Circle
{
public:void Set(int r, Point o);int get_R();Point get_Cen();
private:int R;Point O;
};

实现文件(class.cpp):类实现

#include "class.h"//点类//设置x,y坐标
void Point::Set(int a, int b)//说明在哪个空间
{x = a;y = b;
}
//获取坐标
int Point::Get_x()
{return x;
}
int Point::Get_y()
{return y;
}//圆类
void Circle::Set(int r, Point o)
{R = r;O = o;
}
int Circle::get_R()
{return R;
}
Point Circle::get_Cen()
{return O;
}

主函数:主函数内容

#include "class.h"//点和圆的关系
int main()
{Point p;p.Set(10, 10);Point o;o.Set(5, 6);Circle c;c.Set(10, o);int d = (o.Get_x() - p.Get_x()) * (o.Get_x() - p.Get_x()) + (o.Get_y() - p.Get_y()) * (o.Get_y() - p.Get_y());if (d == c.get_R())cout << "点在圆上" << endl;else if (d > c.get_R())cout << "点在圆外" << endl;elsecout << "点在圆内" << endl;system("pause");return 0;
}

2.对象的初始化和清理

C++中的面向对象来源于生活,每个对象都会有初始设置以及对象销毁前的清理数据的设置。

2.1 构造函数和析构函数

对象的初始化和清理也是两个非常重要的安全问题:
​ 一个对象或者变量没有初始状态,对其使用后果是未知 ​;
同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题

c++利用了构造函数析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。

对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供

编译器提供的构造函数和析构函数是空实现。(即函数体为空)

  • 构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。
  • 析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。

构造函数语法:类名(){}

  1. 构造函数,没有返回值也不写void
  2. 函数名称与类名相同
  3. 构造函数可以有参数,因此可以发生重载
  4. 程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次

析构函数语法: ~类名(){}

  1. 析构函数,没有返回值也不写void
  2. 函数名称与类名相同,在名称前加上符号 ~
  3. 析构函数不可以有参数,因此不可以发生重载
  4. 程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
class Person
{
public://构造函数Person()//Person(int a)有参数也可,调用时也要有参数{cout << "Person的构造函数调用" << endl;}//析构函数~Person(){cout << "Person的析构函数调用" << endl;}};void test01()
{Person p;
}int main() {test01();Person p1;system("pause");return 0;
}

在这里插入图片描述
任意键后:
在这里插入图片描述
图中,第一个构造函数是由于调用test01()函数(创建了p),执行完test01后输出析构函数;之后由于创建p1,又执行构造函数,之后任意键后程序执行完毕,输出p1的析构函数。(构造和析构分别在由系统调用)

2.2 构造函数的分类及调用

两种分类方式: ​
按参数分为: 有参构造和无参构造 (无参又叫默认构造函数)​
按类型分为: 普通构造和拷贝构造(除去拷贝构造都是普通构造(即有参和无参构造都是))

三种调用方式: ​
括号法 ​
显示法 ​
隐式转换法

示例:

class Person {
public://无参(默认)构造函数Person() {cout << "无参构造函数!" << endl;}//有参构造函数Person(int a) {age = a;cout << "有参构造函数!" << endl;}//拷贝构造函数:将传入的类身上的所有属性,拷贝到自己身上Person(const Person& p) {//注意拷贝构造函数的形式:const 类名 引用age = p.age;cout << "拷贝构造函数!" << endl;}//析构函数~Person() {cout << "析构函数!" << endl;}
public:int age;
};//2、构造函数的调用
//调用无参构造函数
void test01() {Person p; //调用无参构造函数
}//调用有参的构造函数
void test02() {//2.1  括号法,常用Person p1(10);//注意1:调用无参构造函数不能加括号,如果加了编译器认为这是一个函数声明//Person p2();//2.2 显式法Person p2 = Person(10);Person p3 = Person(p2);//Person(10)单独写就是匿名对象  当前行结束之后,马上析构//2.3 隐式转换法Person p4 = 10; // Person p4 = Person(10); Person p5 = p4; // Person p5 = Person(p4); //注意2:不能利用 拷贝构造函数 初始化匿名对象 编译器认为是对象声明//Person p5(p4);
}

2.2.1无参构造函数调用

按照上述代码,调用函数test01.

//调用无参构造函数
void test01() {Person p; //调用无参构造函数
}
int main() {test01();system("pause");return 0;
}

在这里插入图片描述

2.2.2有参构造函数调用

按照上述代码,调用函数test02.

//调用有参的构造函数
void test02() {//2.1  括号法,常用Person p1(10);//注意1:调用无参构造函数不能加括号,如果加了编译器认为这是一个函数声明//Person p2();//2.2 显式法Person p2 = Person(10);Person p3 = Person(p2);//Person(10)单独写就是匿名对象  当前行结束之后,马上析构//2.3 隐式转换法Person p4 = 10; // Person p4 = Person(10); Person p5 = p4; // Person p5 = Person(p4); //注意2:不能利用 拷贝构造函数 初始化匿名对象 编译器认为是对象声明//Person (p4);
}

执行结果如下:(读者可自行分析)
在这里插入图片描述

下面对每种方式进行单独测试。

2.2.2.1括号法
test02()
{//2.1  括号法,常用Person p1(10);//注意1:调用无参构造函数不能加括号,如果加了编译器认为这是一个函数声明//Person p2();
}

在这里插入图片描述
可见调用了有参构造函数,之后由于执行完毕调用析构函数。(注意:如要调用无参构造函数不要加括号,不会出错但编译器会将其当作一个函数声明(类型:类名,函数名:p2,无参),不会执行无参构造函数的调用)

2.2.2.2显式法
test02()
{//2.2 显式法Person p2 = Person(10);//相当于Person p2 (10)Person p3 = Person(p2);//相当于Person p3 (p2)//Person(10)单独写就是匿名对象  当前行结束之后,马上析构
}

在这里插入图片描述

2.2.2.2.1匿名对象测试

匿名对象在当前行执行结束后,系统立即回收掉匿名对象(即当前行已结束就调用析构函数)

void test03() {Person(100);cout << "********" << endl;
}

在这里插入图片描述
调用函数test03,由输出结果可知:在执行完 Person(100); 之后还未输出 ******** 就已经调用析构函数。

2.2.2.3隐式转换法
test02()
{//2.3 隐式转换法Person p4 = 10; // Person p4 = Person(10); //相当于Person p4 (10)Person p5 = p4; // Person p5 = Person(p4); //相当于Person p5 (p4)//注意2:不能利用 拷贝构造函数 初始化匿名对象 编译器认为是对象声明//Person (p4);//系统会认为 Person (p4)=>Person p4,重新定义p4
}

在这里插入图片描述

2.3 拷贝构造函数调用时机

C++中拷贝构造函数调用时机通常有三种情况:

  • 使用一个已经创建完毕的对象来初始化一个新对象
  • 值传递的方式给函数参数传值
  • 值方式返回局部对象

示例:

class Person {
public:Person() {cout << "无参构造函数!" << endl;mAge = 0;}Person(int age) {cout << "有参构造函数!" << endl;mAge = age;}Person(const Person& p) {cout << "拷贝构造函数!" << endl;mAge = p.mAge;}//析构函数在释放内存之前调用~Person() {cout << "析构函数!" << endl;}
public:int mAge;
};

2.3.1初始化一个新对象

//1. 使用一个已经创建完毕的对象来初始化一个新对象
void test01() {Person p1(100); //p对象已经创建完毕Person p2(p1); //调用拷贝构造函数Person p3 = p1; //拷贝构造cout << p1.mage << endl;cout << p2.mage << endl;cout << p3.mage << endl;//Person p3;//p3 = p1; //不是调用拷贝构造函数,赋值操作//cout << p3.mage << endl;//也可输出100}

在这里插入图片描述

用p1由构造函数为p2和p3初始化。

2.3.2值传递的方式给函数参数传值

//2. 值传递的方式给函数参数传值
//相当于Person p1 = p;
void doWork(Person p1) {
//可调用p的一切属性和行为cout << "好好工作!" << endl;
}void test02() {Person p; //无参构造函数doWork(p);//值传递:临时拷贝
}

在这里插入图片描述
可以看出,值传递的方式给函数参数传值相当于调用拷贝构造函数。

2.3.3以值方式返回局部对象

//3. 以值方式返回局部对象
Person doWork2()
{Person p1;cout << (int*)&p1 << endl;return p1;//返回局部变量相当于调用拷贝构造函数
}void test03()
{Person p = doWork2();cout << (int*)&p << endl;
}

在这里插入图片描述

VS2022做了优化,返回值为对象时,不再产生临时对象,因而不再调用复制构造函数。(对于VS2017可以显示)

2.4 构造函数调用规则

默认情况下,c++编译器至少给一个类添加3个函数:
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝

构造函数调用规则如下:

  • 如果用户定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造;
  • 如果用户定义拷贝构造函数,c++不会再提供其他构造函数.

2.4.1 默认系统添加

class Person {
public:int age;
};void test00()
{//系统默认给无参构造函数、拷贝构造函数和析构函数Person p1;p1.age = 100;Person p2(p1);cout << "p2的年龄为: " << p2.age << endl;
}

在这里插入图片描述
可见系统默认给了拷贝构造函数,无参构造函数和析构函数因为是空实现,故无输出。

2.4.2 用户定义有参构造函数

class Person {
public://有参构造函数Person(int a) {age = a;cout << "有参构造函数!" << endl;}
public:int age;
};void test01()
{Person p1(99);//如果不写拷贝构造,编译器会自动添加拷贝构造,并且做浅拷贝操作Person p2(p1);cout << "p2的年龄为: " << p2.age << endl;
}

在这里插入图片描述
系统默认提高拷贝构造函数。

2.4.3 用户定义拷贝构造函数

class Person {
public://拷贝构造函数Person(const Person& p) {age = p.age;cout << "拷贝构造函数!" << endl;}
public:int age;
};

在这里插入图片描述
可以看出,只定义拷贝构造函数,系统不会给无参和有参构造函数,对象定义失败。

2.5深拷贝与浅拷贝

深浅拷贝是面试经典问题,也是常见的一个坑.

浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作

2.5.1浅拷贝

错误示例:

class Person {
public://有参构造函数Person(int age, int height) {cout << "有参构造函数!" << endl;m_age = age;m_height = new int(height);//开辟堆区空间存放height}//系统默认拷贝构造函数:进行简单值拷贝
Person(const Person& p) {m_age = p.m_age;m_height = p.m_height;
}//析构函数~Person() {cout << "析构函数!" << endl;if (m_height != NULL){delete m_height;}}
public:int m_age;int* m_height;
};void test01()
{Person p1(18, 180);Person p2(p1);//运用系统默认拷贝构造函数cout << "p1的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
}

在这里插入图片描述

如此系统输出会报错:因为利用系统默认拷贝构造函数,会做浅拷贝处理(即简单值拷贝),p1和p2都指向同一个堆区空间,执行析构函数时会造成同一堆区空间重复释放。—这个问题要利用深拷贝进行处理。

2.5.2深拷贝

正确示例:

class Person {
public://有参构造函数Person(int age, int height) {cout << "有参构造函数!" << endl;m_age = age;m_height = new int(height);}//自己定义:拷贝构造函数  Person(const Person& p) {cout << "拷贝构造函数!" << endl;//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题m_age = p.m_age;m_height = new int(*p.m_height);//创建新的堆区空间}//析构函数~Person() {cout << "析构函数!" << endl;if (m_height != NULL){delete m_height;//释放堆区空间}}
public:int m_age;int* m_height;
};void test01()
{Person p1(18, 180);Person p2(p1);cout << "p1的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
}

在这里插入图片描述

总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

2.6 初始化列表

作用:
C++提供了初始化列表语法,用来初始化属性

语法:构造函数():属性1(值1),属性2(值2)... {}

示例:

class Person {
public:传统方式初始化//Person(int a, int b, int c) {//	m_A = a;//	m_B = b;//	m_C = c;//}//初始化列表方式初始化//注意其格式:在构造函数基础上 加 :属性名(初始化值)Person(int a, int b, int c) :m_A(a), m_B(b), m_C(c) {//实现功能与传统方式相同//大括号内可进行其他操作}void PrintPerson() {cout << "mA:" << m_A << endl;cout << "mB:" << m_B << endl;cout << "mC:" << m_C << endl;}
private:int m_A;int m_B;int m_C;
};int main() {Person p(9,99,999);p.PrintPerson();system("pause");return 0;
}

在这里插入图片描述

2.7类对象作为类成员

C++类中的成员可以是另一个类的对象,我们称该成员为对象成员

例如:

class A {}
class B
{A a;
}

B类中有对象A作为成员,A为对象成员

一个问题:那么当创建B对象时,A与B的构造和析构的顺序是谁先谁后?

示例:

class Phone
{
public:Phone(string name){m_PhoneName = name;cout << "Phone构造函数" << endl;}~Phone(){cout << "Phone析构函数" << endl;}
private:string m_PhoneName;};class Person
{
public://初始化列表可以告诉编译器调用哪一个构造函数Person(string name, string pName) :m_Name(name), m_Phone(pName){cout << "Person构造函数" << endl;}~Person(){cout << "Person析构函数" << endl;}void playGame(){cout << m_Name << " 使用" << m_Phone.m_PhoneName << " 牌手机! " << endl;}
private:string m_Name;Phone m_Phone;};
void test01()
{Person p("张三" , "苹果");p.playGame();}

在这里插入图片描述
通过调用test01函数,可知:对于包含对象成员的调用:
构造的顺序是 :先调用对象成员的构造,再调用本类构造
析构顺序与构造相反

2.8静态成员

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员.

静态成员分为:静态成员变量和静态成员函数.

2.8.1静态成员变量

  • 静态成员变量
    • 所有对象共享同一份数据
    • 在编译阶段分配内存
    • 类内声明,类外初始化

示例:

class Person
{public:static int m_A; //静态成员变量
private:static int m_B; //静态成员变量也是有访问权限的
};//类内声明,类外初始化(与权限无关,只要是静态成员变量都可,同时类内不可初始化)
//只能在全局环境下初始化
int Person::m_A = 10;//公共权限
int Person::m_B = 10;//私有权限void test01()
{//静态成员变量两种访问方式//1、通过对象Person p1;p1.m_A = 100;cout << "p1.m_A = " << p1.m_A << endl;Person p2;p2.m_A = 200;cout << "p1.m_A = " << p1.m_A << endl; //共享同一份数据cout << "p2.m_A = " << p2.m_A << endl;//2、通过类名cout << "m_A = " << Person::m_A << endl;//cout << "m_B = " << Person::m_B << endl; //私有权限访问不到
}

在这里插入图片描述
可以看出,静态成员变量是所有对象共享的,一旦改变所有对象的值都会改变。

2.8.2静态成员函数

  • 静态成员函数
    • 所有对象共享同一个函数
    • 静态成员函数只能访问静态成员变量

示例:

class Person
{
public:static void func(int a)//静态成员函数{cout << "func调用" << endl;m_A = a;//m_B = 100; //错误,不可以访问非静态成员变量;静态成员函数共享,非静态成员变量不知道是哪个对象的属性}//无论在哪个权限下都一样static int m_A; //静态成员变量int m_B;private://静态成员函数也是有访问权限的static void func2(){cout << "func2调用" << endl;}
};//只能在全局环境下初始化
int Person::m_A = 10;//类外初始化void test01()
{//静态成员变量两种访问方式//1、通过对象Person p1;Person p2;cout << "m_A:" << p1.m_A << endl;//共享一个静态成员变量cout << "m_A:" << p2.m_A << endl;p1.func(99);cout << "m_A:" << p1.m_A << endl;//共享一个静态成员函数cout << "m_A:" << p2.m_A << endl;//2、通过类名Person::func(999);//Person::func2(); //私有权限访问不到
}

在这里插入图片描述

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

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

相关文章

微信小程序快速入门02(含案例)

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、页面导航1.…

互联网资讯精选:科技爱好者周刊 | 开源日报 No.145

ruanyf/weekly Stars: 37.4k License: NOASSERTION 记录每周值得分享的科技内容&#xff0c;提供大量就业信息。欢迎投稿、推荐或自荐文章/软件/资源&#xff0c;并可通过多种方式进行搜索。 提供丰富的科技内容每周更新可以提交工作/实习岗位支持投稿和推荐功能 GyulyVGC/…

bootloader学习笔记及SD卡启动盘制作

Bootloader介绍 在操作系统运行之前运行的一小段代码&#xff0c;用于将软硬件环境初始化到一个合适的状态&#xff0c;为操作系统的加载和运行做准备&#xff08;其本身不是操作系统&#xff09; Bootloader基本功能 1、初始化软硬件环境 2、引导加载linux内核 3、给linux…

旅游数据可视化大屏:一屏掌控,畅游数据之海

随着旅游业的蓬勃发展&#xff0c;如何有效地管理和分析旅游数据成为行业关注的焦点。旅游数据可视化大屏作为一种新兴的技术手段&#xff0c;为旅游业带来了前所未有的机遇和挑战。 旅游数据可视化大屏集成了丰富的数据资源&#xff0c;通过直观的图表、图像和交互界面&#x…

慢 SQL 的优化思路

分析慢 SQL 如何定位慢 SQL 呢&#xff1f; 可以通过 slow log 来查看慢SQL&#xff0c;默认的情况下&#xff0c;MySQL 数据库是不开启慢查询日志&#xff08;slow query log&#xff09;。所以我们需要手动把它打开。 查看下慢查询日志配置&#xff0c;我们可以使用 show …

C++力扣题目654--最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树…

7、防写一个shell 命令解释器

1、代码部分 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_INPUT_LENGTH 100void parse_command(char *command) {// 用于存储解析后的命令和参数char cmd[MAX_INPUT_LENGTH];char args[MAX_INPUT_LENGTH];// 将输入的命令拷贝到…

微信商家转账到零钱,既能单笔又能批量,支持多商户管理

大家好&#xff0c;我是小悟 微信商家转账到零钱的功能大家应该都熟悉吧&#xff0c;为了满足商家向用户微信零钱转账的需求&#xff0c;微信支付推出【商家转账到零钱】服务&#xff0c;方便商户可以一次向单个或多个用户的微信零钱转账。 商家转账到零钱为商户提供了简便、…

计算机毕业设计----SSH高校科研管理系统平台

项目介绍 本项目包含超级管理员、管理员、教师三种角色&#xff1b; 超级管理员角色包含以下功能&#xff1a; 登录,教师管理,管理员管理等功能。 管理员角色包含以下功能&#xff1a; 登录,专业参赛奖项管理,科技论文发表管理,出版专业著作管理,科研项目立项管理,科研项目结…

常常放生,与佛心更相契

弘一法师曾说&#xff1a;“世上最好的放生&#xff0c;就是放过自己。”天地与我并生&#xff0c;万物与我为一&#xff0c;每一个众生最宝贵的是自己的生命。而人自称万物之灵&#xff0c;就应当有爱护万物、保护万物的责任心&#xff0c;心中要有慈悲和恻隐之心&#xff0c;…

金蝶云星空和吉客云单据接口对接

金蝶云星空和吉客云单据接口对接 对接系统&#xff1a;吉客云 吉客云是基于“网店管家”十五年电商ERP行业和技术积累基础上顺应产业发展需求&#xff0c;重新定位、全新设计推出的换代产品&#xff0c;从业务数字化和组织数字化两个方向出发&#xff0c;以构建流程的闭环为依归…

高级JavaScript。如何用JavaScript手撸一个富文本编辑器?

要素过多建议收藏 - 富文本编辑 基本的技术就是在空白 HTML 文件中嵌入一个 iframe 。通过 designMode 属性&#xff0c;可以将这个空白文档变成可以编辑的&#xff0c;实际编辑的则是 <body> 元素 的 HTML 。 designMode 属性有两个可能的值&#xff1a; "…

高级RAG(六): 句子-窗口检索

之前我们介绍了LlamaIndex的从小到大的检索 的检索方法&#xff0c;今天我们再来介绍llamaindex的另外一种高级检索方法: 句子-窗口检索(Sentence Window Retrieval)&#xff0c;在开始介绍之前让我们先回顾一下基本的RAG检索的流程&#xff0c;如下图所示&#xff1a; 在执行基…

Fedora 36 正式发布稳定的Linux桌面版本

Fedora 36今天发布&#xff0c;这是最近一段时间以来又一个强大、前沿而又稳定可靠的Linux发行版本&#xff0c;除了这些特点外&#xff0c;Fedora 36还在原先的基础上增加了新的功能和细节打磨。 Fedora 36使用GNOME 42作为其默认的Fedora工作站桌面环境。 OpenSSL 3.0&#x…

用React给XXL-JOB开发一个新皮肤(三):实现登录页和Layout骨架

目录 一. 简述二. 接口服务调整 2.1. 登录接口2.2. 登出接口2.3. 修改密码接口2.4. 修改配置文件 三. 前端HTTP 请求四. 登录页面 4.1. 搭建登录页面4.2. 对接登录接口 五. Layout 骨架 5.1. 搭建骨架5.2. Header5.3. 修改密码5.4. 退出登录 六. 其他 一. 简述 上一篇文章我…

视频监控平台的管理员账号在所有客户端都无法登录的问题解决

目 录 一、问题描述 二、问题排查 1、看问题提示 2、看日志信息 3、问题定位 三、问题解决 1. 添加权限角色 2、添加操作用户 3、验证 一、问题描述 AS-V1000视频监控平台安装部署完成后&#xff0c;发现管理员admin不能到web客户端&#xff0c;觉…

D25XB100-ASEMI家用电器整流桥D25XB100

编辑&#xff1a;ll D25XB100-ASEMI家用电器整流桥D25XB100 型号&#xff1a;D25XB100 品牌&#xff1a;ASEMI 封装&#xff1a;GBJ-5&#xff08;带康铜丝&#xff09; 平均正向整流电流&#xff08;Id&#xff09;&#xff1a;25A 最大反向击穿电压&#xff08;VRM&…

AcWing 103. 电影(map、pair连用or离散化)

题目 方法一&#xff08;mappair&#xff09; 其实上面这么长巴拉巴拉就是在说 首先&#xff0c;每个科学家会的语言都不同。但是呢每部电影的字幕和语言是不一样的&#xff08;字幕和语言一定不相同&#xff09; 要求找到一部电影使得在场能听懂的科学家最多&#xff08;如果存…

Linux Kernel Stack Overflow/Linux 内核栈溢出

不同于Linux应用程序的栈能够动态增长&#xff0c;Linux内核栈是固定的&#xff0c;并且比较小&#xff0c;比如Linux 2.6.x内核&#xff0c;在X86 32位架构上一般是4K或8K&#xff08;在进行内核编译时&#xff0c;Kernel hacking下进行配置&#xff0c;默认8K&#xff09;&am…

上门回收小程序开发,让回收更加简单

资源回收一直是当下深受大众关注的话题&#xff0c;如何做到资源不浪费&#xff0c;成为了大众要考虑的问题。在人们环保意识的加深下&#xff0c;回收行业也是获得了大众的关注&#xff0c;逐渐形成了一个新的商业模式。 随着互联网技术的发展&#xff0c;回收行业也更加方便…