Ada 语言学习(3)复合类型数据——Array

文章目录

  • Array
    • 数据类型声明
    • 数组索引
    • 数组范围
    • 数组复制
    • 数组初始化
      • 直接赋值
      • 通过拷贝赋值
        • 不同索引范围但长度相等
        • 非指定类型边界收缩
    • 多维数组
    • 数组遍历
    • 数组切片
    • 访问和动态检查
      • 直接访问
      • 动态检查
    • 数组字面量 Array literal
    • 数组拼接
      • 两个数组拼接
      • 数组和单个值拼接
    • Array Equality(数组相等判定)
    • 数组遍历
      • 通过索引遍历(循环变量I不可更改)
      • 直接遍历所有的对象 object(对象可以被更改)
    • 二维数组
    • 高维数组
  • Definite / indefinite types (定义类型和非定义类型)
    • String 字符串
    • 数组的默认值
    • Definite type (定义类型)
    • Indefinite type(非定义类型)
      • unconstrained type(未指定类型)
      • Generic type(泛型类型)
  • 练习

Array

数据类型声明

  • 在 Ada 中,可以使用 type 关键字声明数组类型,指定元素类型和维度 。例如:
    在这里插入图片描述
type IntArray is array(1 .. 10) of Integer;

数组索引

  • 数组中的索引是从 1 开始,默认情况下不支持从 0 开始,可以使用索引来访问数组的特定元素:IntArray(3) 表示 IntArray 数组的第 3 个元素。

数组范围

  • 数组的范围由其类型的索引范围定义。例如,IntArray 的索引范围是从 110

数组复制

在这里插入图片描述

  • 这里将 A2 的值复制给了 A1 但是, A1, A2 仍然是独立的两个数组, 在其他的编程语言中(有的是指向引用,但是 ada 不会这样,所有的 ada 复制都是 deep copy 操作)
  • 但是要求这两个数组的类型长度 必须是一致的。
    在这里插入图片描述
  • 在上面的复制中, A2 的内容复制给了 A1 ,因为虽然他们的索引范围不同,但是会对应复制,例如 A2(11) = A1(1) 以此类推
  • 但是 A3 的长度和 A1 不同,因此无法复制

数组初始化

  • 可以使用 := 运算符在声明数组时对其进行初始化,或者可以使用赋值语句逐个赋值。例如:

直接赋值

```ada
IntArray: IntArray := (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
```

通过拷贝赋值

不同索引范围但长度相等

在这里插入图片描述

  • 在上面的例子中,我们使用 非定义类型 的方式声明了一个类型 T,这是一个数组类型,但是 T 的范围我们并不知道,只知道 T 中的元素都是整数而已。
  • 同时 A1 数组是 T 类型,并且包含了 10 个元素,索引范围是 1-10
  • A2 数组也是 T 类型,并且包含了 10 个元素,索引范围是 11-20, 但是她复制了 A1 的值,虽然现在我们并不知道 A1 的值是什么。
  • 如果后面我们对 A1 的值进行修改,那么 A2 的值实际上并不会改变,因为 ada 的赋值是深拷贝
type T is array (Integer range <>) of Integer;
A1: T (1 .. 10);
A2: T (1 .. 10);

-- Fill A1 with some data.
for I in A1'Range loop
   A1(I) := I;
end loop;

-- Copy A1 to A2.
A2 := A1;

-- Change the value of A1(1)
A1(1) := 99;

-- Now, A1(1) is 99, but A2(1) is still 1.

非指定类型边界收缩

在这里插入图片描述

  • 如上图,如果 A1 是一个 T,并且 A1 数组的元素索引就是从 1-10,而这时,A2 复制了 A1 的值,虽然 A2 仍然是 T 类型(非定义类型),但是她也会复制 A1 的索引范围。

多维数组

  • Ada 支持多维数组的声明和操作。可以通过指定多个维度来声明多维数组,例如:
type Matrix is array(1 .. 3, 1 .. 3) of Integer;

数组遍历

可以使用 for 循环结构遍历数组中的元素。例如:

