C++(10)类语法分析(1)

news2024/9/20 14:41:44

C++(10)之类语法分析(1)


Author: Once Day Date: 2024年8月17日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…

漫漫长路,有人对你微笑过嘛…

全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客

参考文章:

  • 【C++】类的概念与基本使用介绍-CSDN博客
  • C++ 类 & 对象 | 菜鸟教程 (runoob.com)
  • C++从入门到精通——类的定义及类的访问限定符和封装-腾讯云开发者社区-腾讯云 (tencent.com)
  • 类和结构 (C++) | Microsoft Learn
  • C++ 类 & 对象_w3cschool
  • C++打怪升级(四)- 类和对象入门1-腾讯云开发者社区-腾讯云 (tencent.com)

文章目录

  • C++(10)之类语法分析(1)
        • 1. 介绍
          • 1.1 概述
          • 1.2 类基本概念
          • 1.3 类、结构体和联合的联系和区别
        • 2. 类基础特性
          • 2.1 类成员函数
          • 2.2 类成员内联函数
          • 2.3 构造函数和析构函数
          • 2.4 列表初始化(c11)
          • 2.5 const成员函数
          • 2.6 类作用域和静态成员
          • 2.7 this指针

1. 介绍
1.1 概述

在C++中,类(Class)是一种用户自定义的数据类型,它将数据成员(属性)和成员函数(方法)组合在一起,形成一个逻辑上相关的实体。通过使用类,我们可以创建出具有特定行为和状态的对象。

类的定义通常包含以下几个部分:

  • 类名,类的名称。通常以大写字母开头,使用驼峰命名法。

  • 访问修饰符,控制类的成员对外部的可见性,包括public(公有)、protected(保护)和private(私有)三种。

  • 数据成员,类的属性,描述了类的状态。可以是基本数据类型、数组、指针、对象等。

  • 成员函数,类的方法,定义了类的行为。包括构造函数、析构函数、普通成员函数等。

下面是一个简单的类定义示例:

class Student {
private:
    string name;
    int age;
    
public:
    Student(string n, int a) {
        name = n;
        age = a;
    }
    
    void displayInfo() {
        cout << "Name: " << name << endl;
        cout << "Age: " << age << endl;
    }
};

在这个例子中定义了一个名为Student的类。它有两个私有数据成员nameage,分别表示学生的姓名和年龄。同时,它还有两个公有成员函数:构造函数Student()用于初始化对象,displayInfo()用于显示学生的信息。

创建类的对象很简单,只需要使用类名和构造函数即可:

Student stu("Alice", 20);
stu.displayInfo();

以上代码创建了一个名为stuStudent对象,并调用其displayInfo()方法输出学生信息。

1.2 类基本概念

类(class):类是一个用户定义的数据类型,它包含数据成员(属性)和成员函数(方法)。

抽象(Abstraction):抽象是指将对象的共同特征抽取出来,形成一个类的过程。它强调了对象的本质属性和行为,而忽略了非本质的细节。通过抽象,我们可以创建出更加通用和灵活的类。

继承(Inheritance):继承是一种类与类之间的关系,它允许一个类(子类)继承另一个类(父类或基类)的属性和方法。通过继承,子类可以重用父类的代码,并可以添加或修改自己特有的功能。继承提高了代码的复用性和可维护性。

多态(Polymorphism):多态是指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在C++中,多态分为静态多态(函数重载)和动态多态(虚函数)。多态提供了一种接口重用的方式,增强了程序的可扩展性。

成员(Member),成员是属于类的一部分,包括数据成员(属性)和成员函数(方法)。数据成员用于描述类的状态,成员函数用于定义类的行为。成员可以是静态的(属于类本身)或非静态的(属于类的对象)。

访问修饰符(Access Modifiers):访问修饰符用于控制类的成员对外部的可见性,包括以下三种:

  • public(公有):公有成员可以被任何地方访问,包括类的内部和外部。
  • protected(保护):保护成员可以被类自身及其子类访问,但不能被类的外部直接访问。
  • private(私有):私有成员只能被类自身访问,不能被子类和类的外部访问。
1.3 类、结构体和联合的联系和区别

