C++初阶--类与对象(上)

news2024/10/12 7:43:36

一、面向对象(OOP)and 面向过程(POP)

1.面向过程(POP)

面向过程:就像做一道家常菜

想象一下,你要做一道简单的家常菜,比如番茄炒蛋。面向过程的方式就像是这样:

  1. 准备材料:你先把番茄、鸡蛋、油、盐等材料准备好。(这就像是编程中的变量初始化,准备好需要用到的数据。)
  2. 切番茄:你把番茄切成小块,放在碗里备用。(这就像是编程中的一个步骤或函数,完成一个具体的任务。)
  3. 打鸡蛋:你把鸡蛋打入另一个碗里,搅拌均匀。(这又是另一个步骤或函数。)
  4. 炒鸡蛋:你打开煤气灶,倒油入锅,等油热了,把鸡蛋液倒入锅中,翻炒几下,直到鸡蛋变成金黄色,然后盛出来。(这是另一个步骤,完成鸡蛋的炒制。)
  5. 炒番茄:你在同一个锅里再加一点油,等油热了,把切好的番茄块倒入锅中,翻炒几下,加点盐调味。(这是另一个步骤,完成番茄的炒制。)
  6. 混合炒:最后,你把炒好的鸡蛋重新倒回锅里,和番茄一起翻炒几下,让味道充分融合,然后关火,出锅。(这是最后一个步骤,完成整个菜品的制作。)

整个过程就像是一条流水线,每个步骤都是独立的,但又紧密相连,共同完成整个任务。

2.面向对象(OOP)

面向对象:就像使用一台智能厨师机

现在,假设你有一台智能厨师机,它可以自动完成番茄炒蛋的制作。这台厨师机就是一个“对象”。

  1. 设置厨师机:你先把番茄、鸡蛋、油、盐等材料放入厨师机的指定位置。(这就像是给对象设置属性,比如给厨师机指定要用的食材和调料。)
  2. 选择菜单:你在厨师机的控制面板上选择“番茄炒蛋”这个菜单。(这就像是调用对象的方法,告诉厨师机要做什么。)
  3. 启动厨师机:你按下启动按钮,厨师机就开始自动工作了。(这就像是执行对象的方法,厨师机开始按照预设的程序进行烹饪。)

在整个过程中,你不需要关心厨师机内部是如何工作的,只需要设置好材料,选择好菜单,然后启动它就可以了。厨师机会自动完成所有的步骤,包括切番茄、打鸡蛋、炒鸡蛋、炒番茄和混合炒,最后给你一盘美味的番茄炒蛋。

面向对象编程的好处就在于,它可以把复杂的任务分解成一系列相互关联但又独立的对象,每个对象都有自己的属性和方法,可以独立完成一部分任务。这样,我们就可以更加专注于对象之间的交互和协作,而不是陷入到繁琐的步骤和细节中去。

二、C++中的类(初步认识)

在C++的世界里,类(Class)是面向对象编程(OOP)的核心构件。它们为我们提供了一种结构化、模块化的方式来定义和操作数据及其相关行为。接下来我们将从类的基础概念出发,逐步深入探讨C++中类的特性和应用。

1.类的概念

类是一种用户定义的数据类型,它允许我们将数据(属性)和操作这些数据的方法(函数)封装在一起。类是创建对象的蓝图,而对象则是类的具体实例。

2.类的定义

class className
{
    // 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号

 

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。


类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

写一个简单的代码展示:

// 定义一个简单的类  
class Dog 
{
public:
    // 属性  
    std::string name;
    int age;

    // 方法(函数)  
    void bark() 
    {
        std::cout << "Woof! Woof!" << std::endl;
    }
};

int main() 
{
    // 创建类的对象  
    Dog myDog;

    // 设置对象的属性  
    myDog.name = "Buddy";
    myDog.age = 5;

    // 调用对象的方法  
    myDog.bark();

    return 0;
}

上面的例子中,Dog是一个类,它有两个公共属性:nameage,以及一个方法:bark。在main函数中,我们创建了一个Dog类的对象myDog,并设置了它的属性,然后调用了它的方法。

我们会发现这似乎和C语言中的结构体有些相似,但它的函数(方法)居然可以封装在结构体(类)中。很神奇,我们知道C++就是起源于C语言。

所以接下来我们来探讨一下C语言中的结构体和C++中类的区别。

3.类的引入(结构体和类)

C++中的类起源于C语言中的结构体,他们之间存在着密切的联系,同时也有着显著的区别。

0x01.联系

