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

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

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

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

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

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

相关文章:

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

C(10)之类语法分析(1) Author: Once Day Date: 2024年8月17日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …...

python语言day6 os random datetime .ini文件

os&#xff1a; 获取运行当前py文件的绝对路径&#xff1a; abspath中添加路径&#xff0c;会直接和绝对路径拼接。 folder_path os.path.abspath("") print(folder_path) 路径拼接&#xff1a; mac系统路径&#xff1a;file/TranslucentTB win系统路径&#xff1a;…...

powershell 终端 执行 pnpm -v报错

1.问题描述&#xff1a; 明明全局已安装 pnpm &#xff0c;但在vscode默认终端 powershell 执行 pnpm -v 却报错&#xff1a; 2.问题根因&#xff1a; 原因是 PowerShell 执行策略问题。 3.解决方案&#xff1a; 以管理员身份运行 PowerShell 查看 PowerShell 的执行策略…...

最新保姆级Anaconda和Pycharm安装激活过程(2024最新版本)

Anaconda和Pycharm安装过程 Anaconda安装过程第一步第二步第三步第四步第五步第六步第七步第八步第九步Pycharm 安装过程&#xff1a;第一步第二步第三步第四步第五步第六步---激活过程第七步第八步第九步第十步第十一步第十二步第十三步第十四步Anaconda和Pycharm软件百度网盘…...

虚幻5|布料模拟

打开骨骼网格体 1.Mass Prooerties 如果给角色施加风力&#xff0c;密度越大越难飘&#xff0c;相反密度越小飘动浮度也小 2.Material Proerties Edge Stiffness,对衣服的折痕处的调整&#xff0c;其值越大就越能维持原本的折痕&#xff0c;相反折痕就会变小&#xff0c;但…...

K8S 存储

K8S&#xff08;Kubernetes&#xff09;的存储是容器化应用程序中非常重要的一部分&#xff0c;它帮助用户在不同场景下管理和存储数据。K8S提供了多种存储方式&#xff0c;以满足不同的存储需求。以下是对K8S存储的详细解析&#xff1a; 一、K8S存储类型 K8S的存储类型主要分…...

Kafka Manager支持jdk1.8的部署和使用

一、Kafka Manager简介 Kafka Manager 可能是现在能找到的最好的可视化的Kafka管理工具, 感谢Yahoo的开源; 使用Kafka Manager, 基本上之前需要运行Kafka相应命令行工具的工作现在都可以可视化的完成:创建Topic, 调整消息保存时长, Partition数量等等配置;管理Topic, 包括Reas…...

vmware和virtualbox优缺点

vmware和virtualbox优缺点 &#xff0c;都可以搭建本地虚拟机&#xff0c;他们有什么优缺点&#xff0c;两个都用过 &#xff0c;本次打算直接用virtualbox搭建本地虚拟机&#xff0c;比较轻量级 VirtualBox的优点&#xff1a; 免费使用&#xff1a;VirtualBox是一…...

[C++进阶]二叉树进阶的一些面试题(一)

首先我们先回忆我们过去学的二叉树和最近学的二叉搜索树,来完成下面的题目: 606. 根据二叉树创建字符串 这道题属于与基础题,首先我们观察输入输出样例可以得到如果root->left为空,root->right不为空时,我们的空格仍然需要保留,如果当前节点有两个孩子&#xff0c;那我…...

【Python单元测试】学习笔记1

文章目录 01-单元测试基础什么是单元测试常用的文件结构运行单元测试 02. 断言函数03. Test Fixtures什么是Test Fixtures模块级别的Fixtures类级别的Fixtures方法级别的Fixtures 04.Mock python单元测试学习笔记1&#xff1a;https://blog.csdn.net/qq_42761751/article/detai…...

NVDLA专题10:具体模块介绍——Planar Data Processor

概述 平面数据处理器(Planar Data Processor, PDP)沿宽x高的前两个维度平面执行操作&#xff0c;在NVDLA版中&#xff0c;PDPD旨在实现池化层&#xff0c;module定义在NV_NVDLA_pdp.v。支持最大、最小和平均池化方法。平面内的几个相邻输入元素将被发送到非线性函数来计算一个…...

面向财商人群的AI垂直产品 —— AI股票助手

在数字化转型的大潮中,AI技术正在重塑各行各业,尤其是金融市场。对于那些渴望在瞬息万变的股市中保持敏锐洞察力的金融分析师、投资者及股票爱好者来说,一款强大而智能的工具显得尤为重要。今天,我们将向大家介绍一款专为财商人群打造的AI垂直产品——AI股票助手。 一、产…...

玩AI第二步——python 环境安装

python 环境安装 前言 通常,我们会直接去python官网下载一个安装包直接安装即可. 但是这样很不好,总不能把所有版本的python都安装一遍 所以,这里安装minconda,是一个轻量级的Python环境管理工具&#xff0c;仅包括conda、Python及其所需的基本依赖库。因此&#xff0c;它的…...