结构(struct)、类(class)和联合(union)是C++中三种重要的用户自定义数据类型,结构和类的主要区别在于默认的访问修饰符不同:结构默认是公有的,类默认是私有的。

结构和类都支持面向对象编程的特性,如封装、继承、多态等。但在实践中,结构更倾向于被用作简单的数据容器,而类更倾向于被用于定义复杂的数据类型和行为。

联合与结构和类的区别较大。联合强调了成员之间的互斥性,同一时间只能存储一个成员的值,常用于节省内存空间或者表示变体类型。

特性结构(struct)类(class)联合(union)
默认访问修饰符publicprivate无(所有成员公有)
访问修饰符支持支持public、protected、private支持public、protected、private不支持
数据成员支持支持支持
成员函数支持支持不支持
构造函数/析构函数支持支持不支持
继承可以继承其他结构或类可以继承其他类或结构,支持多重继承不支持继承
多态不直接支持,但可以通过继承实现支持,可以定义虚函数不支持
内存布局每个成员独立占用内存空间每个成员独立占用内存空间所有成员共享同一块内存空间
常见用途简单的数据容器定义复杂的数据类型和行为节省内存空间,表示变体类型
2. 类基础特性
2.1 类成员函数

类成员函数是类的重要组成部分,它们定义了类的行为和功能。

(1) 特殊成员函数是编译器自动生成或用户显式定义的一组函数,包括:

  • 默认构造函数:无参数或所有参数都有默认值的构造函数。
  • 析构函数:在对象销毁时自动调用,用于释放资源。
  • 拷贝构造函数:使用另一个同类型对象初始化当前对象。
  • 移动构造函数:使用另一个同类型的右值对象初始化当前对象。
  • 拷贝赋值运算符:将另一个同类型对象赋值给当前对象。
  • 移动赋值运算符:将另一个同类型的右值对象赋值给当前对象。

(2) 可变和静态数据成员:

  • 可变数据成员,使用mutable关键字声明,即使在常量对象中也可以被修改。
  • 静态数据成员,使用static关键字声明,属于类本身,而不是类的实例,静态数据成员在类外部初始化。

(3) 内置类型和用户定义类型,类的数据成员可以是内置类型(如int、double等)或其他用户定义的类型(如类、结构体等)。对于用户定义类型的数据成员,需要注意初始化的顺序和方式。

(4) 运算符,类可以重载运算符,以提供特定于类的操作。重载运算符的函数可以是类的成员函数或友元函数。

(5) 嵌套类声明,类可以在另一个类的内部声明,称为嵌套类。嵌套类可以访问外围类的私有成员。

(6) Unions,类可以包含联合(Union)类型的数据成员。联合允许在同一内存位置存储不同类型的对象。

(7) 枚举,类可以包含枚举(Enum)类型的数据成员。枚举用于定义一组命名的整型常量。

(8) 位域,类可以包含位域(Bit Field)类型的数据成员。位域允许在一个整型变量中指定位的数量,以节省内存空间。

(9) 友元,类可以将其他类、函数或模板声明为友元(Friend),以允许它们访问类的私有成员。

(10) 别名和typedef,类可以使用别名(如using关键字)或typedef为类型定义新的名称,以提高代码的可读性。

在构造函数中,可以使用初始化列表来初始化数据成员,特别是const成员和引用成员。如果数据成员没有在构造函数中显式初始化,则会进行默认初始化。内置类型的默认初始化值取决于数据成员的存储位置。静态数据成员在类外部初始化,而不是在构造函数中初始化。

2.2 类成员内联函数

类成员函数和内联函数有着紧密的联系,合理地使用内联成员函数可以提高程序的执行效率。

  • 内联函数是一种特殊的函数,它的函数体在编译时被直接插入到调用点,而不是像普通函数那样通过函数调用和返回的方式执行。这样可以避免函数调用的开销,提高程序的执行效率。内联函数通常适用于短小、频繁调用的函数。

  • 类成员函数(Class Member Function),类成员函数是属于类的一部分,用于定义类的行为。成员函数可以访问类的私有成员,并且可以被类的对象调用。成员函数可以是普通函数,也可以是内联函数。

  • 内联成员函数(Inline Member Function),内联成员函数是指在类内部定义且声明为内联的成员函数。内联成员函数的函数体会在编译时被直接插入到调用点,从而避免了函数调用的开销。内联成员函数通常用于实现短小、频繁调用的成员函数,如访问器(getter)和修改器(setter)等。

