![](https://img-blog.csdnimg.cn/direct/9c20e8915bfb458e93776dcb6ac2fb55.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C/C++
文章平均质量分 79
C/C++笔记
二进制人工智能
图像,点云,机器学习, Python, C++
展开
-
【C++并发编程】(十三)递归锁
递归锁允许同一线程多次锁定同一个锁,而不会导致死锁。每次加锁操作会增加锁的计数器,但不会阻塞线程;每次解锁操作会减少计数器,当计数器为零时释放锁。与互斥锁一样,递归锁同样可以使用锁管理器,例如。,进行生命周期的自动管理。原创 2024-07-19 15:43:42 · 360 阅读 · 0 评论 -
【C++并发编程】(十二)自旋锁
在多线程并发的环境中,线程的阻塞和唤醒通常需要涉及操作系统的调度器,进行线程上下文的切换。自旋锁通过忙等待的方式,避免了线程阻塞和系统调度器介入,从而减少了这部分开销。但也需要注意,自旋锁适用于临界区较小且短时间内能够获取锁的情况。如果临界区较大,自旋锁会导致线程长时间占用CPU资源,反而降低系统的整体性能。与传统的互斥锁相同,自旋锁也是一种用于保护共享资源的同步机制,不同都是,自旋锁在尝试获取锁时不会立即进入阻塞状态,而是循环检查锁的状态(自旋),“忙等”直到获取到锁为止。只有两种状态:被设置(原创 2024-07-17 22:17:09 · 371 阅读 · 0 评论 -
【C++并发编程】(十一)读写锁
读写锁是一种同步机制,它允许多个线程同时以共享模式(读模式)访问共享资源,从而提高了并发读取的效率;然而,在任何一个线程需要独占访问(写模式)以修改共享资源时,它将阻止其他所有线程(无论是读模式还是写模式)访问该资源,以确保数据的一致性和完整性。原创 2024-07-16 16:37:49 · 260 阅读 · 0 评论 -
【C++并发编程】(十)生产者-消费者模型
生产者-消费者模型是一种经典的并发编程模型,旨在解决多线程环境中负责生成数据或任务的线程(生产者)与负责处理数据或任务的线程(消费者)之间的协作与数据共享问题。:用于存放由生产者生产,被消费者处理的数据或任务。这个缓冲区通常是一个队列。:用于确保生产者和消费者线程之间的有效协调和数据安全共享。原创 2024-07-08 22:18:12 · 267 阅读 · 0 评论 -
【C++】Google Test(gtest)单元测试
测试夹具(Test Fixture)用于提供一个环境,允许开发者在多个测试用例之间共享设置和清理的代码,确保每个测试用例都在相同或可控的初始状态下运行。是一种软件测试方法,它旨在将应用程序的各个部分(通常是方法或函数)分离出来并独立测试,以确保每个部分都能够按预期工作。为测试用例的名称,用于将相关的测试分组在一起,以便在测试结果中更容易地识别和归类。味前缀的致命断言,其在测试失败时程序立即终止。为前缀的非致命断言,其在测试失败时程序会继续执行;为具体测试的名称,一般描述测试的目的。方法中,初始化了一个。原创 2024-07-06 19:44:12 · 2148 阅读 · 2 评论 -
【C++设计模式】(二)设计模式简介
亚历山大提出了一系列在建筑设计中常见的、能够解决特定问题的模式,这些模式可以在不同的建筑设计中重复使用。:包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。这些设计模式关注的是对象之间的交互和职责分配,通过解决对象间职责分配和通信问题来应对需求变化对多个交互对象带来的影响。:包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式。:包括单例模式、工厂方法模式、抽象工厂模式、生成器模式、原型模式。原创 2024-07-05 22:26:44 · 569 阅读 · 0 评论 -
【C++设计模式】(一)面向对象编程的八大原则
面向对象编程有一系列的设计准则来保证软件的质量,包括:单一职责原则,开放-关闭原则,里氏替换原则,接口隔离原则,依赖倒置原则,迪米特法则/ 最少知识原则,合成复用原则,针对接口编程而不是针对实现编程原则。接口,然后让战士、法师、盗贼等角色类都实现这个接口,那么我们就可以在不修改已有代码的情况下,通过添加新的角色类或者修改接口的实现来扩展或修改游戏的行为。例如,USB接口能够连接不同类型的设备(如打印机、键盘、鼠标),这些设备通过共同的接口(USB接口)与电脑通信,而不需要知道每个设备的具体实现细节。原创 2024-07-04 19:32:36 · 1116 阅读 · 0 评论 -
【C++并发编程】(九)线程池
在这个表达式中, 工作线程在无限循环中等待新任务: 每个工作线程在等待时,会尝试获取任务队列的互斥锁。一旦有任务添加到任务队列中,或者接收到停止信号,线程会被唤醒,并执行后续的指令。它的基本概念是将一组预先创建的线程放入一个池中,需要执行任务时,从池中获取空闲线程来处理任务,任务完成后,线程不会被销毁,而是返回池中等待下一个任务。当线程池中的工作线程空闲时,它们会从任务队列中取出任务并执行。线程池在初始化时创建一定数量的工作线程,并在销毁时确保所有工作线程都正确结束。:工作线程负责执行分配给线程池的任务。原创 2024-06-27 16:33:35 · 521 阅读 · 0 评论 -
【C++并发编程】(八)信号量
信号量的计数值是一个非负整数,表示可用资源的数量。如果信号量的计数值为0,则线程或进程将被阻塞,直到信号量的计数值大于0。为了有效管理这些预订,店主可以采用类似于计数信号量的系统来确保桌子的合理分配和预订管理。二值信号量只有两个状态(0 和 1),类似于互斥锁,主要用于控制单个资源的访问。信号量可以用于线程间的同步,使得某些操作按特定顺序执行,从而避免竞态条件的发生,也可以限制对共享资源的并发访问数量,以防止资源过载。创建,并指定其最大计数值(桌子数量)和初始计数值(空闲的桌子数量)。原创 2024-06-25 10:11:01 · 989 阅读 · 0 评论 -
【C++面向对象编程】(二)this指针和静态成员
当我们创建一个类的多个对象时,这些对象的成员函数的代码是共享的,也就是说,无论我们创建多少个类的对象,这些函数的代码都只有一份。为了在这些共享的成员函数内部引用和修改特定对象的成员变量,C++提供了。类的静态成员(包括静态成员变量和静态成员函数)在所有类的对象之间是共享的,只存在于一个数据存储区域。类的非静态成员(包括成员变量和成员函数)是类的每个对象所独有的。指针传递自己的地址给该函数,以便函数能够访问和修改该对象的成员变量。指针是一个隐式的指针,它指向调用非静态成员函数的对象。使用C++17新增的。原创 2024-06-07 20:57:19 · 1026 阅读 · 0 评论 -
【C++面向对象编程】(一)类,对象和四大机制(封装,继承, 多态 ,抽象)
当我们说“我的朋友叫张三”时,“张三”就是一个对象,他是根据“人类”这个类制造出来的具体实例。张三可能有他自己的名字、肤色、年龄等独特的属性,并且他的说话风格,走路姿势,思考方式等也会与其他人不同。对象:每一个对象都是根据类创建的具有其属性和方法的实例,并且具有唯一的身份标识(如内存地址)和自己独特的属性值。成员变量是类中的变量,用于存储与类相关的数据。封装隐藏了对象的内部实现细节,只暴露必要的接口,提高了代码的可维护性和安全性。换句话说,类的成员包括变量(也称为类的属性)和函数(也称为类的方法)。原创 2024-05-30 16:03:42 · 783 阅读 · 0 评论 -
【C++】GNU Debugger (GDB) 使用示例
如果使用CMake编译你的C++项目,并希望包含调试信息以便使用GDB进行调试,你需要在CMakeLists.txt文件中指定构建类型为Debug。GDB(GNU Debugger)是一种Unix下的程序调试工具,用于调试C、C++等编程语言编写的程序。中,编写一个简单的C++程序,该程序包含一个错误的函数。在项目的根目录下,创建一个构建目录并运行CMake。现在,我们已经构建了程序,可以使用GDB进行调试。首先,我们创建一个目录,并在其中创建必要的文件。函数中的错误,然后重新构建并再次调试。原创 2024-05-08 14:36:44 · 1146 阅读 · 0 评论 -
【C++泛型编程】(二)标准模板库 STL
C++ 的标准模板库(Standard Template Library,STL)旨在通过模板化的设计,提供一种通用的编程模式,使程序员能方便地实现和扩展各种数据结构和算法,提高程序的开发效率和执行效率。仿函数/函数对象是一个行为类似于函数的对象,可以被调用,并且可以在泛型编程中用作函数参数,用于定义算法的行为策略 (允许我们为算法提供自定义的比较、判断或操作规则)。关联式容器内部通常使用红黑树(对于有序的容器)或哈希表(对于无序的容器)来实现,以支持高效的查找、插入和删除操作。原创 2024-05-07 20:58:09 · 1071 阅读 · 0 评论 -
【C++泛型编程】(一)函数模板和类模板
C++泛型编程(Generic Programming)是一种编程范式,它允许程序员编写与参数无关的代码,也就是说这些代码可以在多种数据类型上重用,而无需为每个类型重新编写。函数模板允许程序员编写一个通用的函数,该函数可以接受不同类型的参数,并在编译时根据提供的参数类型生成特定的函数版本。类模板则允许你编写一个通用的类,该类可以在编译时根据提供的类型参数生成特定的类版本。全特化:全特化是指对模板的所有模板参数都进行特化处理。在使用类模板时,需要为模板参数指定具体的类型。这样的具体类型提供特定的实现。原创 2024-05-07 10:40:02 · 316 阅读 · 0 评论 -
【C++并发编程】(七)异步编程
在这个示例中,异步任务(计算5的平方)需要2秒钟来完成。异步编程(Asynchronous Programming)是一种编程模型,它允许程序在等待某个操作(如I/O操作、网络请求等)完成时,不阻塞当前线程的执行。在并发编程中,可以使用异步编程来避免线程阻塞,提高资源的利用率。这个函数接受一个可调用的对象(如函数、Lambda 表达式、函数对象等)作为参数,并在一个单独的线程(或可能是线程池中的线程,具体取决于实现)上异步执行它。,这时如果异步任务还没有完成,主线程将会被阻塞,直到结果可用。原创 2024-05-06 15:57:15 · 253 阅读 · 0 评论 -
【C++并发编程】(六)死锁问题
死锁(Deadlock)是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(或线程)称为死锁进程(或线程)。为了解决上述代码中的死锁问题,我们可以使用一种称为“锁顺序”或“锁排序”的策略,即确保所有线程都以相同的顺序请求锁。函数会尝试以原子方式锁定多个互斥锁,如果无法立即获得所有锁,它会阻塞直到所有锁都变得可用,或者抛出异常(取决于。来协调多个锁的锁定顺序了。原创 2024-05-06 09:17:50 · 426 阅读 · 0 评论 -
【C++并发编程】(五)原子操作
在多线程环境中,由于处理器缓存、指令重排和编译器优化等因素,内存访问的顺序可能并不总是按照代码中的顺序执行。原子操作通常比互斥锁具有更高的性能,但原子操作通常针对单个数据项(如一个整数或指针)进行,它们确保了对该数据项的访问是原子的,即不会被其他线程打断。原子操作是不可中断的操作,一旦开始,就必须完全执行完毕,不受其他线程干扰,可以确保多个线程在访问和修改共享数据时不会发生冲突,从而避免了数据竞争和相关的并发问题。类型提供了一系列操作保证了操作的原子性,即操作在执行过程中不会被其他线程打断。原创 2024-05-05 14:07:58 · 646 阅读 · 0 评论 -
【C++并发编程】(四)条件变量
条件变量(Condition Variable)用于线程间的同步,允许一个或多个线程在特定条件不满足时等待,并在条件满足时被其他线程唤醒。: 唤醒在该条件变量上等待的一个线程(如果有的话)。如果没有线程在等待,那么这个调用就没有效果。在这个例子中,我们创建了5个线程,每个线程都试图打印其ID。时,所有等待的线程都会被唤醒,并重新尝试获取互斥锁以继续执行。函数时,都会唤醒一个等待的线程来处理任务。因此,在需要使用条件变量(: 等待直到另一个线程调用该条件变量的。: 唤醒在该条件变量上等待的所有线程。原创 2024-05-04 15:24:35 · 407 阅读 · 0 评论 -
【C++并发编程】(三)互斥锁:std::mutex
当一个任务(或线程)持有互斥锁,且该互斥锁处于闭锁状态,那么这个任务可以执行访问共享资源的代码,其他任务(或线程)则不被允许。开锁后,该线程将失去了对互斥锁的所有权,其他正在等待的线程现在有机会获取这个互斥锁,以访问共享资源。如果互斥量当前没有被其他线程锁定(即它是可用的),则调用线程会成功获取锁,并继续执行其后续代码。如果互斥量已经被其他线程锁定,则调用线程会被阻塞(即它会停止执行,直到锁变得可用)。一旦线程获取了锁,它就可以安全地访问共享资源,而不必担心其他线程同时修改它。进行互斥锁的闭锁和开锁。原创 2024-05-04 13:04:03 · 853 阅读 · 0 评论 -
【C++并发编程】(二)线程的创建、分离和连接
在C++中,线程的分离(detach)和连接(join)是用于管理线程生命周期的两种主要方式。当创建一个线程时,你可以选择让它独立运行(即分离),或者等待它完成执行(即连接)。方法时,你告诉线程库你不再关心这个线程的结束时间,并且你不需要获取它的返回值。线程将在后台独立运行,直到其函数返回,结束。当你想在线程中执行某个有参数或无参数的函数时,你可以将该函数传递给。方法时,你告诉线程库你想要等待这个线程完成执行后再继续下去。你还可以传递类的成员函数和类的实例给线程。的线程将被阻塞,直到被连接的线程执行完毕。原创 2024-05-03 23:17:05 · 916 阅读 · 0 评论 -
【C++并发编程】(一)基本概念
多进程可以利用多核处理器,实现真正的并行处理。除此之外,还可以通过在同一时间段内,交替执行多个任务实现并发(多线程),只要交替的速度够快,在宏观上看起来就像是并行的。C++标准并未对进程间通信提供任何原生支持,所以使用多进程的方式实现,这会依赖与平台相关的API。线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位,使用进程所拥有的资源,并由进程中的一个执行序列来执行。进程是操作系统进行资源分配和调度的基本单位,它拥有独立的内存空间和系统资源,负责执行一个特定的程序或任务。原创 2024-05-02 21:39:12 · 801 阅读 · 0 评论 -
【C++】C++ 11 新特性:使用示例
是一个引用计数智能指针,它在构造时会将引用计数初始化为 1,每当有新的 std::shared_ptr 指向相同的对象时,引用计数加 1,当有 std::shared_ptr 超出作用域或被显式置为 nullptr 时,引用计数减 1。关键字用于显式指示一个成员函数覆盖了基类中的虚函数,它可以帮助检测错误,如果子类中的函数并没有正确地覆盖基类中的虚函数,编译器将产生错误。智能指针用于管理动态分配的内存的智能对象,可以在对象不再被使用时自动释放内存,避免了内存泄漏和悬空指针的问题。用于推导表达式的类型。原创 2024-05-01 00:38:30 · 1299 阅读 · 0 评论 -
【C++】项目级的组织结构与Cmake编译
并在其中写函数的定义。:存放编译生成的对象文件。,并在其中写函数的声明。(1) 创建后缀名为。(2) 创建后缀名为。:存放可执行程序文件。将在bin目录下生成。原创 2024-04-23 16:20:10 · 570 阅读 · 0 评论 -
多进程并发 v.s.多线程并发
如果任务需要大量的数据共享和高效的任务切换,那么多线程可能更加适合,因为线程间的上下文切换比进程要快且共享同一进程的内存空间。如果任务需要更多的数据隔离和安全性,多进程可能是更好的选择,因为进程拥有独立的内存空间。原创 2024-03-19 10:01:57 · 523 阅读 · 0 评论 -
【C++】(二十八)多重继承
文章目录多重继承1 多重继承派生类1.1 多重继承派生类的定义1.2 多重继承派生类的构造函数2 二义性问题及名字支配规则2.1 二义性问题2.2 名字支配规则2.3 虚基类2.3.1 虚基类的定义多重继承1 多重继承派生类除去一个类从一个基类派生,C++还支持一个派生类同时继承多个基类1.1 多重继承派生类的定义如果已经定义了多个基类,那么定义多重继承的派生类的形式为:1.2 多重继承派生类的构造函数多重继承派生类的构造函数形式与单一继承时的构造函数形式基本相同,只是在派生类的构造函数原创 2020-11-04 21:56:50 · 504 阅读 · 0 评论 -
【C++】(二十七)派生类成员的访问 |派生类的构造和析构函数
文章目录派生类成员的访问1 类的保护成员2 派生类成员的访问权限3 赋值兼容规则派生类的构造和析构函数1 派生类的构造函数1.1 派生类构造函数的定义1.2 组合关系的派生类的构造函数2 派生类的析构函数派生类成员的访问1 类的保护成员对派生类来说,成员分为两大类:(1)一类是从基类继承过来的成员;(2)一类是自己新生成的成员。如果没有继承,一个类只有两种类型的访问者:类成员和类用户。将类划分为private和public访问级别反映对访问者的访问权限:类用户只能访问公有成员,类成员和友元原创 2020-11-04 19:43:28 · 1234 阅读 · 0 评论 -
【C++】(二十六)类的继承与派生
文章目录类的继承与派生1 基类与派生类2 派生类的定义3 派生类的构成类的继承与派生1 基类与派生类继承(inheritance)是面向对象程序设计的一个重要特性,是软件复用(software reusability)的一种重要形式。继承允许在原有类的基础上创建新的类,新类可以从一个或多个原有类中继承数据成员和成员函数,并且可以重新定义或增加新的成员,从而形成类的层次。继承具有传递性,不仅支持系统的可重用性,而且还促进系统的可扩充性。类的对象是各自封闭的,如果没继承性机制,则类对象中数据、函数就原创 2020-11-04 17:35:08 · 2872 阅读 · 0 评论 -
【C++】(二十五)静态成员和友元
文章目录静态成员和友元1 静态数据成员2 静态成员函数3 友元函数4 友元类静态成员和友元1 静态数据成员可以定义类的静态成员,能够实现同类的多个对象之间数据共享。使用类的静态成员的优点是:①静态成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突;②静态成员可以实施封装,可以是私有成员,而全局对象不可以。③静态成员是与特定类关联的,结构清晰。静态数据成员例:静态数据成员是类的一种特殊数据成员,它以关键字static开始,声明形式为:例如:count设计的原创 2020-11-04 16:33:43 · 485 阅读 · 0 评论 -
【C++】(二十四)类作用域、对象生命期、const限定
文章目录类作用域、对象生命期、const限定1 类的作用域1.1 类作用域中的名字查找1.2 嵌套类2.3 局部类2 对象的生命期类作用域、对象生命期、const限定1 类的作用域同变量、函数一样,类也有自己的作用域。(1)每个类都定义了自己的作用域和唯一的类型。在类体内声明类成员,将成员名引入类的作用域中。两个不同的类具有两个独立的类作用域。即使两个类具有完全相同的成员列表,它们也是不同的类型。每个类的成员不同于任何其他类的成员。例如:class A { public: int i; doubl原创 2020-11-04 15:00:22 · 424 阅读 · 0 评论 -
【C++】(二十三)对象数组与对象指针
对象数组与对象指针1 对象数组的定义和使用可以简单的理解类就是我们自定义的数据类型,而对象就是类的实 例,因此我们也可以构造对象数组和对象的指针。将具有相同类类型的对象有序地集合在一起便构成了对象数组,以 一维对象数组为例,其定义形式为:类名 对象数组名[常量表达式]; 一维对象数组有时也称为对象向量,它的每个元素都是相同类类型的对象。例如表示平面上若干个点,可以这样定义:Point points[100]; //表示100个点 关于对象数组的说明:(1)在建立对象数组时,需要调用构造函数原创 2020-11-03 22:33:53 · 622 阅读 · 0 评论 -
【C++】(二十二)析构函数
文章目录析构函数1 析构函数的定义2 合成析构函数3 何时需要编写析构函数4 构造函数和析构函数的调用次序析构函数1 析构函数的定义析构函数:当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统会自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一段内存空间,则在该对象消亡前应在析构函数中用delete释放这段存储空间)。C++规定析构函数的名字是类名的前面加一个波浪号(~)。其定 义形式为:~类名() { 函数体 }析构函数不返回任何值,没有原创 2020-11-02 22:21:13 · 2976 阅读 · 0 评论 -
【C++】(二十一)默认构造函数和复制构造函数
文章目录默认构造函数和复制构造函数1 定义默认构造函数2 隐式类类型转换3 复制构造函数与合成复制构造函数3.1 复制构造函数3.2 合成复制构造函数4 深复制与浅复制默认构造函数和复制构造函数1 定义默认构造函数默认构造函数就是在没有显式提供初始化式时调用的构造函数,它是一个不带参数的构造函数。如果定义某个类的对象时没有提供初始化式就会使用默认构造函数。定义默认构造函数(default constructor)的一般形式为:类名() { 函数体 }它由不带参数的构造函数,或者所有形参均原创 2020-11-02 20:02:08 · 3600 阅读 · 2 评论 -
【C++】(二十)构造函数
文章目录构造函数1 什么是构造函数2 构造函数的定义2.1 定义构造函数2.2 构造函数初始化列表3 构造函数的重载4 带默认参数的构造函数构造函数1 什么是构造函数建立一个对象时,通常最需要立即做的工作是初始化对象,如对数据成员赋初值。构造函数就是用来用来在创建对象时初始化对象, 为对象数据成员赋初始值。类的数据成员是不能在类定义时初始化的,例如:class Point { //Point类 int x=0, y=0; //错误,不能在类定义中对数据成员初始化 …原创 2020-11-01 19:12:24 · 450 阅读 · 0 评论 -
【C++】(十九)对象的定义与使用
文章目录对象的定义与使用1 对象的的定义1.1 先定义类类型再定义对象1.2 定义类类型的同时定义对象1.3 直接定义对象2 对象的动态建立和释放对象的定义与使用1 对象的的定义定义一个类时,也就是定义了一个具体的数据类型。若要使用类, 需要将类实例化,即定义该类的对象。需要注意,我们之前也使用了“对象”一词,那里主要是指数据对象。从现在起,“对象”一词专门表示类的实体。1.1 先定义类类型再定义对象有两种定义对象的形式:①将类的名字直接用作类型名:类名 对象名列表; ②指定关键字cla原创 2020-11-01 11:28:00 · 1698 阅读 · 0 评论 -
【C++】(十八)类的定义
文章目录类的定义1 定义类2 成员的访问控制3 类的数据成员3.1 在类中声明数据成员3.2 在类中定义或声明数据类型4 类的成员函数4.1 在类的外部定义成员函数类的定义1 定义类C语言——面向过程的程序设计思想自顶向下,逐步求精;一个main函数+若干子函数代码的重用性比较低,比如已经有一个本科生管理系统,要建造一个研究生管理系统得重新写。C++语言——面向对象的程序设计思想软件设计的产业化;自然界是由实体(对象)组成的(1)抽象:对具体对象(问题)进行概括,抽出这一类对象的原创 2020-10-28 21:56:57 · 1560 阅读 · 0 评论 -
两张图道尽C++与MATLABswitch-case的区别
C++MATLAB原创 2020-10-25 17:35:27 · 521 阅读 · 1 评论 -
【C++】(十七)预处理命令
文章目录预处理命令1 什么是预处理命令2 宏定义2.1 不带参数的宏定义2.2 带参数的宏定义2.3 #和##预处理运算3 文件包含3.1 文件包含的路径问题3.2 文件包含的重复包含问题4 条件编译4.1 #ifdef条件编译命令4.2 #if条件编译命令预处理命令1 什么是预处理命令预处理命令不是C++本身的组成部分,更不是C++语句,它是C++ 标准规定的可以出现在C++源程序文件中的命令。这些命令必须以“#”开头,结尾不加分号,可以放置在源程序中的任何位置,其有效范围是从出现位置开始到原创 2020-10-27 09:40:22 · 1028 阅读 · 0 评论 -
【C++】(十六)链表
自定义数据类型的应用——链表1 链表的概念和分类链表是一种存储空间能动态进行增长或缩小的数据结构。链表主要用于两个目的:一是建立不定长度的数组。二是链表可以在不重新安排整个存储结构的情况下,方便且迅速地插入和删除数据元素。链表广泛地运用于数据管理中。首先设计一种称为结点(node)的数据类型:struct NODE { //结点数据类型 ElemType data; //数据域 NODE *link; //指针域 };这个结构体类型中,data成员表示数据域,代表结点的数原创 2020-10-27 08:45:13 · 427 阅读 · 0 评论 -
【C++】(十五)自定义数据类型——共用体类型、枚举类型
文章目录自定义数据类型——共用体类型、枚举类型1 共用体类型2 枚举类型自定义数据类型——共用体类型、枚举类型1 共用体类型共用体(union)是一种成员共享存储空间的结构体类型。共用体类型是抽象的数据类型,因此程序中需要事先声明具体的共用体类型,一般形式为:union 共用体类型名 { 成员列表 };共用体类型名与union一起作为类型名称,成员列表是该类型数据 元素的集合。一对大括号{}是成员列表边界符,后面必须用分号 (;)结束。union A { int m,n; //整型原创 2020-10-24 21:43:10 · 1856 阅读 · 0 评论 -
【C++】(十五)自定义数据类型——结构体
文章目录自定义数据类型——结构体1 结构体的定义与使用1.1 定义结构体类型1.2 结构体类型实例化1.3 结构体对象的内存形式1.4 结构体对象成员引用2 结构体与数组、指针、函数2.1 结构体与数组2.2 结构体与指针2.3 结构体与函数自定义数据类型——结构体1 结构体的定义与使用数组是一种数据形式,其特点是多个相同类型的元素集合起来;结构体是另一种重要的数据形式,特点是将不同类型的成员组合起来。数组和结构体形成了两种风格迥异的聚合方式,通过他们及其相互 组合、嵌套的机制可以构造出复杂的、满原创 2020-10-24 21:01:50 · 1876 阅读 · 0 评论