for i in IntArray'Range loop
   Put_Line(Integer'Image(IntArray(i)));
end loop;

数组切片

  • 可以使用数组切片(array slice)来访问数组的子集。切片允许通过指定范围来提取数组的一部分。例如:

    SubArray: IntArray := IntArray(3 .. 6);
    
    • SubArray 将包含 IntArray 数组索引为 3 到 6 的元素。
      在这里插入图片描述
  • 虽然在 copy 的时候,不同长度的 array 不能进行 copy 行为,但是我们可以 copy 其中的一部分。

  • 上图中 A2 的前 10 个元素复制给了 A1,然后 A12-4 索引的元素又获得了 A25-7 索引元素的值。

访问和动态检查

直接访问

  • ada 中的数组中的元素可以被直接访问:
    在这里插入图片描述
    • 这里定义了一个数组 V,他的索引范围是 1..10, 因此可以直接取 V(1)

动态检查

  • 数组会被进行动态检查:
    在这里插入图片描述
    • 因为这里的 V(0) 中的 0 并没有被覆盖在定义的索引范围中,因此这样是一种越界行为

数组字面量 Array literal

  • 可以使用 array literals(数组字面量) 来初始化数组或者赋值给数组。数组字面量是由一系列逗号分隔的值,这些值被括在括号内。

  • 例如,可以使用数组字面量来初始化一个数组:

    type T is array (1 .. 5) of Integer;
    A : T := (1, 2, 3, 4, 5); -- array literal
    
  • 在这个例子中,(1, 2, 3, 4, 5) 是一个数组字面量,用来初始化数组 A。

  • 也可以使用数组字面量来给数组赋值:

    A := (6, 7, 8, 9, 10); -- array literal
    
  • 此外,Ada 语言还提供了 others 关键字来初始化或赋值数组中剩余的所有元素:

    A := (1, 2, others => 3); -- array literal with 'others'
    

在这里插入图片描述

  • 需要特别注意的是:在使用数组字面量进行初始化的时候,要注意分清楚下面的情况:
    在这里插入图片描述
    • V1 虽然是一个 非指定类型 的数组,但是由于其索引就只有 3 个,因此我们可以使用 others 来为 V1 中的所有的元素赋值
    • 但是 V2 没有指定元素的个数,而直接使用 others 这种情况在 ada 中是不被允许的

数组拼接

两个数组拼接

在这里插入图片描述

  • 通过 & 符号,可以直接拼接两个一维的数组

那现在就有疑问了,假设 A1 的索引范围是 (1..10)A2
的索引范围是 (8..12),那么 A3 作为 A1 & A2 的结果,索引范围应该会是什么样子?

  • 其实是这个完全不需要担心,因为再给 A3 赋值之前,我们需要先定义 A3 的索引,例如下面的代码:
type T is array (Integer range <>) of Integer;
A1: T (1 .. 10);
A2: T (8 .. 12);
A3: T (1 .. 15);  -- The range of A3 should be the total length of A1 and A2.

-- Fill A1 and A2 with some data.
for I in A1'Range loop
   A1(I) := I;
end loop;

for I in A2'Range loop
   A2(I) := I;
end loop;

-- Concatenate A1 and A2.
A3 := A1 & A2;
  • 可以看到,其实我们只需要关注 A3 的元素个数即可,而不用担心元素的索引。

数组和单个值拼接

在这里插入图片描述

Array Equality(数组相等判定)

在这里插入图片描述

  • 数组的 size 需要相等
  • 数组中的每个元素都必须相等
  • 数组的类型必须相等
  • 数组的索引范围不影响数组的相等判定
    type T is array (Integer range <>) of Integer;
    
    A1 : T (1 .. 3) := (1, 2, 3);
    A2 : T (2 .. 4) := (1, 2, 3);
    
    -- This will print "Equal"
    if A1 = A2 then
       Put_Line("Equal");
    else
       Put_Line("Not Equal");
    end if;
    

数组遍历

通过索引遍历(循环变量I不可更改)

在这里插入图片描述

  • 使用 A 数组的 Range 属性来得到所有的索引,并进行遍历
  • 但是使用的循环变量 I 是不可以被修改的

直接遍历所有的对象 object(对象可以被更改)

在这里插入图片描述

  • 使用 of 关键字
  • 如果我在循环中更改了 V (如上图)那么这个 V 就会切实地被更改成 0

二维数组

在这里插入图片描述

高维数组

type T1 is array (Integer range <>) of Integer;
type T2 is array (Integer range <>) of T1 (0 .. 2); -- specify the range of T1 here

V: T2 (1 .. 10);
begin
    V (1)(0) := 0; -- Now this is OK.
end;
  • 在这段代码中,V 是一个 T2 类型的数组,其中每个元素都是一个 T1 类型的数组。T1 类型的数组的范围是 0 .. 2,因此 V (1)(0) := 0; 这行代码现在是正确的,它将 V 的第1个元素(一个 T1 类型的数组)的第0个元素设置为 0
  • 在定义一个多维数组的后面的维度的时候,需要将前面的维度都定义好

所以这是一个几行几列的数组?

  • 类型 T2 定义为 type T2 is array (Integer range <>) of T1 (0 .. 2);,其中每个元素都是一个 T1 类型的数组(这里,T1 的范围是 0 .. 2,因此 T1 类型的数组有3个元素)。

因此,当你声明 V: T2 (1 .. 10); 时,你正在创建一个有10行、每行3列的二维数组。具体来说,这是一个10行3列的数组。

对于一个 ada 中的 2维数组 V, 那么 V(0)(1) 和 V(0,1) 是相等的么

  • 是的,V(0)(1)V(0,1) 在 Ada 中是等价的。它们都是用来访问二维数组 V 中的特定元素。具体来说,它们都访问的是 V 的第 0 行第 1 列的元素。V(0,1) 的写法可能在阅读和理解代码时更清晰,因为它明确表示了这是一个二维索引,而 V(0)(1) 则可能需要更多的解析才能理解。

Definite / indefinite types (定义类型和非定义类型)

在这里插入图片描述

String 字符串

  • 在 Ada 语言中,字符串被视为一种特殊类型的数组,其索引是 Positive 范围的整数(也就是从 1 开始的整数),而元素类型是 Character。这意味着可以像处理其他数组一样来处理字符串,比如用下标来访问特定字符,或者用 'Length 属性来获取字符串的长度。
S : String := "Hello, world!";
Put_Line("The first character is: " & S(1));
Put_Line("The length of the string is: " & Integer'Image(S'Length));
  • 此外,还要注意的是 Ada 中的字符串是不可变的。也就是说,一旦一个字符串被创建,就不能修改它的内容。不过,可以通过字符串拼接操作(用 & 运算符)来创建新的字符串。比如:
S1 : String := "Hello";
S2 : String := ", world!";
S3 : String := S1 & S2;  -- S3 is now "Hello, world!"
  • 但如果你需要一个可变的字符串,你可以使用 Unbounded_String 类型,这是 Ada 的标准库 Ada.Strings.Unbounded 中提供的一种类型。Unbounded_String 类型的对象可以通过 To_Unbounded_String 函数从普通字符串创建,可以用 To_String 函数转回普通字符串,也可以用 &= 运算符来修改内容。
    在这里插入图片描述

数组的默认值

  • 在 Ada 语言中,当你声明一个数组但不给它赋初始值时,数组的元素将不会被自动初始化为默认值。相反,数组元素的初始值是不确定的。这与许多其他编程语言有所不同,这些语言可能会给新的数组元素自动赋予默认值。

  • 如果你想给数组的所有元素赋予相同的初始值,你可以使用 (others => value) 语法,其中 value 是你想要赋予的初始值。例如,以下代码将创建一个浮点数数组 A,并将其所有元素初始化为 0.0

    type T is array (Integer range <>) of Float;
    A : T (1 .. 10) := (others => 0.0);
    
  • 请注意,(others => value) 只能用于初始化数组。如果你在后续的代码中想要修改数组的所有元素,你需要使用一个循环来遍历数组并为每个元素赋值。

  • 当然也可以强迫数组拥有默认值:
    在这里插入图片描述

  • 为了性能考虑,上述代码一般不会使用

Definite type (定义类型)

  • 定义类型是通过使用 type 关键字显式定义的类型。它们是具体的类型,具有明确定义的结构和语义。定义类型可以是基本类型(如 Integer、Float、Boolean)或派生类型(通过限定范围、枚举、数组等方式创建的类型)。例如:

    type MyInteger is range 1 .. 10;
    

Indefinite type(非定义类型)

  • 非定义类型是一种未具体定义的类型,它们是一种抽象概念,没有具体的结构和语义。它们通常用作模板或占位符,在需要时可以被实例化为具体的类型

  • Ada 中的非定义类型包括未指定类型(unconstrained type)和泛型类型(generic type)。