对于短小、频繁调用的成员函数,可以考虑将其定义为内联函数,以提高执行效率。但需要注意,过度使用内联函数可能会增加代码的体积和编译时间。将成员函数定义在类内部,将成员函数的定义放在类的内部,可以让编译器更容易进行内联优化。同时,这样也可以提高代码的可读性和封装性

下面是一个简单的例子,展示了内联成员函数的使用:

class Rectangle {
private:
    int width;
    int height;

public:
    Rectangle(int w, int h) : width(w), height(h) {}

    inline int getArea() const {
        return width * height;
    }

    inline void setWidth(int w) {
        width = w;
    }

    inline void setHeight(int h) {
        height = h;
    }
};

在这个例子中,getArea()setWidth()setHeight()都是内联成员函数,它们的函数体会在编译时被直接插入到调用点,从而避免了函数调用的开销。

2.3 构造函数和析构函数

构造函数(Constructor),构造函数是一种特殊的成员函数,用于初始化对象的数据成员。它与类同名,没有返回类型,可以有参数。构造函数在对象创建时自动调用,用于确保对象在使用前处于一个有效的状态。

  • 默认构造函数,如果没有显式定义构造函数,编译器会自动生成一个默认构造函数。默认构造函数没有参数,会对对象进行默认初始化。可以通过将隐式默认构造函数定义为已删除来阻止编译器生成它。

    // Default constructor
    MyClass() = delete;
    

    如果有任何类成员不是默认可构造,则编译器生成的默认构造函数会定义为已删除。 例如,类类型的所有成员及其类类型成员都必须具有可访问的默认构造函数和析构函数。 引用类型的所有数据成员和所有 const 成员都必须具有默认成员初始化表达式。

  • 参数化构造函数,带有参数的构造函数,用于根据传入的参数初始化对象的数据成员。

构造函数的语法:

class MyClass {
public:
    MyClass();  								// 默认构造函数
    MyClass(int value);  						// 参数化构造函数
};

析构函数(Destructor),析构函数是一种特殊的成员函数,用于在对象销毁时执行清理操作,如释放动态分配的内存、关闭文件、断开网络连接等。析构函数的名称与类名相同,前面加上~符号,没有参数和返回值。析构函数在对象超出作用域、被显式删除或程序结束时自动调用。

  • 默认析构函数,如果没有显式定义析构函数,编译器会自动生成一个默认析构函数,默认析构函数没有任何操作。
  • 自定义析构函数,用户根据需要定义的析构函数,执行必要的清理操作。

下面是一个完整的例子,展示了构造函数和析构函数的使用:

class MyClass {
public:
    MyClass() {
        cout << "Default constructor called." << endl;
    }

    MyClass(int value) : data(value) {
        cout << "Parameterized constructor called." << endl;
    }

    ~MyClass() {
        cout << "Destructor called." << endl;
    }

private:
    int data;
};

int main() {
    MyClass obj1;  		// 调用默认构造函数
    MyClass obj2(42);  	// 调用参数化构造函数
    return 0;  		    // 对象超出作用域,调用析构函数
}

输出结果:

Default constructor called.
Parameterized constructor called.
Destructor called.
Destructor called.
2.4 列表初始化(c11)

C++11引入了列表初始化(List Initialization)的概念,提供了一种更加通用、一致的方式来初始化对象,包括类的对象。列表初始化使用大括号{}来指定初始值,可以用于各种类型的对象。

(1) 类成员的列表初始化,使用列表初始化可以直接在类的定义中为数据成员指定初始值,而不需要在构造函数中显式初始化

class MyClass {
public:
    MyClass() {}

private:
    int value{42};
    std::string name{"John"};
    std::vector<int> numbers{1, 2, 3};
};