  1. 起源与发展:C语言中的结构体是C++中类的雏形。C++在继承C语言的基础上,对结构体进行了扩展,引入了类的概念。可以说,C++中的类是C语言中结构体的超集或升级版本。
  2. 基本组成:在C语言中,结构体主要用于封装多个不同类型的数据。而在C++中,类同样可以包含数据成员(类似于结构体的成员变量)和成员函数(用于操作这些数据的方法)。因此,从某种程度上说,C++中的类在功能上包含了C语言结构体的所有特性。
  3. 语法兼容性:在C++中,结构体和类在语法上是兼容的。结构体可以包含成员函数和访问控制(如public、private等),这使得结构体在C++中几乎成为了一个简化的类。然而,在C语言中,结构体并不支持这些特性。

0x02.区别

  1. 功能扩展:C++中的类在功能上比C语言的结构体更为丰富。除了包含数据成员外,类还可以包含成员函数、构造函数、析构函数、访问控制(public、private、protected)以及继承和多态等特性。这些特性使得C++的类在面向对象编程中更加灵活和强大。
  2. 访问控制:C语言的结构体没有访问控制的概念,所有成员都是默认的public(即可以被外部访问)。而在C++中,类提供了严格的访问控制机制,可以指定哪些成员是public(公有)、private(私有)或protected(受保护)的。这有助于保护类的内部状态和实现细节不被外部随意访问和修改。
  3. 面向对象特性:C语言是面向过程的编程语言,而C++是面向对象的编程语言。因此,C++中的类不仅包含了数据成员和成员函数,还体现了面向对象的三大特性:封装、继承和多态。这些特性使得C++的类能够更好地模拟现实世界中的对象和关系,从而构建出更加复杂和灵活的程序。

以上不懂的内容,后面都会讲到。接下来我们看一下代码的区别

C语言中的结构体示例: 

// 定义一个结构体  
struct Student 
{
    char name[50];
    int age;
};

void printStudent(struct Student s) 
{
    printf("姓名: %s, 年龄: %d\n", s.name, s.age);
}

int main() 
{
    struct Student stu1;
    strcpy(stu1.name, "张三");
    stu1.age = 20;
    printStudent(stu1);
    return 0;
}

 C++中的类示例

#include <iostream>  
#include <string>  

// 定义一个类  
class Student 
{
public:
    std::string name;
    int age;

    // 成员函数  
    void print() const 
    {
        std::cout << "姓名: " << name << ", 年龄: " << age << std::endl;
    }
};

int main() 
{
    Student stu1;
    stu1.name = "张三";
    stu1.age = 20;
    stu1.print(); // 调用成员函数来打印学生信息  
    return 0;
}

4.成员函数命名规则

class Date
{
public:

	void Init(int year,int month,int day)
	{

	}

	int year;
	int month;
	int day;
};

 这时我们会发现成员变量和参数名一样,那么我们访问year的时候到底是成员变量里的,还是成员方法里的呢?

所以:

为了能够更好的区分哪个是成员变量,我们在定义成员变量名时可以给它们做一些标记:

下面是几种常见的表示为成员变量的 "风格" :

  • 前面加斜杠 :char _name[10];
  • 后面加斜杠: char name_[10];
  • 前面加个 m (表示成员 member):char mname[10];
  • …… (这里并没有明确的规定,不同的公司有不同的风格)
class Date
{
public:

	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	int _year;
	int _month;
	int _day;
};

这样就可以明确区分开来了。 

三、类的访问限定符及封装

引入:

class Date
{
//public:

	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	int _year;
	int _month;
	int _day;
};


int main()
{
	Date D1;
	D1.Init(1, 2, 3);
	return 0;
}

运行结果:

 我们把public干掉,这段代码就出现了错误。为什么呢,C语言中的结构体好像不会这样啊?

谈到这个,那么我们这里就不得不谈一下C++中封装与访问限定符的概念了。

在C++编程中,类和对象是面向对象编程(OOP)的核心概念。类的定义不仅包含了对象的属性和方法,还通过访问限定符来控制这些属性和方法的访问权限。接下来将深入探讨C++中的访问限定符(public、protected、private)以及封装的概念。

1.访问限定符

C++中有三种访问限定符:

  1. public(公有):被声明为public的成员可以在类的内部和外部被访问到。
  2. protected(保护):被声明为protected的成员可以在类的内部被访问到,但不能在类的外部被直接访问。但是,它可以被继承该类的派生类访问。
  3. private(私有):被声明为private的成员只能在类的内部被访问到,不能在类的外部和派生类中被直接访问。

默认情况下,类的成员的访问级别为private,这就是我们刚才为什么会报错的原因。而结构体的成员的访问级别为public(因为struct要兼容C)。

代码演示:

class Date
{
public:

	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

private:
	int _year;
	int _month;
	int _day;
};


int main()
{
	Date D1;
	D1.Init(1, 2, 3);
	return 0;
}

访问限定符的范围:

访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。

 如果后面没有访问限定符,作用域就到类结束为止。

 

注意:

        访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别 。

        我们一般在定义类的时候,建议明确定义访问限定符,不要用 struct / class 的默认的访问权限。

【面试题】 问题:C++中struct和class的区别是什么? 

解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来 定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类 默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别,后序给大家介绍。

2.封装的概念

封装是面向对象编程的三大特性之一(封装、继承、多态)。封装将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。通过封装,可以保护数据不被外部直接访问和修改,提高代码的安全性和可维护性

封装的本质是一种管理,让用户更方便地使用类,而不必理解类中繁杂的数据关系。通过封装,可以明确规定哪些成员是对外公开的,哪些是内部实现细节,从而提高了程序的模块化和封装性。

四、类的作用域和实例化

 1.类定义的两种方式

 声明和定义在一起

这种方式中,类的声明和定义都在同一个文件中完成,通常是在类的声明部分直接包含成员函数的实现。这种方式适用于小型项目或简单的类定义。

#include <iostream>
#include <string>  

using namespace std;
class Student {
public:
	void Init(const char* name, int age, int id) 
	{
		strcpy(_name, name);
		_age = age;
		_id = id;
	}
	void Print() 
	{
		cout<< _name << " " << _age << " " << _id << endl;
	}

private:
	char _name[10];
	int  _age;
	int  _id;
};

 声明和定义分离

这种方式中,类的声明和定义是分离的。类的声明通常放在一个头文件(.h.hpp)中,而类的定义(成员函数的实现)则放在一个源文件(.cpp)中。这种方式适用于大型项目或复杂的类定义,有助于代码的组织和维护。

test.h

class Student 
{
public:
	void Init(const char* name, int age, int id);
	void Print();

private:
	char _name[10];
	int  _age;
	int  _id;
};

test.cpp

#include "test.h"

void Student::Init(const char* name, int age, int id)
{
	strcpy(_name, name);
	_age = age;
	_id = id;
}

void Student::Print() 
{
	cout << _name << " " << _age << " " << _id << endl;
}

 函数前的 :: 是什么?j接下来我们来解决这个问题。

 2.类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。

在类外定义成员,需要使用作用域解析符 : : 来指明成员属于哪个类域。 

在C++中,类的作用域与命名空间(Namespace)的作用域是相似的。它们都是为了防止命名冲突而设计的。当你定义一个类时,你实际上是在创建一个新的命名空间,这个命名空间包含了类的所有成员。

然而,与命名空间不同的是,类的作用域还包含了封装的概念。这意味着,除了通过类的接口(public成员)进行访问外,类的内部实现(privateprotected成员)对外部代码是不可见的。