【图解秒杀系列】秒杀技术点——静态化

【图解秒杀系列】秒杀技术点——静态化 什么是静态化、静态化的作用如何实现静态化FreeMarker、Thymleaf处理流程问题 OpenResty Lualua_shared_dict & lua-resty-template处理流程具体操作 什么是静态化、静态化的作用 静态化就是指通过某种静态化技术&#xff0c;将原本…...

Simple RPC - 05 从零开始设计一个客户端(下)_ 依赖倒置和SPI

文章目录 Pre概述依赖倒置原则与解耦设计与实现1. 定义接口来隔离调用方与实现类2. 实现类DynamicStubFactory3. 调用方与实现类的解耦 依赖注入与SPI的解耦依赖注入SPI&#xff08;Service Provider Interface&#xff09; 总结 Pre Simple RPC - 01 框架原理及总体架构初探 …...

2024新型数字政府综合解决方案(三)

新型数字政府综合解决方案通过融合人工智能、大数据和云计算技术&#xff0c;建立了一个智能化、互联互通的政府服务平台&#xff0c;旨在提升政府服务效率与透明度。该方案通过全面数字化政务流程&#xff0c;实现数据的实时共享和自动化处理&#xff0c;使公众能够便捷地访问…...

计算机毕业设计hadoop+spark+hive知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习

流程&#xff1a; 1.Python采集网易云音乐歌手、歌词、音乐、评论等约10-20万海量数据&#xff0c;存入mysql数据库&#xff1b; 2.使用pandasnumpy/MapReduce对mysql中四类数据进行数据清洗&#xff0c;写入.csv文件并上传至hdfs(含评论NLP文本分类/lsm情感分析); 3.使用hive建…...

值类型与引用类型

值类型 在Swift中&#xff0c;如果一个对象是用struct实现的&#xff0c;则该对象为值类型&#xff0c;在被赋值给常量或者变量时或者作为参数传递给函数时&#xff0c;值类型总是被复制&#xff0c;复制后的对象与之前的对象指向不同的内存。 Swift的基本类型(Array、Dictio…...

C++STL初阶(12):stack和queue的初阶实现

1. stack的选型 对于栈的实现是我们非常熟悉的过程&#xff1a; C语言基础数据结构——栈和队列_栈和队列 插入取出数据-CSDN博客 _top表示下标&#xff0c;_capacity表示空间大小&#xff1a; 那么按照我们原来的思路&#xff0c;利用_top和_capacity T*来给stack构形。 temp…...

汽车IVI中控OS Linux driver开发实操(二十三):驱动的设备probe及匹配

第一个函数:probe linux驱动模型是分成三个部分的,设备(结构体device),驱动(结构体device_driver),总线(结构体bus_type)。在Linux内核中,设备驱动通常会实现一个probe函数,它是...

华为od(D卷)二叉树计算

文章目录 题目描述输入描述输出描述示例1思路代码 题目描述 给出一个二叉树如下图所示&#xff1a; 6/ \7 9\ / -2 6 请由该二叉树生成一个新的二叉树&#xff0c;它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 20 (7-296)/ \-2 6\ / 0 0 左子树…...

技术爱好者完全用台式机部件定制游戏笔记本电脑

高端笔记本电脑的功能强大到令人难以置信的地步&#xff0c;但大多数笔记本电脑在至少几个关键性能方面仍然落后于台式机。一位 YouTuber 对这种情况感到厌倦&#xff0c;为了抹除这种差距&#xff0c;他开始了为期 14 个月的旅程&#xff0c;使用真正的台式机硬件打造自己的笔…...

100个练习学习Rust!if・Panic・演练

之前的文章 【0】准备 【1】构文・整数・变量 ← 上回 【2】 if・Panic・演练 ← 本次 这是“100 Exercise To Learn Rust”的第2次练习&#xff01;本次的主题包括 if 表达式、panic 机制&#xff0c;以及对前面内容的总结练习。 本次相关的页面如下&#xff1a; 2.3. Bran…...

MODELSIM仿真报错解决记录

目录 问题&#xff1a;Modelsim报错&#xff1a;Error (10228): Verilog HDL error at Line_Shift_RAM_1Bit.v(39): module “Line_Shift_RAM_1 原因&#xff1a;创建的IP核放到了别的位置 解决方法&#xff1a;删掉IP核以及QIP等文件&#xff0c;将IP核创建到工程目录下 问…...

day33-负载均衡实战

01.问题总结 1.rsync同步注意目录加/和不加/的区别 2.安装wordpress过程中禁止使用IP安装,解析成域名安装 比如安装过程 10.0.0.7--->填写数据库信息--->写入数据库中 如果安装完成后再使用www.wp.com访问&#xff0c;不能访问页面乱码的问题。 3.挂载wordpress挂载uplo…...

