
C++语言导学
文章平均质量分 70
涵盖C++大多数语言特性和标准库组件,3个小时带你认识完整的C++,不枯燥、不教条、推陈出新、直指关键。
香香家的臭臭
这个作者很懒,什么都没留下…
展开
-
C++语言导学 第四章 类 - 4.5 类层次
C++语言导学 第四章 类 - 4.5 类层次4.5 类层次4.5.1 层次结构的益处4.5.2 层次漫游4.5.3 避免资源泄露4.5 类层次Container是一个非常简单的类层次的例子,所谓类层次(class hierarchy)是指通过派生(如:public)创建的一组类,在格中有序排列。我们使用类层次表示具有层次关系的概念,比如“消防车是卡车的一种,卡车是车辆的一种”以及“笑脸是一个圆,圆是一个形状”。在实际应用中,巨大的类层次很常见,动辄包含上百个类,不论深度还是宽度都很大。不过在本节,我们原创 2022-03-02 15:05:26 · 1510 阅读 · 0 评论 -
C++语言导学 第四章 类 - 4.4 虚函数
C++语言导学 第四章 类 - 4.4 虚函数4.4 虚函数4.4 虚函数我们再思考一下Container的用法:void use(Container& c){ const int sz = c.size(); for(int i = 0; i != sz; ++i) cout<<c[i]<<’\n’;}use()中的c [i] 调用是如何解析为正确的operator[] ()的?当h()调用use()时,必须调用List_container的opera原创 2022-03-02 14:56:36 · 321 阅读 · 0 评论 -
C++语言导学 第四章 类 - 4.3 抽象类型
C++语言导学 第四章 类 - 4.3 抽象类型4.3 抽象类型4.3 抽象类型complex和Vector这样的类型称为具体类型(concrete type),这是因为它们的表示属于定义的一部分。在这一点上,它们与内置类型很相似。相反,抽象类型(abstract type)将使用者与类的实现细节完全隔离开来。为此,我们将接口与表示分离开来,并且放弃了纯局部变量。由于我们对抽象类型的表示一无所知(甚至对其大小也不了解),所以必须从自由存储(参见4.2.2节)分配对象,然后通过引用或指针(参见1.7节、1原创 2022-03-02 14:43:17 · 565 阅读 · 0 评论 -
C++语言导学 第四章 类 - 4.2 具体类型
第四章 类4.2 具体类型4.2.1 一种算术类型4.2.2 容器4.2.3 初始化容器4.2 具体类型具体类(concrete class)的基本思想是,它们的行为“就像内置类型一样”。例如,一个复数类型和一个无穷精度整数与内置的int非常相像,当然它们有自己的语义和操作集。同样,vector和string也很像内置的数组,只不过它们的行为更加良好(参见9.2节、10.3节、11.2节)。具体类型的典型特征是,其表示是定义的一部分。在很多重要的例子中,如vector,其表示只是一个或几个指针,指向保原创 2022-01-05 10:00:00 · 350 阅读 · 0 评论 -
C++语言导学 第四章 类 - 4.1 引言
第四章 类4.1 引言4.1 引言本章和下一章的目标是在不涉及过多细节的前提下向读者展现C++是如何支持抽象和资源管理的:本章正式介绍定义和使用新类型(用户自定义类型,user-defined type)的方法。特别是,本章会介绍具体类(concrete class)、抽象类(abstract class)和类层次(class hierarchy)的基本性质、实现技术以及语言设施。第五章介绍一些在C++中已经定义了含义的操作,如构造函数、析构函数和赋值操作。这一章概括了如何组合使用这些操作来控制对原创 2022-01-04 10:00:00 · 122 阅读 · 0 评论 -
C++语言导学 第三章 模块化 - 3.6 函数参数和返回值
第三章 模块化3.6 函数参数和返回值3.6.1 参数传递3.6.2 返回值3.6.3 结构化绑定3.6 函数参数和返回值函数调用是从程序的一个部分向另一个部分传递信息的主要方式,也是推荐方式。执行任务所需的信息作为参数传递给函数,生成的结果作为返回值传回。例如:int sum(const vector<int>& v){ int s = 0; for(const int i : v) s += i; return s;}vector fib = {1,2,3,5,原创 2022-01-03 10:00:00 · 208 阅读 · 0 评论 -
C++语言导学 第三章 模块化 - 3.5 错误处理
第三章 模块化3.5 错误处理3.5.1 异常3.5.2 不变式3.5.3 错误处理替代3.5.4 合约3.5.5 静态断言3.5 错误处理错误处理是一个大而复杂的主题,其内容和涉及面都远远超越了语言设施层面,而深入到了程序设计技术和工具的范畴。不过C++还是提供了一些对此有帮助的特性,其中最主要的一个工具就是类型系统。我们不应基于内置类型(如char、int和double)和语句(如if、while和for)来费力地构造应用程序,而是应构造适合我们应用的类型(如string、map和regex)和算法原创 2022-01-02 10:00:00 · 305 阅读 · 0 评论 -
C++语言导学 第三章 模块化 - 3.4 名字空间
第三章 模块化3.4 名字空间3.4 名字空间除了函数、类和枚举之外,C++还提供了一种称为名字空间(namespace)的机制,用来表达某些声明属于一个整体以及它们的名字不会与其他名字冲突。例如,我希望利用自己定义的复数类型进行实验:namespace My_code{ class complex{ //... }; complex sqrt(complex); //... int main();}int My_code::main(){ complex z{1, 2}; a原创 2022-01-01 10:00:00 · 323 阅读 · 0 评论 -
C++语言导学 第三章 模块化 - 3.3 模块(C++20)
第三章 模块化3.3 模块(C++20)3.3 模块(C++20)使用#include是一种古老的、易出错的且代价相当高的程序模块化组织方式。如果你在101个编译单元中使用#include header.h,编译器将会处理header.h的文件101次。如果你在header2.h之前使用#include header1.h,则header1.h中的声明和宏可能影响header2.h中代码的含义。相反,如果你在header1.h之前使用#include header2.h,则header2.h可能影响he原创 2021-12-31 10:00:00 · 985 阅读 · 0 评论 -
C++语言导学 第三章 模块化 - 3.2 分别编译
第三章 模块化3.2 分别编译3.2 分别编译C++支持一种名为分别编译的概念,用户代码只能看见所用类型和函数的声明。这些类型和函数的定义则放置在分离的源文件里,并被分别编译。这种机制有助于将一个程序组织成一组半独立的代码片段,这种分离可用来最小化编译时间,并严格强制程序中逻辑独立的部分分离开来(从而最小化发生错误的可能)。库通常是一组分别编译的代码片段(如函数)的集合。通常,我们将说明模块接口的声明放置在一个文件中,文件名指示出预期用途。例如://Vector.h:class Vector{p原创 2021-12-30 10:00:00 · 240 阅读 · 0 评论 -
C++语言导学 第三章 模块化 - 3.1 引言
第三章 模块化3.1 引言3.1 引言一个C++程序包含许多独立开发的部分,例如函数、用户自定义类型、类层次和模版等。其管理的关键就是清晰地定义这些组成部分之间的交互。第一步也是最重要的一步是将每个部分的接口和实现分离开来。在语言层面,C++使用声明来表达接口。声明(declaration)指明了使用一个函数或一个类型所需要的东西。例如:double sqrt(double); //这个平方根函数接受一个double,返回值也是一个doubleclass Vector{public: Vecto原创 2021-12-29 10:00:00 · 170 阅读 · 0 评论 -
C++语言导学 第二章 用户自定义类型 - 2.5 枚举
第二章 用户自定义类型2.5 枚举2.5 枚举除了类之外,C++还提供了一种形式简单的用户自定义类型,可以用来枚举一系列值:enum class Color{red, blue, green};enum class Traffic_light{green, yellow, red};Color col = Color::red;Traffic_light light = Traffic_light::red;注意,枚举值(如red)位于其enum class的作用域之内,因此我们可以在不同的原创 2021-12-28 10:00:00 · 231 阅读 · 0 评论 -
C++语言导学 第二章 用户自定义类型 - 2.4 联合
第二章 用户自定义类型2.4 联合2.4 联合union是一种特殊的struct,它的所有成员被分配在同一块内存区域中,因此,联合实际占用的空间就是它最大的成员所占的空间。自然,在某个时刻,一个union中只能保存一个成员的值。例如,一个符号表表项结构保存一个名字和一个值,值可以是一个Node*或一个int:enum Type {ptr, num}; //一个Type可以保存值ptr和numstruct Entry{ string name; //string是一个标准库类型 Type t;原创 2021-12-27 10:00:00 · 255 阅读 · 0 评论 -
C++语言导学 第二章 用户自定义类型 - 2.3 类
第二章 用户自定义类型2.3 类2.3 类将数据说明与其操作分离开来有其优势,例如我们可以以任意方式使用数据。但对于用户自定义类型来说,为了具备“真正的类型”所需的所有性质,在其表示形式和操作之间建立紧密的联系是很有必要的。特别是,我们通常希望保持数据表示对用户不可见,从而实现易用性、保证数据使用的一致性以及允许设计者未来改进数据表示。为此,我们必须将类型的接口(所有人均可使用)与其实现(可访问对外部不可见的数据)分离开来。在C++中,实现上述目的的语言机制称为类(class)。类含有一系列成员(mem原创 2021-12-26 10:00:00 · 332 阅读 · 0 评论 -
C++语言导学 第二章 用户自定义类型 - 2.2 结构
第二章 用户自定义类型2.2 结构2.2 结构构造新类型的第一步通常是把所需的元素组织成一种数据结构,即一个struct:strict Vector{ int sz; //元素数目 double* elem; //指向元素的指针};这是Vector的第一个版本,它包含一个int和一个double*。Vector类型的变量可像这样定义:Vector v;但是,就v本身而言,它的用处似乎不大,因为v的elem指针并没有指向任何东西。为了让它变得有用,我们必须给出一些元素,令v指向原创 2021-12-25 10:00:00 · 117 阅读 · 0 评论 -
C++语言导学 第二章 用户自定义类型 - 2.1 引言
第二章 用户自定义类型2.1 引言2.1 引言用基本类型、const修饰符和声明运算符构造出来的类型,称为内置类型(built-in type)。C++的内置类型及其操作非常丰富,不过有意设计得更偏低层。这些内置类型能直接、高效地反映传统计算机硬件的能力,但是没有为程序员提供便于编写高级应用程序的高层设施。取而代之,C++在内置类型和操作的基础上增加了一套精致的抽象机制(abstraction mechanism),程序员可用它来构造所需的高层设施。C++抽象机制的目的主要是令程序员能够设计并实现他们原创 2021-12-24 10:00:00 · 236 阅读 · 0 评论 -
C++语言导学 第一章 基础知识 - 1.7 指针、数组和引用
第一章 基础知识1.7 指针、数组和引用空指针1.7 指针、数组和引用最基本的数据集合类型就是数组——一种空间连续分配的相同类型的元素序列。这基本上就是硬件所提供的机制。元素类型为char的数组可像下面这样声明:char v[6]; //含有6个字符的数组类似地,指针可这样声明:char* p; //指向字符的指针在声明语句中,[]表示“……的数组”,*表示“指向……”。所有数组的下标都从0开始,因此v包含6个元素,从v[0]到v[5]。数组的大小必须是一个常量表达式。一种指针变量中存放着一原创 2021-12-19 09:00:00 · 187 阅读 · 0 评论 -
C++语言导学 第一章 基础知识 - 1.6 常量
第一章 基础知识1.6 常量1.6 常量C++支持两种不变性概念:const:大致的意思是“我承诺不改变这个值”。主要用于说明接口,使得在用指针和引用将数据传递给函数时就不必担心数据会被改变了。编译器强行执行const做出的承诺。const的值可在运行时计算。constexpr:大致的意思是“在编译时求值”。主要用于说明常量,以允许将数据置于只读内存中(不太可能被破坏)以及提升性能。constexpr的值必须由编译器计算。例如:constexpr int dmv = 17; //dmv原创 2021-12-18 09:00:00 · 192 阅读 · 0 评论 -
C++语言导学 第一章 基础知识 - 1.5 作用域和生命周期
第一章 基础知识1.5 作用域和生命周期1.5 作用域和生命周期声明语句将一个名字引入到一个作用域中:局部作用域(local scope):声明在函数或者lambda内的名字称为局部名字(local name)。局部名字的作用域从声明它的地方开始,到声明语句所在的块的末尾为止。块(block)用花括号{}限定边界。函数参数的名字也属于局部名字。类作用域(class scope):如果一个名字定义在一个类中,且位于任何函数、lambda或enum class之外,则称之为成员名字(member na原创 2021-12-17 09:00:00 · 133 阅读 · 0 评论 -
C++语言导学 第一章 基础知识 - 1.4 类型、变量和算术运算
第一章 基础知识1.4 类型、变量和算术运算1.4.1 算术运算1.4.2 初始化1.4 类型、变量和算术运算每个名字、每个表达式都有自己的类型,类型决定了能对名字和表达式执行的操作。例如,下面的声明:int inch;指定inch的类型为int,也就是说,inch是一个整型变量。一个声明(declaration)是一条语句,为程序引入一个实体,并为该实体指明类型:一个类型(type)定义了一组可能的值以及一组(对象上的)操作。一个对象(object)是存放某种类型值的内存空间。一个值(原创 2021-12-16 09:00:00 · 265 阅读 · 0 评论 -
C++语言导学 第一章 基础知识 - 1.3函数
第一章 基础知识1.3 函数1.3 函数在C++程序中完成某些任务的主要方式就是调用函数。你若想描述如何进行某个操作,把它定义成函数是标准方式。注意,函数必须先声明后调用。一个函数声明需要给出三部分信息:函数的名字、函数的返回值类型(如果有的话)以及调用该函数必须提供的参数数量和类型。例如:Elem* next_elem(); //无参数,返回一个指向Elem的指针(一个Elem*)void exit(int); //接受一个int参数,不返回任何值double sqrt(double原创 2021-12-15 09:00:00 · 315 阅读 · 0 评论 -
C++语言导学 第一章 基础知识 - 1.2 程序
第一章 基础知识1.2 程序Hello, World!1.2 程序C++是一种编译型语言。为了让程序运行,首先要用编译器处理源代码文本,生成目标文件,然后再用连接器将目标文件组合成可执行程序。一个C++程序通常包含多个源代码文件,通常简称为源文件(source file)。可执行程序都是为特定的硬件、系统组合创建的,不具可移植性。比如说,Mac上的可执行程序就无法移植到windows PC上。当谈论C++程序的可移植性时,通常是指源代码的可移植性,即源代码可以在不同系统上成功编译并运行。ISO的C原创 2021-12-14 09:00:00 · 372 阅读 · 0 评论 -
C++语言导学 第一章 基础知识 - 1.1 引言
第一章 基础知识1.1 引言1.1 引言本章简单介绍C++的符号系统、C++的内存模型和计算模型以及将代码组织为程序的基本机制。这些语言设施支持最为常见的C语言编程风格,我们称之为过程式编程(procedural programming)。...原创 2021-12-13 09:00:00 · 218 阅读 · 0 评论