 3.类的实例化

先要说清楚的是:类本身是没有存储空间的

通过类建立出对象,即实例化,才会有实际的存储空间

class Person
{
public:
	void printper()
	{
		cout << name << endl;
	}
private:
	char* name;
};

int main()
{
	Person.name = "byte";//编译报错,因为还没有实例化对象
	Person P;
	return 0;
}

若没有实例化对象P
这个class类是不会开辟空间的!

五、类对象模型

1.如何计算类的大小

在C++中,类的存储大小计算是一个相对复杂的过程,它涉及多个因素,包括成员变量、成员函数、静态成员、虚函数、继承关系以及内存对齐等。我们这里只举一些简单的列子。

class Person
{
public:
	//显示基本信息
	void Print()
	{
		cout << _name << "-" << _gender << "-" << _age << endl;
	}
public:
	char* _name;  //姓名
	char* _gender;   //性别
	int _age;     //年龄
};

2.类对象的存储方式猜测

猜测一:对象中包含类的各个成员

缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同的代码保存了多次,浪费空间。

猜测二:只保存成员变量,成员函数存放在公共的代码段。

 对于上述两种存储方式,计算机是按照哪种方式来存储的,我们可以通过对下面的不同对象分别获取大小来进行分析:

// 类中既有成员变量,又有成员函数
class A1 
{
public:
	void f1() {}
private:
	int _a;
};
// 类中仅有成员函数
class A2 
{
public:
	void f2() {}
};
// 类中什么都没有---空类
class A3
{};

int main()
{
	cout << sizeof(A1) << endl;
	cout << sizeof(A2) << endl;
	cout << sizeof(A3) << endl;

	return 0;
}

通过单目操作符sizeof来获取这三个对象的大小,结果A1的大小为4个字节,A2的大小为1个字节,A3的大小也为1个字节。

结论:一个类的大小,实际就是该类中“成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类(占位)。 

结构体内存对齐规则
第一个成员在与结构体变量偏移量为0的地址处。(即结构体的首地址处,即对齐到0处)
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
对齐数 = 该结构体成员变量自身的大小与编译器默认的一个对齐数的较小值。

不明白如何计算结构体大小点击这个:结构体详解

六、this指针

引入:

#include <iostream>
using namespace std;
class Date
{
public:
	void Display()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	void SetDate(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year; 
	int _month; 
	int _day;
};


int main()
{
	Date d1, d2;//实例化两个日期类
	d1.SetDate(2020, 10, 25);//设置d1的日期
	d2.SetDate(2024, 10, 26);//设置d2的日期
	d1.Display();//打印d1的日期
	d2.Display();//打印d2的日期
	return 0;
}

运行结果:

这里我们思考一个问题:

Date 类中有 SetDate 和 Display 两个成员函数,函数体中没有关于不同对象的区分,那当 d1 调用 Display函数时,这个 Display函数是如何知道要打印 d1 对象的?而不是去打印 d2 对象呢?

 

 地址一样,说明确实是调用的同一个函数。

 这里看似有三个参数,实际上还有一个隐藏的this指针。

C++ 通过引入 this 指针解决该问题。

C++ 编译器给每个 "非静态的成员函数" 增加了一个隐藏的指针参数,

让该指针指向当前对象(函数运行时调用该函数的对象),它是系统自动生成的,

在函数体中所有成员变量的操作,都是通过该指针去访问。

只不过所有的操作对程序员来说是透明的,不需要程序员自己来传递,编译器自动帮你去完成

 我们看到的:

实际调用的:

 ​​​​​​

this指针的类型是类的类型的指针,而且是const(修饰的是指针指向的内容,而不是指针本身)。这意味着我们不能修改this指针的值,它只能指向对象本身。

this指针特性:

① this 指针的类型:  类类型* const

② this 指针只能在 "成员函数" 的内部使用。因此,在创建一个对象后,也不能通过对象使用this指针。

③ this 指针本质上是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给 this 形参。所以对象中不存储 this 指针。

④ this 指针是成员函数第一个隐含的指针形参,一般情况由编译器通过 ecx 寄存器自动传递,不需要用户传递。

⑤static静态成员函数不能使用this指针:静态成员函数属于类,而不属于某个对象,所以静态成员函数没有this指针。

⑥this指针的构造和清除:this指针在成员函数的开始执行前构造,在成员函数的执行结束后清除。这个过程由编译器实现,程序员不需要关心。