网络接口 eno1 未连接或未托管

网络接口 eno1 未连接或未托管&#xff0c;通常意味着该接口没有被识别或没有被配置为自动连接到网络。以下是一些可能的解决方案&#xff1a; 检查物理连接&#xff1a; 确保您的以太网电缆正确连接到 eno1 接口和调制解调器/路由器。 启用网络接口&#xff1a; 使用以下命令…...

Linux I/O 多路复用机制详解

文章目录 1 文件描述符&#xff08;File Descriptor&#xff09;1.1 什么是文件描述符&#xff1f;1.2 文件描述符与文件的关系 2 文件描述符集合&#xff08;File Descriptor Set&#xff09;2.1 什么是文件描述符集合&#xff1f;2.2 fd_set 结构体 3 select() 函数的工作原理…...

第43课 Scratch入门篇:雪花随风飘

雪花随风飘 故事背景: 雪花轻轻地从灰蒙蒙的天空中飘落下来,它们像是天空中飘洒下来的羽毛,又像是冬日的精灵在翩翩起舞。每一片雪花都独一无二,它们在空中旋转、飘荡,最终缓缓降落在屋顶、树枝、街道和行人的肩头。 程序原理: 众多的雪花肯定是克隆功能,降落过程是通过…...

VueUse 基于 Vue 3 Composition API 的高质量 Hooks 库

VueUse 是什么? VueUse 是基于 Vue 3 Composition API 的高质量 Hooks 库。例如获取滚动的距离 VueUse 官网:VueUse | VueUse VueUse 什么使用? 1、通过npm安装 VueUse npm i @vueuse/core 2、搜索需要使用的函数,例如搜索 useScroll 滚动 3、使用useScroll 滚动函数 …...

ARM CoreLink 系列 5.1.1 -- CI-700 System Address Map 】

文章目录 System Address MapRN SAMRN SAM memory regions and target typesSAM memory region size configurationRN SAM target ID selectionSystem Address Map 所有的CHI 命令都包含一个 Source ID 和 Target ID, 其中 Source ID 可以来自于 RN Node, Target ID 可以来自…...

【数据结构】二叉树(一)

目录 1. 树型结构 概念 树的表示形式 ​编辑 2. 二叉树&#xff08;重点&#xff09; 2.1 概念 2.2 二叉树的性质 2.3 二叉树的存储 2.4 二叉树的遍历 前中后序遍历 层序遍历&#xff1a; 2.5二叉树的基本操作 本篇主要理解树和二叉树相关概念&#xff0c;二叉树遍…...

使用duplicate搭建备库或者级联备库

使用duplicate搭建备库或者级联备库&#xff1a; 主库或者源端&#xff1a; 1. 创建pfile&#xff0c;更改&添加部分参数、传输到备库&#xff1b; 2. 主库&#xff08;或者源端&#xff09;的tnsnames.ora文件添加 备库的连接信息 备库&#xff1a; 1. 备库添加静态监听 2…...

【存储学习笔记】4:快照(Snapshot)技术的实现方式

1 快照 1.1 动机 在上一篇《备份》里提到&#xff0c;热备份就是在执行操作时&#xff0c;服务器需要正常处理来自用户或应用对数据的更新&#xff0c;这样能够保证数据7*24小时可用&#xff08;在很多服务里这是必要的&#xff09;。 而热备份的困难就是如何保证数据的一致…...

数根(字符串数根公式)

公式&#xff1a;a的数根(a-1)%91&#xff1b; #include <bits/stdc.h> using namespace std; string s; long long sum; int main(){cin>>s;for(int i0;i<s.size();i){sums[i]-0;}cout<<(sum-1)%91; }...

C语言之文件操作上卷(二十一)(逆行人生-2024)

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; ✏️作者主页&#xff1a;枫霜剑客 &#x1f4cb; 系列专栏&#xff1a;C语言知识学习归纳总结&#xff08;逐梦篇专栏合集&#xff09; &#x1f332;上一篇: C语…...

【微服务架构实战】结合实际案例进行微服务架构的设计与实现

微服务架构实战 结合实际案例进行微服务架构的设计与实现 引言 微服务架构&#xff08;Microservices Architecture&#xff09;是一种将大型应用程序拆分成一组小型、独立的服务的方法&#xff0c;每个服务都专注于特定的业务功能&#xff0c;并能够独立开发、部署和扩展。这…...

为什么要有二级指针

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 之前一直疑问为什么要有二级指针&#xff0c;一直没有写这个帖子&#xff0c;今天整理了一下&#xff0c;收获颇丰 二、 2.1 // 增加对二级指针…...

如何保证数据不丢失?(死信队列)