(2) 构造函数的列表初始化,在构造函数中,可以使用列表初始化来初始化数据成员,这提供了一种更加简洁、直观的方式。

class MyClass {
public:
    MyClass() : value{42}, name{"John"}, numbers{1, 2, 3} {}

private:
    int value;
    std::string name;
    std::vector<int> numbers;
};

(3) 对象的列表初始化,在创建类的对象时,可以使用列表初始化来直接指定对象的初始值

MyClass obj1{};  // 使用默认构造函数
MyClass obj2{42, "John", {1, 2, 3}};  // 使用列表初始化

(4) 返回对象的列表初始化,在函数返回类的对象时,可以使用列表初始化来直接创建和返回一个临时对象

MyClass createObject() {
    return {42, "John", {1, 2, 3}};  // 使用列表初始化返回临时对象
}

(5) 聚合类的列表初始化,对于聚合类(Aggregate Class),即没有用户提供的构造函数、基类和虚函数的类,可以使用列表初始化来直接初始化其数据成员

struct Point {
    int x;
    int y;
};

Point p1{1, 2};  // 使用列表初始化
2.5 const成员函数

const成员函数是一种特殊的类成员函数,用于保证在该函数中不会修改对象的状态。在成员函数的声明和定义中,在函数参数列表后面加上const关键字,表示该函数是一个const成员函数

class MyClass {
public:
    int getValue() const;  // const成员函数声明
};

int MyClass::getValue() const {
    return value;  // const成员函数定义
}

const成员函数不能修改对象的数据成员,也不能调用其他非const成员函数(因为它们可能会修改对象状态)。这提供了一种契约,保证了const成员函数的行为。

class MyClass {
public:
    int getValue() const {
        // value = 42;  // 错误:不能修改数据成员
        return value;
    }

private:
    int value;
};

可以同时提供一个成员函数的const和非const版本,以适应不同的需求,这称为const重载

class MyClass {
public:
    int& getValue() {
        return value;  // 非const版本,可以修改数据成员
    }

    const int& getValue() const {
        return value;  // const版本,不能修改数据成员
    }

private:
    int value;
};

常量对象(即声明为const的对象)只能调用const成员函数,不能调用非const成员函数,这确保了常量对象的不可变性

const MyClass obj;
obj.getValue();  // 调用const版本的getValue
2.6 类作用域和静态成员

类作用域、作用域类枚举和静态常量成员是C++中与类相关的重要概念,它们定义了类成员的可见性、生命周期和访问方式。

(1) 类作用域(Class Scope),类作用域是指在类定义中声明的名称(如成员变量、成员函数、嵌套类型等)的可见范围。类作用域内的名称只能在类内部直接访问,在类外部需要通过类名或对象名限定。

class MyClass {
public:
    void myFunction() {
        // 在类作用域内直接访问成员变量
        value = 42;
    }

private:
    int value;
};

int main() {
    MyClass obj;
    // obj.value = 42;  // 错误:在类外部不能直接访问私有成员
    obj.myFunction();  // 通过对象名访问公共成员函数
    return 0;
}

(2) 作用域类枚举(Scoped Enumerations),作用域类枚举是C++11引入的一种强类型枚举,它具有类作用域,可以防止枚举值的命名冲突。作用域类枚举使用enum class关键字定义,枚举值的名称仅在枚举类型的作用域内可见。

enum class Color { Red, Green, Blue };

int main() {
    Color c = Color::Red;  // 使用作用域类枚举
    // int value = Red;  // 错误:枚举值名称在枚举类型作用域外不可见
    return 0;
}

(3) 静态常量成员(Static Const Members),静态常量成员是类的一种特殊成员,它具有静态存储期和常量特性。静态常量成员在类内部声明,在类外部定义和初始化。它们可以在类的任何成员函数中访问,也可以通过类名在类外部访问。

class MyClass {
public:
    static const int VALUE = 42;
};

const int MyClass::VALUE;  // 在类外部定义和初始化静态常量成员

int main() {
    int value = MyClass::VALUE;  // 通过类名访问静态常量成员
    return 0;
}