 本篇博客到此结束,如有错误之处,望各位在评论区指正~,谢谢啦

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

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

相关文章

单片机教案 2.2 ATmega2560单片机闪烁灯的制作和编程

2.1 单片机教案 2.1 ATmega2560单片机最小应用系统-CSDN博客 2.2 ATmega2560单片机闪烁灯的制作和arduino编程 ATmega2560单片机闪烁灯的制作和Arduino编程是一个经典的嵌入式系统设计案例。以下将分别介绍使用ATmega2560单片机直接编程和使用Arduino平台&#xff08;基于ATm…

[已解决]DockerTarBuilder永久解决镜像docker拉取异常问题

前阵子发现阿里云的docker加速镜像失效了&#xff08;甚至连nginx都拉取不了&#xff09;&#xff0c;重新换了并且加多了网络上比较常用的dokcer加速源&#xff0c;可以解决一部分问题&#xff0c;但仍然有一些镜像的某个版本或一些比较冷的镜像就是拉取不了&#xff0c;原因未…

分组相关 -- VPLS

VPLS&#xff08;Virtual Private LAN Service&#xff0c;虚拟专用局域网服务&#xff09;是IETF定义的以太网多点到多点业务模型&#xff0c;其通过MPLS-TP网络连接地域上相互隔离的多个LAN网络&#xff0c;为用户提供MP2MP和P2MP业务。 业务模型 VPLS是以MPLS技术实现传送…

Java创建型模式(二)——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式、工厂模式扩展等完整详解,附有代码——案例)

文章目录 五.工厂模式5.1 概述5.2简单工厂模式5.2.1 概述5.2.2 结构5.2.3 实现5.2.4 优缺点5.2.5 扩展—静态工厂 5.3 工厂方法模式5.3.1概述5.3.2 结构5.3.3 实现5.3.4 优缺点 5.4 抽象工厂模式5.4.1 概述5.4.2 结构5.4.3 实现5.4.4 优缺点5.4.5 使用场景 5.5 工厂模式扩展 五…

基于YOLO11/v10/v8/v5深度学习的安检X光危险品检测与识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

深度学习之常用数据集下载

在复现他人代码的过程中&#xff0c;有时需要下载数据集&#xff0c;才可跑通模型&#xff0c;但部分数据集在网上难以收集或是通过翻墙的手段才可获取。于是&#xff0c;在此总结了一些数据集的收集。 1、方法一&#xff1a;Kaggle官网下载 之前有推荐kaggle(Kaggle官网网址…

每日论文19-10GHz处相噪能达到-138dBc/Hz@1MHz串联谐振VCO

《Series-Resonance BiCMOS VCO with Phase Noise of -138dBc/Hz at 1MHz Offset from 10GHz and -190dBc/Hz FoM 》2022ISSCC 不用并联谐振了&#xff0c;用串联谐振&#xff0c;能在相噪性能上获得更极端地提升。 假设有源电路的噪声因子F相同&#xff0c;LC-tank的质量因子…

QD1-P17 HTML 下拉框标签(select、option)

本节学习 HTML 常用标签&#xff1a;select和option ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p17 ‍ 知识点1&#xff1a;select标签用法 演示 ​​ HTML <select name"city"><option>北京</option><option>上海</opti…

【STM32CubeMX开发】-1-GPIO:点亮一个LED,以及按键KEY的捕获

案例背景&#xff1a; 我们将实现这样一个效果&#xff1a;按下按键KEY&#xff0c;点亮LED灯&#xff1b;松开按键KEY&#xff0c;熄灭LED灯。 KEY需配置为上拉输入&#xff1b;LED需配置为推挽输出。 目录 1 STM32CubeMX中配置 – GPIO 1.1 PIN引脚配置 1.2 GPIO配置 1…

三款GIS工具多角度对比:免费的倾斜摄影OSGB/3Dtiles编辑转换发布平台

GIS数据处理工具在现代技术与应用中扮演着至关重要的角色&#xff0c;它们不仅是连接原始地理信息与可分析、可视化数据的桥梁&#xff0c;更是推动地理信息系统&#xff08;GIS&#xff09;在各个行业领域深入发展与应用不可或缺的关键工具。选择一款合适的工具直接关系到数据…

电汽车充电革命:充电桩的过去现在与未来

电动汽车充电革命&#xff1a;中国充电桩行业的过去、现在与未来 一、发展历程概述 中国充电桩行业的发展历程可划分为以下几个阶段&#xff1a; 1. 初始期&#xff08;2006-2008年&#xff09;&#xff1a;在此阶段&#xff0c;国家队主导市场&#xff0c;主要参与者包括国…

《智慧博物馆:科技与文化的完美融合》

《智慧博物馆&#xff1a;科技与文化的完美融合》 一、智慧博物馆的兴起与发展 随着科技的飞速发展&#xff0c;智慧博物馆应运而生。进入新时代&#xff0c;大数据、人工智能、信息化的进步以及智能产品的应用&#xff0c;改变了人们接收信息和学习的习惯。为顺应社会变革&am…

alter system reset scope sid不要随便加 查询视图

全局变量 写全比较稳妥 set的时候自动加both &#xff0c; reset时不是自动both Applies to: Oracle Database - Enterprise Edition - Version 11.2.0.4 and later Information in this document applies to any platform. Symptoms When the OPTIMIZER_FEATURES_ENABLE p…

Apifox「动态值」全新升级:灵活mock类型的数据

在使用 Apifox 进行接口测试时&#xff0c;你可能不希望将接口参数的值固定&#xff0c;也不想每次发送请求时手动修改数据&#xff0c;而是希望参数值能够自动变化&#xff0c;并且这个参数值能够符合真实场景中的数据需求。比如&#xff0c;你可能需要随机生成数字、字符串、…

90、Python之鸭子类型:for循环的本质,进一步解析迭代协议

引言 在前面的文章中&#xff0c;我们简单介绍了Python中的可迭代对象、迭代器、以及迭代协议的概念。今天就for这个用得特别多&#xff0c;觉得很熟悉很简单的语法结构&#xff0c;稍微展开一下&#xff0c;从而更好地加深对迭代协议的理解。 本文的主要内容有&#xff1a; …

<<迷雾>> 第11章 全自动加法计算机(1)--比特单元 示例电路

具有唯一输入/输出线的存储器 info::操作说明 读取时, 将 读R 开关闭合即可, Q 的输出将通过传输门 G 到达输出 DB 处 写入时, 首先将 写W 开关闭合, 再将上方为测试引入的开关闭合, 此时此高电平将写入 Q 之后断开 写W 的开关, 写入状态结束, 之后可将上方为测试引入的开关断开…

使用MySQL API 进行多线程数据库增删改查操作

使用MySQL API 进行多线程数据库增删改查操作 准备工作安装MySQL Connector/C包含必要的头文件初始化MySQL连接增删改查处理插入数据删除数据更新数据查询数据主函数注意事项在现代的应用程序中,数据库操作往往是性能的关键瓶颈之一。为了提高数据库操作的效率,多线程技术被广…

LeCun数十年经验之谈:视觉是建立AGI的核心,视频理解难点在哪?语言模型技术为何难以复用于视觉?

文字来源 | 夕小瑶科技说 AI寒武纪 大语言模型&#xff08;LLM&#xff09;已经接近人类水平&#xff0c;但视觉理解在世界范围似乎尚未突破&#xff0c;那么为何不能直接将LLM技术用于视觉&#xff1f;让AI看视频的难点在哪&#xff1f;如果语言是AGI必要的能力&#xff0c;为…

Flink 批作业如何在 Master 节点出错重启后恢复执行进度?

摘要&#xff1a;本文撰写自阿里云研发工程师李俊睿&#xff08;昕程&#xff09;&#xff0c;主要介绍 Flink 1.20 版本中引入了批作业在 JM failover 后的进度恢复功能。主要分为以下四个内容&#xff1a; 背景解决思路使用效果如何启用 Tips&#xff1a;点击「阅读原文」跳转…

数据结构实验:用栈求解迷宫问题的所有路径及最短路径

用栈求解迷宫问题的所有路径及最短路径 题目描述 编写一个程序exp3-5.cpp,改进《教程》3.1.4节中的求解迷宫问题程序,要求输 如图3.9所示的迷宫的所有路径,并求第一条最短路径及其长度。 在本实验中用mg作为迷宫数组,用St数组作为顺序栈,Path数组保存一条迷宫径,将它们都设置为…