unconstrained type(未指定类型)

  • 未指定类型:未指定类型是一种可以通过参数传递进行实例化的占位符类型。它们在声明时不指定范围或大小,需要在使用时提供具体的值或范围。

      ```ada
      type MyUnconstrainedArray is array (Positive range <>) of Integer;
      ```
    
    • 在上述示例中,MyUnconstrainedArray 是一个未指定类型的数组类型,可以根据实际需要传递不同的范围进行实例化。
    • Positive 被用作 array 的索引范围。通过使用 Positive range <>,表示数组的索引可以是任意的正整数范围。
    • 例如,可以将 MyUnconstrainedArray 实例化为索引范围为 1 到 100 的数组:
      MyArray : MyUnconstrainedArray(1 .. 100);
      
    • 使用 Positive 子类型作为数组索引范围的好处是,它可以确保索引始终是正整数,符合实际需求,并提供了类型安全性。

Generic type(泛型类型)

  • 泛型类型是一种可以根据参数化的类型或值来创建通用代码模板的类型。它们在定义时可以指定一个或多个参数,然后在使用时提供具体的参数值来实例化
    例如:

    generic
       type ElementType is private;
    package Stack is
       type Stack_Type is private;
       procedure Push(Item : in ElementType);
       function Pop return ElementType;
       ...
    end Stack;
    
  • 在上述示例中,Stack 是一个泛型包(generic package),使用了一个参数 ElementType。这个参数 ElementType 可以是任意类型,它在使用时可以通过传递具体的类型来实例化。也就是说,可以使用不同的类型来创建不同类型的堆栈。

  • 例如,可以使用 Stack 泛型包创建一个整数类型的堆栈:

    package Integer_Stack is new Stack(ElementType => Integer);
    

非定义类型 (indefinite types) 的灵活性和可扩展性使得它们在处理通用数据结构和算法时非常有用。通过使用非定义类型,可以编写更通用和可复用的代码,适应不同的数据类型和需求。

练习

在这里插入图片描述
在这里插入图片描述

  • 这种情况的类型定义没问题,但是没有限定数组的大小,因此会报错

在这里插入图片描述

  • 从结构上来说,他们都是长度为 3 的数组,
  • 但是他们不是同一个 type,虽然他们的 type 定义看起来完全一样的,但是却并不符合数组复制的要求

在这里插入图片描述

  • 在 Ada 中,数组的默认索引起始值是 1,而不是像一些其他语言(如 C 或 Python)那样是 0。因此,V (0) 是无效的,会导致范围错误。

  • 在代码中创建了一个名为 V 的数组,类型为 T,并将其初始化为 (1, 2, 3)。这将创建一个包含三个元素的数组,这些元素的索引是 1、23

在这里插入图片描述
在这里插入图片描述

  • 开始 X=10 ,即,V1 创建出来的时候具备 10 个元素
  • 虽然后来 X 的值修改为 100,但是 V1 已经固定了,
  • 因此可以直接将 V2 复制给 V1

在这里插入图片描述

  • 从定义中我们只知道 V1 的索引范围是 1-3 并且给定了 3 个值
  • 同时我们知道 V2 的值也是 (10, 20, 30)
  • 但是定义中并没有明确指定 V2 的 boundary,也就是索引范围,因此我们并不能够盲目推测
  • 也就是当 I=1 时,我们无法确定 V2 的值,对 V2来说,因为没有给定 boundary,所以 V2 的第一个索引其实是 -2^16(也就是 integer 类型中最小的数)

在这里插入图片描述

  • 这里是通过 definite 的方式来定义数组, Tboundary 固定为 1-10,因此不能被随意改变,如果这里使用的是 indefinite 的形式,例如 type T is array(Integer range<>) of Integer 那么在定义 V 的时候是可以更改 boundary

在这里插入图片描述

  • 在 Ada 中,String 是一种预定义的数组类型,其元素类型为 Character。在 Ada 中,没有直接创建字符串数组的方式。通常,你会创建一个数组,它的元素类型是固定长度的字符串,或者是 Unbounded_String
  • 同时,如果创建一个字符串,那么对于索引类型 Integer range <> 也要更改为 Positive range <> 因为在 Ada 中,String 是一种特定类型的数组,其索引类型是 Positive