死信队列 1、什么是死信 死信通常是消息在特定的场景下表现&#xff1a; 消息被拒绝访问消费者发生异常&#xff0c;超过重试次数消息的Expiration过期时长或者队列TTL过期时间消息队列到达最大容量 maxLength 2、什么是死信队列 只由死信构成的消息队列是死信队列 死信队…...

树莓派开发笔记01-树莓派的系统烧录以及初次开机配置

github主页&#xff1a;https://github.com/snqx-lqh gitee主页&#xff1a;https://gitee.com/snqx-lqh 本项目github地址&#xff1a;https://github.com/snqx-lqh/RaspberryPiLearningNotes 本项目gitee地址&#xff1a;https://gitee.com/snqx-lqh/RaspberryPiLearningNote…...

微信答题小程序产品研发-后端开发

在开发答题小程序的后端服务和数据库设计时&#xff0c;需要考虑API的设计、数据库模型的构建以及数据的安全性和一致性。 这里我采用了云开发&#xff0c;后端语言是Node&#xff0c;数据库是NoSql&#xff0c;然后我简单整理了各个功能模块的后端开发概要和数据库设计。 1. …...

回溯算法——LeetCode37 解数独

题目 力扣题目链接 思路 卡哥的思路&#xff0c;注意看他解释为什么是“二维回溯”。我的思路&#xff0c;类似y总解决 N 皇后问题时的第二种方法&#xff0c;即从左上到右下枚举棋盘的每个位置。 至于为什么与 N 皇后问题不一样&#xff0c;我认为是因为它每一行不止放一个…...

【CPP】继承语法详解与菱形继承

关于我&#xff1a; 睡觉待开机&#xff1a;个人主页 个人专栏: 《优选算法》《C语言》《CPP》 生活的理想&#xff0c;就是为了理想的生活! 作者留言 PDF版免费提供&#xff1a;倘若有需要&#xff0c;想拿我写的博客进行学习和交流&#xff0c;可以私信我将免费提供PDF版。…...

数据结构(6.2_1)——领接矩阵法

图的存储——邻接矩阵法 邻接矩阵&#xff08;Adjacency Matrix&#xff09;是一种使用二维数组来表示图的方法。在这种表示法中&#xff0c;矩阵的行和列都对应图的顶点。 特点 对于无向图&#xff0c;如果顶点i与顶点j之间有边&#xff0c;则矩阵的第i行第j列&#xff08;…...

诈骗未成功是否构成犯罪?

诈骗未成功不一定构成犯罪。在刑法上&#xff0c;构成诈骗罪需要满足特定的构成要件&#xff0c;包括有非法占有的目的、实施了虚构事实或隐瞒真相的行为、对方因此陷入错误认识并处分财产、行为人或第三方取得财产、被害人遭受财产损失。如果诈骗行为未能成功&#xff0c;即被…...

网络协议栈应用层的意义(内含思维导图和解析图通俗易懂超易理解)

绪论​&#xff1a; “节省时间的方法就是全力以赴的将所要做的事情完美快速的做完&#xff0c;不留返工重新学习的时间&#xff0c;才能省下时间给其他你认为重要的东西。” 本章主要讲到OSI网络协议栈中的应用层的作用和再次在应用层的角度理解协议的具体意义&#xff0c;以及…...

【NXP-MCXA153】i2c驱动移植

介绍 ‌I2C总线由飞利浦公司开发&#xff0c;是一种串行单工通信总线&#xff0c;它主要用于连接微控制器和其他外围设备并在总线上的器件之间传送信息&#xff08;需要指定设备地址&#xff09;&#xff1b;常见的i2c设备有EEPROM、触摸屏、各种IoT传感器、时钟模块等&#x…...

C++(11)类语法分析(2)

C(10)之类语法分析(2) Author: Once Day Date: 2024年8月17日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …...

数字验证每日十问--(3)

深拷贝和浅拷贝的区别&#xff1f; 当只拷贝对象中的成员变量和声明的句柄时&#xff0c;称为浅拷贝。浅拷贝只把对象中的句柄复制了&#xff0c;却没有复制句柄b所指向的对象。这会导致复制后&#xff0c;a2中的句柄b 和 a1 中的句柄b指向同一个对象&#xff0c;如果a2中的句…...

22.给定 n 对括号,实现一个算法生成所有可能的正确匹配的括号组合

22. Generate Parentheses 题目 给定 n 对括号,编写一个函数生成所有可能的正确匹配的括号组合。 例如,当 n = 3 时,可能的组合集合为: ["((()))","(()())","(())()","()(())","()()()" ]题目大意 给出 n 代表生成…...

检测到目标URL存在http host头攻击漏洞

漏洞描述 修复措施 方法一&#xff1a; nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求&#xff0c;如果没有显式定义&#xff0c;则会选取第一个定义的 server 作为 default_server。 server { …...