多线程是多任务的一种特殊形式,多任务是允许您的计算机同时运行两个或多个程序的功能。一般来说,多任务有两种类型:基于进程的和基于线程的。 基于进程的多任务处理程序的并发执行。基于线程的多任务处理处理同一程序的多个片段的并发执行。 多线程程序包含两个或多个可以同时运行的部分。这样一个程序的每个部分都称为一个线程,每个线程定义了一个单独的执行路径。 C++ 不包含对多线程应用程序的任何内置支持。相反,它完全依赖于操作系统来提供此功能。 本教程假设您在 Linux 操作系统上工作,我们将使用 POSIX 编写多线程 C++ 程序。 POSIX Threads 或 Pthreads 提供的 AP
信号是操作系统传递给进程的中断,它可以提前终止程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,您可以通过按 Ctrl+C 来生成中断。 有些信号无法被程序捕获,但您可以在程序中捕获以下信号列表,并可以根据信号采取适当的行动。这些信号在 C++ 头文件 中定义。 Sr.No 信号和说明 1 SIGABRT 程序异常终止,例如调用abort . 2 SIGFPE 错误的算术运算,例如除以零或导致溢出的运算。 3 信号 检测到非法指令。 4 信号提示 收到交互式注意信号。 5 SIGSEGV 对存储的无效访问
预处理器是指令,它指示编译器在实际编译开始之前对信息进行预处理。 所有预处理器指令都以 # 开头,并且一行中的预处理器指令前只能出现空白字符。预处理器指令不是 C++ 语句,因此它们不以分号 (;) 结尾。 您已经看过 #include 所有示例中的指令。该宏用于将头文件包含到源文件中。 C++ 支持许多预处理器指令,如#include、#define、#if、#else、#line 等。让我们看看重要的指令 - #define 预处理器 #define 预处理器指令创建符号常量。符号常量称为宏 指令的一般形式是 - #define macro-name replacement-te
模板是泛型编程的基础,它涉及以独立于任何特定类型的方式编写代码。 模板是用于创建泛型类或函数的蓝图或公式。像迭代器和算法这样的库容器是泛型编程的例子,是使用模板概念开发的。 每个容器都有一个定义,例如 vector ,但我们可以定义许多不同种类的向量,例如 vector 或 向量 . 您可以使用模板来定义函数和类,让我们看看它们是如何工作的 - 函数模板 模板函数定义的一般形式如下所示 - template <class type> ret-type func-name(parameter list) { // body of function } 这里,
考虑一种情况,当我们在同一个班级中有两个同名的人 Zara。每当我们需要明确区分他们时,我们必须使用一些额外的信息以及他们的名字,比如地区,如果他们住在不同的地区,或者他们的母亲或父亲的名字等。 在您的 C++ 应用程序中也可能出现同样的情况。例如,您可能正在编写一些代码,其中包含一个名为 xyz() 的函数,而另一个可用的库也具有相同的函数 xyz()。现在编译器无法知道您在代码中引用的是哪个版本的 xyz() 函数。 命名空间 旨在克服这一困难,并用作附加信息来区分不同库中具有相同名称的类似函数、类、变量等。使用命名空间,您可以定义定义名称的上下文。本质上,命名空间定义了一个范围。 定
深入了解动态内存在 C++ 中的实际工作原理对于成为一名优秀的 C++ 程序员至关重要。 C++ 程序中的内存分为两部分 - 堆栈 − 函数内部声明的所有变量都会从堆栈中占用内存。 堆 − 这是程序未使用的内存,可用于在程序运行时动态分配内存。 很多时候,您事先并不知道在定义的变量中存储特定信息需要多少内存,而所需内存的大小可以在运行时确定。 您可以在运行时使用 C++ 中的特殊运算符在堆内为给定类型的变量分配内存,该运算符返回已分配空间的地址。此运算符称为 new 运营商。 如果您不再需要动态分配的内存,您可以使用 delete 运算符,它会释放之前由 new 运算符分
异常是在程序执行过程中出现的问题。 C++ 异常是对程序运行时出现的异常情况的响应,例如尝试除以零。 异常提供了一种将控制从程序的一个部分转移到另一个部分的方法。 C++ 异常处理基于三个关键字:try、catch、 并投掷 . 投掷 − 出现问题时程序抛出异常。这是使用 throw 完成的 关键字。 赶上 − 程序在程序中要处理问题的位置使用异常处理程序捕获异常。 捕获 关键字表示异常的捕获。 试试 - 一个尝试 block 标识将激活特定异常的代码块。其后跟一个或多个 catch 块。 假设一个块会引发一个异常,一个方法使用 try 的组合捕获一个异常 和捕捉 关
到目前为止,我们一直在使用 iostream 标准库,提供cin 和 cout 分别从标准输入读取和写入标准输出的方法。 本教程将教您如何从文件中读取和写入。这需要另一个名为 fstream 的标准 C++ 库 ,它定义了三种新的数据类型 - Sr.No 数据类型和描述 1 流 此数据类型表示输出文件流,用于创建文件和将信息写入文件。 2 ifstream 该数据类型表示输入文件流,用于从文件中读取信息。 3 fstream 这种数据类型一般代表文件流,同时具有ofstream和ifstream的能力,即可以创建文件,向文件写入信息,从文件中读取信息。
接口描述了 C++ 类的行为或功能,而无需提交该类的特定实现。 C++ 接口是使用抽象类实现的 并且这些抽象类不应与数据抽象相混淆,数据抽象是一种将实现细节与关联数据分开的概念。 一个类通过将其至少一个函数声明为纯虚拟而成为抽象类 功能。通过在其声明中放置“=0”来指定纯虚函数,如下所示 - class Box { public: // pure virtual function virtual double getVolume() = 0; private: double length; // Length of
所有 C++ 程序都由以下两个基本元素组成 - 程序语句(代码) − 这是程序中执行动作的部分,它们被称为函数。 节目数据 − 数据是受程序功能影响的程序信息。 封装是一个面向对象的编程概念,它将数据和操作数据的函数绑定在一起,并确保两者免受外部干扰和误用。数据封装导致了数据隐藏这一重要的OOP概念 . 数据封装 是一种捆绑数据的机制,以及使用它们的函数和数据抽象 是一种只暴露接口而对用户隐藏实现细节的机制。 C++ 通过创建用户定义的类型(称为类)来支持封装和数据隐藏的属性 .我们已经研究过一个类可以包含 private, protected 和公开 成员。默认情况下
数据抽象是指只向外界提供必要的信息,并隐藏其背景细节,即在程序中表示需要的信息而不呈现细节。 数据抽象是一种依赖于接口和实现分离的编程(和设计)技术。 让我们以电视为例,您可以打开和关闭它,更改频道,调节音量,以及添加扬声器、录像机和 DVD 播放器等外部组件,但您不知道它的内部细节,即也就是说,你不知道它是如何通过无线或电缆接收信号,如何转换它们,最后将它们显示在屏幕上的。 因此,我们可以说电视将其内部实现与外部接口明确分开,您可以在不了解其内部结构的情况下使用其电源按钮、频道切换器和音量控制等接口。 在 C++ 中,类提供了高水平的数据抽象 .它们向外部世界提供了足够的公共方法来使
多态性 意味着有多种形式。通常,当类有层次结构并且它们通过继承相关时,就会发生多态性。 C++ 多态性意味着对成员函数的调用将导致执行不同的函数,具体取决于调用该函数的对象的类型。 考虑以下示例,其中一个基类已由其他两个类派生 - 现场演示 #include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a = 0, int b = 0){ width = a;
C++ 允许您为 函数 指定多个定义 名称或操作员 在同一个作用域内,称为函数重载 和运算符重载 分别。 重载声明是在同一范围内与先前声明的声明同名的声明,除了两个声明具有不同的参数和明显不同的定义(实现)。 当你调用一个重载的函数 或操作员 ,编译器通过将您用于调用函数或运算符的参数类型与定义中指定的参数类型进行比较来确定要使用的最合适的定义。选择最合适的重载函数或运算符的过程称为重载解析 . C++ 中的函数重载 您可以在同一范围内对同一函数名称进行多个定义。函数的定义必须因参数列表中参数的类型和/或数量而有所不同。不能重载仅返回类型不同的函数声明。 以下是相同函数 print()
C/C++ 数组允许您定义组合多个相同类型的数据项的变量,但结构 是另一种用户定义的数据类型,它允许您组合不同类型的数据项。 结构用于表示记录,假设您想跟踪图书馆中的书籍。您可能想要跟踪关于每本书的以下属性 - 标题 作者 主题 图书编号 定义结构 要定义结构,必须使用 struct 语句。 struct 语句为您的程序定义了一种具有多个成员的新数据类型。 struct 语句的格式是这样的 - struct [structure tag] { member definition; member definition; ... member definition
C++ 标准库没有提供正确的日期类型。 C++ 从 C 继承了用于日期和时间操作的结构和函数。要访问与日期和时间相关的函数和结构,您需要在 C++ 程序中包含 头文件。 与时间相关的类型有四种:clock_t、time_t、size_t , 和 tm .类型 -clock_t、size_t 和 time_t 能够将系统时间和日期表示为某种整数。 结构类型 tm 以具有以下元素的 C 结构形式保存日期和时间 - struct tm { int tm_sec; // seconds of minutes from 0 to 61 int tm_min; // minut
引用变量是别名,即已存在变量的另一个名称。一旦使用变量初始化引用,就可以使用变量名或引用名来引用该变量。 引用与指针 引用经常与指针混淆,但引用和指针之间的三个主要区别是 - 您不能有 NULL 引用。您必须始终能够假定引用连接到合法的存储。 一旦一个引用被初始化为一个对象,就不能改变它来引用另一个对象。指针可以随时指向另一个对象。 引用必须在创建时进行初始化。指针可以随时初始化。 在 C++ 中创建引用 将变量名称视为附加到变量在内存中的位置的标签。然后,您可以将引用视为附加到该内存位置的第二个标签。因此,您可以通过原始变量名或引用访问变量的内容。例如,假设我们有以
C++ 提供以下两种类型的字符串表示 - C 风格的字符串。 标准 C++ 引入的字符串类类型。 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。这个字符串实际上是一个以 null 结尾的一维字符数组 字符\0。因此,以 null 结尾的字符串包含组成字符串的字符,后跟 null . 下面的声明和初始化创建了一个由单词“Hello”组成的字符串。为了在数组末尾保存空字符,包含字符串的字符数组的大小比单词“Hello”中的字符数大一。 char greeting[6] = {H, e, l, l, o, \0}; 如果你遵循数组初始化的规则,那么你可
通常,当我们使用 Numbers 时,我们使用原始数据类型,例如 int、short、long、float 和 double 等。在讨论 C++ 数据类型时已经解释了数字数据类型、它们的可能值和数字范围。 在 C++ 中定义数字 您已经在前面章节中给出的各种示例中定义了数字。这是另一个在 C++ 中定义各种类型数字的综合示例 - 现场演示 #include <iostream> using namespace std; int main () { // number definition: short s; int i; long l;
决策结构要求程序员指定一个或多个要由程序评估或测试的条件,以及如果条件被确定为真则要执行的一个或多个语句,以及可选地,如果条件确定则要执行的其他语句被判定为假。 以下是大多数编程语言中典型决策结构的一般形式 - C++编程语言提供了以下几种决策语句。 Sr.No 声明和说明 1 if 语句 “if”语句由一个布尔表达式和一个或多个语句组成。 2 if...else 语句 “if”语句后面可以跟一个可选的“else”语句,当布尔表达式为假时执行。 3 switch 语句 “switch”语句允许根据值列表测试变量是否相等。 4 嵌套 if 语句 您可以在另一个“if”
可能有一种情况,当您需要多次执行一段代码时。一般来说,语句是按顺序执行的:函数中的第一条语句首先执行,然后是第二条,依此类推。 编程语言提供了各种控制结构,允许更复杂的执行路径。 循环语句允许我们多次执行一个语句或一组语句,以下是大多数编程语言中循环语句的一般来源 - C++ 编程语言提供以下类型的循环来处理循环需求。 Sr.No 循环类型和描述 1 while 循环 在给定条件为真时重复一个语句或一组语句。它在执行循环体之前测试条件。 2 for 循环 多次执行一系列语句,并缩写管理循环变量的代码。 3 do...while 循环 类似于“while”语句,只是它在循
C语言