如果你想创建一个可以存储任意长度字符串的数组,你可以使用 Ada.Strings.Unbounded.Unbounded_String 类型。这个类型可以存储任意长度的字符串,并提供了一些实用的操作。以下是一个示例:

	with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
	type String_Array is array (Integer range <>) of Unbounded_String;
  • 如果你只需要处理固定长度的字符串,你可以这样定义:
	type String_Array is array (Integer range <>) of String (1 .. Max_Length);
  • 在这个例子中,Max_Length 是一个你预先定义的常量,表示字符串的最大长度。这种方式的限制是所有的字符串都必须有相同的长度,而且这个长度是在编译时决定的。

在这里插入图片描述

  • 在 Ada 中,Default_Component_Value 属性应用于类型标签,并将默认值分配给类型的每个实例的组件。但是,此默认值必须是编译时可以确定的值,不能是变量。以上代码中,尝试将变量 X 作为默认组件值,这是不允许的。

  • 如果希望每个数组元素的默认值为 0,那么应该直接使用数值 0,而不是变量 X。下面是修改后的代码:

    type T is array (Integer range <>) of Integer with Default Component Value => 0;
    V: T(1 .. 10);
    
  • 如果 X 的值在编译时可以确定,那么也可以使用常量来替代变量,如下:

    X: constant Integer := 0;
    type T is array (Integer range <>) of Integer with Default Component Value => X;
    V: T(1 .. 10);
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot【开发实用篇】---- 整合第三方技术(消息)

SpringBoot【开发实用篇】---- 整合第三方技术&#xff08;消息&#xff09; 消息的概念Java处理消息的标准规范JMSAMQPMQTTKafka 购物订单发送手机短信案例订单业务短息处理业务 SpringBoot整合ActiveMQ安装整合 SpringBoot整合RabbitMQ安装整合&#xff08;direct模型&#x…

加密解密软件VMProtect教程(六):主窗口之控制面板“项目”部分(2)

VMProtect 是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…

solidworks2020及麦迪工具箱安装

1、麦迪工具箱安装 1&#xff09;下载 下载链接&#xff1a;www.maidiyun.com/download 下载今日制造 2&#xff09;安装 由于电脑上安装了杀毒软件&#xff0c;会直接删除解压后的安装包&#xff0c;因此需要关闭杀毒软件或者在被删除后进入杀毒软件的隔离区将该文件添加…

Tomcat安装与使用

Tomcat 是HTTP服务器&#xff0c;用于使用HTTP协议。 1、下载Tomcat 下载链接&#xff1a;https://tomcat.apache.org/ 进入官网后&#xff0c;根据自己想要下载的版本进行下载&#xff0c;我这里选择下载的版本是Tomcat 8. 点击选择自己想要下载的对应版本&#xff0c;下载Z…

Netty入门

Netty入门 1. 概述 1.1 Netty是什么&#xff1f; Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.以上片段摘自官网&#xff0c;Netty 是一个异步的、基于事…

三十六、链路追踪、配置中心

1、链路追踪 在一次调用链路中&#xff0c;可能设计到多个微服务&#xff0c;如果在线上&#xff0c;某个微服务出现故障&#xff0c;如何快速定位故障所在额微服务呢。 可以使用链路追踪技术 1.1链路追踪介绍 在大型系统的微服务化构建中&#xff0c;一个系统被拆分成了许多微…

chatgpt赋能Python-python3_排序

Python3 排序指南&#xff1a;介绍、说明和实践 Python3是当今最受欢迎的编程语言之一&#xff0c;拥有许多可用于各种任务的库和框架。其中之一是它自带的排序函数&#xff0c;在数据分析和机器学习等领域中非常有用。 在本篇文章中&#xff0c;我们将简要介绍Python3的排序和…

基于AT89C51单片机的贪吃蛇游戏设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87778030 源码获取 主要内容: 设计一个贪吃蛇游戏,使其具有以下游戏规则:①当没有改变方向时,贪吃蛇沿原来路径一直前进②贪吃蛇无法回头,只能异于当前方向改变行动③蛇…

第7章链接:如何动态连接共享库、从应用程序中加载和链接共享库

文章目录 7.10 动态链接共享库静态库的缺点何为共享库共享库的"共享"的含义动态链接过程 7.11 从应用程序中加载和链接共享库运行时动态加载和连接共享库的接口 dlopen函数 dlsym函数 dlclose函数 dlerror动态加载和链接共享库的应用程序示例 7.12 *与位置无关的代码…