静态数据成员不是给定的类类型的对象的一部分。 因此,静态数据成员的声明不被视为一个定义。 在类范围中声明数据成员,但在文件范围内执行定义。 这些静态类成员具有外部链接。

2.7 this指针

this指针是C++中的一个特殊指针,它是一个隐式参数,存在于类的每一个非静态成员函数中。this指针指向当前对象的地址,通过this指针可以访问当前对象的成员变量和成员函数。

this指针的类型是当前类的常量指针,即const ClassName* const,其中ClassName是当前类的名称。这意味着this指针指向的地址不能被修改,也不能用于修改当前对象的常量成员。

在成员函数中,可以使用this指针显式地访问当前对象的成员变量,以消除名称冲突或提高代码的清晰度。

class MyClass {
public:
    void setValue(int value) {
        this->value = value;  // 使用this指针访问成员变量
    }

private:
    int value;
};

在某些成员函数中,可以返回*this,即当前对象的引用,以支持链式调用或其他特殊用途。

class MyClass {
public:
    MyClass& setValue(int value) {
        this->value = value;
        return *this;  // 返回当前对象的引用
    }

private:
    int value;
};

int main() {
    MyClass obj;
    obj.setValue(42).setValue(24);  // 链式调用
    return 0;
}

在const成员函数中,this指针的类型是const ClassName* const,这意味着不能通过this指针修改当前对象的成员变量。

class MyClass {
public:
    int getValue() const {
        return this->value;  // 在const成员函数中使用this指针
    }

private:
    int value;
};






Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

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

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

相关文章

JavaFX布局-DialogPane

JavaFX布局-DialogPane 常用属性标题区域headerTextheader 内容区域contentTextcontent graphic按钮设置expandableContent 实现方式Java实现 一个特殊的布局容器&#xff0c;常用于弹出框&#xff0c;与Dialog配合一起使用包含标题区&#xff0c;内容区域&#xff0c;扩展区域…

Merkle树(Merkle Tree):高效地验证某个数据块是否包含在数据集中

目录 Merkle树(Merkle Tree) 一、基本结构 二、构建过程 三、主要作用 四、应用领域 Merkle树(Merkle Tree) Merkle树(Merkle Tree),也被称为默克尔树或Merkle哈希树,是一种基于哈希的数据结构,主要用于验证大规模数据集的完整性和一致性。它的名字来源于其发明…

【Unity教程】使用 Animation Rigging实现IK制作程序化的动画

在 Unity 开发中&#xff0c;为角色创建逼真且自适应的动画是提升游戏体验的关键。在本教程中&#xff0c;我们将结合 Animation Rigging 工具和 IK&#xff08;Inverse Kinematics&#xff0c;反向运动学&#xff09;插件来实现程序化的动画。 视频教程可以参考b战大佬的视频 …

不只是翻译,更是智慧碰撞!有道翻译与3大强敌的全方位较量

现在的科技牛得不行&#xff0c;翻译软件早就成了咱们学习、工作、生活里少不了的帮手。它们不光是把语言的墙给推倒了&#xff0c;还让咱们说话交流快多了。今儿个&#xff0c;咱们就一块儿瞧瞧2024年的翻译软件圈子&#xff0c;瞅瞅那几个最火的翻译工具&#xff0c;它们怎么…

生信软件30 - 快速单倍型分析工具merlin

Merlin可用于连锁分析或关联分析、IBD和亲缘关系估计、单倍型分析、错误检测和模拟。 1. merlin下载 下载地址&#xff1a; http://csg.sph.umich.edu/abecasis/merlin/download/ # linux版本 wget http://csg.sph.umich.edu/abecasis/merlin/download/Linux-merlin.tar.gz …

如何在本地和远程删除 Git 分支?

如何在本地和远程删除 Git 分支&#xff1f; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人 擅长.n…

创新赛场的制胜法宝:如何让你的商业计划书脱颖而出

创新赛场的制胜法宝&#xff1a;如何让你的商业计划书脱颖而出 前言明确产品或服务的核心功能突出创新性用户需求和市场痛点具体示例和场景详细描述产品和服务的方法实例化产品与服务视觉辅助工具未来展望结语 前言 作为一名资深的项目负责人&#xff0c;我有幸参与了无数次创新…

