![](https://img-blog.csdnimg.cn/direct/23afca99789146e6bdf6e1b034c5ffd0.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++ 教程
文章平均质量分 94
本专栏参考了国外权威C++教程,推荐有C语言基础的同学食用,教程全程干货满满,看完后将对C++编程有个系统的认识并能运用到工作中。十分建议将每个示例代码都手敲一遍,加深理解
Leon_Chenl
这个作者很懒,什么都没留下…
展开
-
深入浅出C++:初学者必备教程
众所周知,C++是一门十分经典且应用广泛的系统编程语言,它建立在C语言之上,提供了面向对象的编程思想,旨在提高程序员的开发效率。本C++系列入门教程,参考了cplusplus、cppreference、learn c++等国外知名C++教程网站。跟着下方目录结构系统学习一遍,你将快速掌握C++的用法和概念并运用到工作和学习中,本教程适合有C语言基础想快速入门C++的同学阅读。:点击下面的章节链接(蓝色字体),即可跳转到对应的章节进行阅读,还没有显示蓝色的章节说明还在制作中。原创 2024-06-20 21:47:02 · 941 阅读 · 0 评论 -
C++ 11
移动语义通过右值引用实现,它允许对象的资源从一个对象转移到另一个对象,而不是进行拷贝。右值引用使用&&语法表示。// 42是一个右值,rref是一个右值引用右值引用是一种可以绑定到右值(临时对象或即将销毁的对象)的引用类型。右值引用的语法为T&&,其中T是某种数据类型。与传统的左值引用(T&)不同,右值引用专门用于捕获右值。// 42是一个右值,rref是一个右值引用转发引用是指在模板中,通过类型推导得到的右值引用。具体来说,当模板参数使用T&&原创 2024-06-22 09:37:31 · 830 阅读 · 0 评论 -
文件输入/输出(Input/output with files)
ofstreamifstreamfstream这些类直接或间接继承自istream和ostream类。cin是istream类的对象,cout是ostream类的对象。因此,我们已经在使用与文件流相关的类。实际上,我们可以像使用cin和cout一样使用我们的文件流,唯一的区别是我们必须将这些流与物理文件关联。这个代码创建一个名为的文件,并向其中插入一句话,就像我们用cout做的那样,但使用的是文件流myfile。原创 2024-06-21 09:08:17 · 793 阅读 · 0 评论 -
预处理指令(Preprocessor directives)
要定义预处理宏,可以使用#define。当预处理器遇到该指令时,它会在代码的其余部分中将所有identifier替换为。这个可以是一个表达式、语句、代码块或任何内容。预处理器不理解真正的 C++ 语法,它只是简单地将所有identifier替换为。100在预处理器替换了TABLE_SIZE#definea : ba : ba : ba : b?a : ba : b这将替换所有带有两个参数的getmax// 函数宏。原创 2024-06-21 09:06:37 · 698 阅读 · 0 评论 -
异常(Exceptions)
异常提供了一种在程序中应对异常情况(如运行时错误)的方法,通过将控制转移到特殊函数(称为处理程序)来实现。要捕获异常,可以将一部分代码放在异常检查之下。这是通过将这部分代码放在try块中来实现的。当在该块中出现异常情况时,会抛出一个异常,将控制转移到异常处理程序。如果没有抛出异常,代码将正常继续执行,所有处理程序都将被忽略。异常通过在try块内使用throw关键字来抛出。异常处理程序使用关键字catch声明,必须紧接在try处理异常的代码被包裹在try块中。表达式接受一个参数(在本例中是整数值20。原创 2024-06-21 09:05:18 · 640 阅读 · 0 评论 -
类型转换(Type conversions)
可以在相关类的指针之间执行转换,不仅可以上转(从派生类指针转换为基类指针),还可以下转(从基类指针转换为派生类指针)。还可以将多态类(那些具有虚成员的类)从基类指针转换为派生类指针(即“下转”),前提是指向的对象是目标类型的完整对象。还可以执行指针之间的其他隐式转换:在指针类型之间(即使在不相关的类之间)转换空指针,以及将任何类型的指针转换为。将任何指针类型转换为任何其他指针类型,即使是不相关类的指针类型。不受限制的显式类型转换允许将任何指针转换为任何其他指针类型,而不考虑它们指向的类型。原创 2024-06-21 09:04:21 · 877 阅读 · 0 评论 -
多态(Polymorphism)
抽象基类与上例中的Polygon类非常相似。它们是只能用作基类的类,因此允许有不带定义的虚成员函数(称为纯虚函数)。语法是将它们的定义替换为=0(等号和零):抽象基类Polygon// 抽象类 Polygonprotected:public:{ width=a;height=b;注意area没有定义;它被替换为=0,这使其成为纯虚函数。包含至少一个纯虚函数的类称为抽象基类。抽象基类不能用于实例化对象。因此,这个抽象基类版本的Polygon// 如果 Polygon 是抽象基类,则无法工作。原创 2024-06-21 09:02:44 · 580 阅读 · 0 评论 -
友元和继承(Friendship and inheritance)
这个访问说明符限制了从基类继承的成员的最大可访问级别:具有更高可访问级别的成员将以这个级别继承,而具有相同或更严格访问级别的成员将保持其在派生类中的限制级别。它的唯一不同之处在于继承:当一个类继承另一个类时,派生类的成员可以访问从基类继承的保护成员,而不能访问其私有成员。尽管基类的构造函数和析构函数的访问权限不是直接继承的,但它们会被派生类的构造函数和析构函数自动调用。是最高可访问级别,通过指定这个关键字,派生类将继承所有成员,并保持它们在基类中的访问级别。从其他类派生的类,它继承基类的所有可访问成员。原创 2024-06-21 09:01:29 · 1045 阅读 · 0 评论 -
特殊成员(Special members)
注意:本章需要对有适当的理解。特殊成员函数是在特定情况下隐式定义为类成员的成员函数。CC::C();C::~C();原创 2024-06-21 09:00:07 · 417 阅读 · 0 评论 -
Classes (II)
重要的事情说三遍:强烈建议按照目录结构中的顺序学习!!!点我查看教程目录结构强烈建议按照目录结构中的顺序学习!!!点我查看教程目录结构强烈建议按照目录结构中的顺序学习!!!点我查看教程目录结构类本质上定义了在C++代码中使用的新类型。在C++中,类型不仅通过构造和赋值与代码交互,还通过运算符交互。例如,考虑以下对基本类型的操作:这里,不同的基本类型()变量使用了加法运算符和赋值运算符。对于基本的算术类型,这些操作的含义通常是显而易见且明确的,但对于某些类类型可能并非如此。例如:这里,加法运算的结果并不明原创 2024-06-21 08:56:08 · 877 阅读 · 0 评论 -
Classes (I)
类不仅可以用关键字class定义,还可以用关键字struct和union定义。一般用来声明普通数据结构的关键字struct也可以用来声明具有成员函数的类,语法与使用关键字class相同。两者之间的唯一区别是,用关键字struct声明的类的成员默认具有公共访问权限,而用关键字class声明的类的成员默认具有私有访问权限。在这个上下文中,除了访问权限外,两者在其他所有方面都是等价的。相反,联合体的概念与使用struct和class。原创 2024-06-21 08:54:08 · 920 阅读 · 0 评论 -
其他数据类型(Other data types)
但由于它们都引用内存中的同一位置,因此修改其中一个成员将影响所有成员的值。类型别名可以用于减少长或复杂类型名称的长度,但它们最有用的是作为工具来使程序与它们使用的底层类型分离。枚举类型是用一组自定义标识符(称为枚举值)定义的类型作为可能的值。此枚举类型的对象可以取这些枚举值中的任何一个作为值。可以为枚举类型中的任何可能值指定特定的整数值。在 C++ 中,任何有效类型都可以有一个别名,以便可以用不同的标识符来引用它。,这实际上用于确定类型的大小。类型的枚举值,而是具有枚举类型本身的值,从而保留类型安全性。原创 2024-06-21 08:52:04 · 569 阅读 · 0 评论 -
数据结构(Data structures)
这些数据元素称为成员,可以具有不同的类型和不同的长度。因此,数据结构的一个特性是能够单独引用其成员,也可以引用整个结构。在这两种情况下都使用相同的标识符:结构的名称。)是一个解引用运算符,专门用于指向具有成员的对象的指针。内,有一个数据成员列表,每个成员都由一个类型和一个有效标识符作为其名称来指定。现在,让我们看看另一个混合指针和结构的示例,并将引入一个新运算符:箭头运算符(,每个成员都是不同的基本类型。可以是一组具有该结构类型的有效标识符。(顺便提一下,最后两个表达式引用相同的成员)。原创 2024-06-21 08:45:09 · 385 阅读 · 0 评论 -
动态内存(Dynamic memory)
在前几章的程序中,所有的内存需求都是在程序执行之前通过定义所需的变量来确定的。但是,有些情况下,程序的内存需求只能在运行时确定。例如,当所需内存依赖于用户输入时。在这些情况下,程序需要动态分配内存,C++语言通过new和delete运算符来实现这一点。原创 2024-06-21 08:43:48 · 717 阅读 · 0 评论 -
指针(Pointers)
在前面的章节中,变量被解释为计算机内存中的位置,可以通过它们的标识符(它们的名称)进行访问。这样,程序无需关心数据在内存中的物理地址;只需在需要引用变量时使用标识符即可。对于 C++ 程序来说,计算机的内存就像是一系列内存单元,每个单元大小为一个字节,并且每个单元都有一个唯一的地址。这些单字节内存单元按照一定的顺序排列,使得大于一个字节的数据表示可以占用具有连续地址的内存单元。这样,每个单元都可以通过其唯一的地址轻松定位。例如,地址为1776的内存单元总是紧跟在地址为1775的单元之后,并在地址为。原创 2024-06-20 22:50:52 · 905 阅读 · 0 评论 -
字符序列(Character sequences)
string类在前面的章节中已经简要介绍过。它是一个非常强大的类,用于处理和操作字符字符串。然而,由于字符串实际上是字符序列,我们也可以将它们表示为字符类型元素的普通数组。是一个可以存储最多 20 个char类型元素的数组。它可以表示为:因此,该数组具有存储最多 20 个字符序列的容量。但这种容量不需要完全用尽:数组也可以容纳较短的序列。例如,在程序中的某个时刻,可以在foo中存储"Hello"或序列,因为这两个都可以适应容量为 20 个字符的序列。原创 2024-06-20 22:48:07 · 926 阅读 · 0 评论 -
数组(Arrays)
数组是一系列的元素,这些元素放置在连续的内存位置中,可以通过在唯一标识符上添加索引来单独引用。这意味着,例如,五个int类型的值可以声明为一个数组,而不需要声明 5 个不同的变量(每个变量都有自己的标识符)。使用数组,这五个int值存储在连续的内存位置中,所有五个值都可以使用相同的标识符和适当的索引进行访问。例如,一个包含 5 个int类型整数值的数组foo可以表示为:其中每个空白面板代表数组的一个元素。在这种情况下,这些都是int类型的值。原创 2024-06-20 22:46:49 · 714 阅读 · 0 评论 -
名称可见性(Name visibility)
在任何块外部声明的实体具有全局作用域,这意味着它的名称在代码中的任何地方都是有效的。而在块内(例如函数或选择语句)声明的实体具有块作用域,并且仅在声明它的特定块内可见,而在块外部不可见。这是为了便于理解和缩短示例的长度而在这些教程中这样做的,但许多程序员更喜欢在其程序中对标准库的每个元素进行完全限定。但对于非局部名称来说,名称冲突的可能性更大,特别是考虑到库可能声明了许多函数、类型和变量,这些都不是局部的,而且有些非常通用。在引入块的声明中声明的变量(例如函数参数和在循环和条件语句中声明的变量,如在。原创 2024-06-20 22:27:48 · 1014 阅读 · 0 评论 -
重载和模板(Overloads and templates)
一般来说,两个同名的函数至少应该具有相似的行为,但这个例子表明它们完全可能没有相似的行为。从任何意义上来说,它们都是不同的函数,只是碰巧有相同的名称。的调用本质上调用了两个版本的函数:一个始终乘以二,一个始终乘以三。在C++中,如果函数的参数不同,那么两个不同的函数可以具有相同的名称;要么是参数数量不同,要么是参数的类型不同。参数的模板参数,编译器甚至能够自动推导数据类型而不必显式指定尖括号内的类型参数。它们可以有多个模板参数,并且函数仍然可以使用常规的非模板类型。当然,这样做的前提是类型必须是明确的。原创 2024-06-20 22:26:02 · 569 阅读 · 0 评论 -
函数(Functions)
函数允许将程序结构化为执行单个任务的代码段。在 C++ 中,函数是一组语句,赋予一个名字,可以在程序的某个位置调用它。typenameparametersint xstatementsaddition和main。记住,无论它们定义的顺序如何,C++ 程序总是从main开始调用。实际上,main是唯一自动调用的函数,其他任何函数的代码仅在从main调用时才会执行(直接或间接)。在上面的例子中,main以声明int类型的变量z开始,然后立即执行第一个函数调用:调用addition。原创 2024-06-20 22:24:35 · 542 阅读 · 0 评论 -
控制结构(Statements and flow control)
一个简单的C++语句是程序中的每个单独的指令,例如前面章节中看到的变量声明和表达式。它们总是以分号(;)结束,并按它们在程序中出现的顺序执行。但程序并不仅限于线性顺序的语句。在其过程中,程序可以重复代码段,或做出决策和分支。为此,C++提供了控制流语句,用于指定我们的程序在何时以及在何种情况下要做什么。本节解释的许多控制流语句在其语法中需要一个通用(子)语句。这个语句可以是一个简单的C++语句,如一个以分号(;)结束的单一指令,或者是一个复合语句。整个块被视为一个单一语句(它本身由多个子语句组成)。原创 2024-06-20 22:21:28 · 992 阅读 · 0 评论 -
基本输入/输出(Basic Input/Output)
前几节的示例程序几乎没有与用户的交互,只是在屏幕上打印简单的值。然而,标准库提供了许多其他方式,通过其输入/输出功能与用户交互。本节将简要介绍一些最有用的方法。C++使用一种称为流的便捷抽象来在屏幕、键盘或文件等顺序介质上执行输入和输出操作。流是一个实体,程序可以向其插入或从中提取字符。我们不需要知道与流相关的介质或其任何内部规范的详细信息。我们只需要知道流是字符的来源/目的地,这些字符是顺序提供/接受的(即,一个接一个)。cincoutcerrclog我们将更详细地介绍cout和cin。原创 2024-06-20 22:14:05 · 608 阅读 · 0 评论 -
运算符(Operators)
介绍了变量和常量之后,我们可以开始使用运算符对它们进行操作。以下是运算符的完整列表。目前,可能不需要知道所有的运算符,但它们都列在这里,以便作为参考。原创 2024-06-20 22:11:06 · 667 阅读 · 0 评论 -
常量(Constants)
另一个为常量命名的机制是使用预处理器定义。在此指令之后,代码中任何出现的identifier都会被解释为,其中replacement是任意字符序列(直到行尾)。此替换由预处理器执行,在程序编译之前发生,因此导致了一种盲替换:不以任何方式检查涉及的类型或语法的有效性。#define PI3.14159// 半径注意,#define行是预处理器指令,因此是单行指令——与C++语句不同——不需要在末尾加分号(;指令自动扩展到行尾。原创 2024-06-20 22:09:05 · 708 阅读 · 0 评论 -
变量和类型(Variables and types)
基本类型表示代码可能运行的机器处理的最基本类型。但C++语言的一个主要优势是其丰富的复合类型集合,其中基本类型只是构建块。复合类型的一个例子是string类。该类型的变量可以存储字符序列,例如单词或句子,非常有用!与基本数据类型的第一个区别是,为了声明和使用这种类型的对象(变量),程序需要包含定义该类型的标准库头文件(头文件<string>return 0;如上例所示,字符串可以用任何有效的字符串字面量初始化,就像数值类型变量可以用任何有效的数值字面量初始化一样。原创 2024-06-20 22:05:08 · 953 阅读 · 0 评论 -
程序结构(Structure of a program)
学习编程语言的最佳方式是通过编写程序。通常,初学者编写的第一个程序是一个名为“Hello World”的程序,它只是简单地将“Hello World”打印到计算机屏幕上。让我们逐行检查这个程序:第1行:两个斜杠表示该行的其余部分是程序员插入的注释,对程序的行为没有影响。程序员使用注释来包含有关代码或程序的简短解释或备注。在这种情况下,这是对程序的简短介绍性描述。第2行:以井号()开头的行是由称为预处理器的工具读取和解释的指令。这些是程序本身开始编译之前解释的特殊行。在这种情况下,指令。原创 2024-06-20 21:56:08 · 578 阅读 · 0 评论 -
编译器(Compilers)
计算机只能理解一种语言,这种语言由由一和零组成的指令集构成。这种计算机语言被恰当地称为机器语言。0000010011110000001001111000001111101000001010011110000111101010000100101111110010100000000可以想象,直接用一和零编写机器语言程序是非常繁琐且容易出错的。为了简化编程,高级语言被开发出来。高级程序也使得程序员更容易检查和理解彼此的程序。cin >> a;cin >> b;原创 2024-06-20 21:48:12 · 447 阅读 · 0 评论