强大,Midjourney Imagine API接口,AI画画的福音!

前几天跟大家分享过一篇 ”让chatGPT教你AI绘画|如何将chatGPT与Midjourney结合使用&#xff1f;“&#xff0c;但是由于许多小伙伴们使用Midjourney还有许多困难&#xff0c;又要上网&#xff0c;还要注册Discord&#xff0c;MJ的使用成本很高&#xff0c;让大家望而却步&…

链表题目强化练

目录 前言&#xff08;非题目&#xff09; 两数相加 删除链表的倒数第N个结点 环形链表 相交链表 合并 K 个升序链表 复制带随机指针的链表 前言&#xff08;非题目&#xff09; 初学者在做链表的题目时有一个特点&#xff0c;就是每看一个链表的题都觉得很简单&#x…

Python程序员职业现状分析,想提高竞争力,就要做到这六点

现今程序员群体数量已经高达几百万&#xff0c;学历和收入双高&#xff0c;月薪普遍过万。今天&#xff0c;我们就围绕90后程序员人群分析、职业现状、Python程序员分析等&#xff0c;进行较为全面的报告分析和观点论述。 一、程序员人群分析 人数规模上&#xff1a;截当前程…

【设计原则与思想:总结课】38 | 总结回顾面向对象、设计原则、编程规范、重构技巧等知识点

到今天为止&#xff0c;设计原则和思想已经全部讲完了&#xff0c;其中包括&#xff1a;面向对象、设计原则、规范与重构三个模块的内容。除此之外&#xff0c;我们还学习了贯穿整个专栏的代码质量评判标准。专栏的进度已经接近一半&#xff0c;马上就要进入设计模式内容的学习…

类似于ChatGPT的优秀应用notion

notion 是一款流行的笔记应用。不过功能实际远超笔记&#xff0c;官方自己定义是&#xff1a;“将笔记、知识库和任务管理无缝整合的协作平台”。其独特的 block 概念&#xff0c;极大的扩展了笔记文档的作用&#xff0c;一个 block 可以是个数据库、多媒体、超链接、公式等等。…

怎么用问卷工具做市场调研?

对于希望开发新产品或服务、拓展新市场或确定潜在客户的公司来说&#xff0c;市场调查是一个至关重要的过程。然而&#xff0c;进行市场调查可能既耗时又昂贵&#xff0c;特别是在涉及对大量人群进行调查的情况下。今天&#xff0c;小编将来聊一聊调查问卷工具如何帮助企业进行…

Rasa 3.x 学习系列-Rasa [3.5.8] -2023-05-12新版本发布

Rasa 3.x 学习系列-Rasa [3.5.8] -2023-05-12新版本发布 当自定义动作设置的值与槽的现有值相同时&#xff0c;将触发SlotSet事件。修复了这个问题&#xff0c;使AugmentedMemoizationPolicy能够正确地处理截断的跟踪器。 为了恢复以前的行为&#xff0c;自定义操作只有在槽值…

【C++进阶】继承详解

文章目录 前言一、继承的概念及定义1.概念2.继承定义定义格式继承关系和访问限定继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承1.单继承与多继承2.菱…

软件 工程

目录 第十章、软件工程1、瀑布模型&#xff08;SDLC&#xff09;2、快速原型模型3、增量模型4、螺旋模型5、Ⅴ模型6、喷泉模型7、构建组装模型&#xff08;CBSD&#xff09;8、统一过程&#xff08;RUP&#xff09;9、敏捷开发方法10、信息系统开发方法11、需求开发12、结构化设…

收藏|必读10本pcb设计书籍推荐

1."High-Speed Digital Design: A Handbook of Black Magic"。 作者是Howard Johnson和Martin Graham。这是一本关于高速数字电路设计的优秀教材&#xff0c;适合那些需要设计高速电路的工程师。 作为比较早出来的信号完整性参考书&#xff0c;对国内的信号完整性研…

H.265/HEVC编码原理及其处理流程的分析

H.265/HEVC编码原理及其处理流程的分析 H.265/HEVC编码的框架图&#xff0c;查了很多资料都没搞明白&#xff0c;各个模块的处理的分析网上有很多&#xff0c;很少有把这个流程串起来的。本文的主要目的是讲清楚H.265/HEVC视频编码的处理流程&#xff0c;不涉及复杂的计算过程。…
最新文章