React + Vite项目别名配置

Node版本&#xff1a;v20.16.0Vite版本&#xff1a;5.4.1 安装 types/node 依赖包 pnpm i types/node -D pnpm ls types/node配置 vite.config.js 文件: resolve: {alias: {"": join(__dirname, "./src/"),}, },使用配置好的别名 &#xff1a; 由上图我们…

考试:操作系统知识(02)

进程同步和互斥 临界资源&#xff1a;各进程间需要以互斥方式对其进行访问的资源。 临界区&#xff1a;指进程中对临界资源实施操作的那段程序。本质是一段程序代码。 ◆互斥&#xff1a;某资源(即临界资源) 在同一时间内只能由一个任务单独使用&#xff0c;使用时需要加锁&…

kafka连接图形化工具(Offset Explorer和CMAK)

kafka连接图形化工具 1、Offset Explorer1.1、下载Offset Explorer1.2、安装Offset Explorer1.3、配置Offset Explorer连接kafka 2、CMAK&#xff08;kafka的web管理后台&#xff09;2.1、下载2.2、解压安装2.3、配置2.4、启动2.5、CMAK访问 1、Offset Explorer Offset Explor…

【数据结构】二叉树链式结构(c语言)(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 一、节点的定义 二、创建一棵二叉树 1. 创建新节点 2. 手动创建二叉树 三、方法的声明 四、方法的实现 1. 前、中、后序遍历 1.1 前…

libLZMA库iOS18平台编译

1.下载xz源码: 使用autogen.sh生成configure文件 2.生成makefile rm -rf ./build/iOS && mkdir -p ./build/iOS && cd ./build/iOS && ../../configure --host=arm-apple-darwin64 --prefix=`pwd`/Frameworks/lzma CC="xcrun -sdk iphoneos cl…

二十天刷leetcode【hot100】算法- day2[前端Typescript]

指针 6.三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的…

Maven项目中Allure和AspectJ的配置及测试执行(常见报错解决方法)

Maven项目中Allure和AspectJ的配置及测试执行 在自动化测试领域&#xff0c;Allure和AspectJ是两个非常有用的工具。Allure提供了丰富的测试报告&#xff0c;而AspectJ则允许我们以声明式的方式编写横切关注点&#xff0c;如日志记录、事务管理等。本文将指导您如何在Maven项目…

MySQL基础练习题47-判断三角形

目录 题目 准备数据 分析数据 方法一 &#xff1a;if函数 方法二&#xff1a;case when 题目 对每三个线段报告它们是否可以形成一个三角形。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Triangle (x int, y int, z int)## …

XSS-过滤特殊符号的正则绕过

靶场网址&#xff1a;https://xss.pwnfunction.com/ 题目源码&#xff1a; mafia (new URL(location).searchParams.get(mafia) || 11)mafia mafia.slice(0, 50)mafia mafia.replace(/[\\\"\\-\!\\\[\]]/gi, _)mafia mafia.replace(/alert/g, _)eval(mafia) 分析代码…

autojsUI界面分享 免责条款界面

个人简介 &#x1f468;&#x1f3fb;‍&#x1f4bb;个人主页&#xff1a;九黎aj &#x1f3c3;&#x1f3fb;‍♂️幸福源自奋斗,平凡造就不凡 &#x1f31f;如果文章对你有用&#xff0c;麻烦关注点赞收藏走一波&#xff0c;感谢支持&#xff01; &#x1f331;欢迎订阅我的…

计算机毕业设计选题推荐-springboot 基于SpringBoot的宠物爱心组织管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

网络编程,网络协议,UDP协议

网络&#xff1a; 1.协议&#xff1a;通信双方约定的一套标准 2.国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …

python中模块,包,python常用内置模块,第三方模块

python模块 模块的导入&#xff1a; 模块可以导入一整个也可以导入其中的部分变量函数类&#xff0c;直接饶了的变脸函数类在使用时候就可以不用再前边写上 模块的名字. 这个部分了&#xff0c;所有需要注意同名函数会覆盖&#xff0c;使用时会调用后引入模块的这个函数 包 …