- 博客(110)
- 资源 (1)
- 收藏
- 关注
原创 C++面向对象基础教程(期待)
期待 欧梅尼亚 PS:如果您对接下来要探讨的事情有任何反馈或其他建议,请在下面的评论部分提及,希望我们有机会一起探讨!
2018-12-11 16:04:15 218 1
翻译 C++基础教程面向对象(学习笔记(109))
结束? 恭喜!你完成了整个面向教程!花点时间给自己当之无愧(插入你喜欢的东西)。 现在,在长长的松了一口气之后,你可能会问一个问题,“下一步是什么?”。 接下来是什么? 到目前为止,您应该对核心C ++面向对象语言有充分的了解。这样您就可以继续学习其他相邻区域。所以,如果有一些你真正有兴趣了解的东西,那么现在是时候看看你是否有足够的知识来进入这个领域。 但是,对于大多数用户来说,我认为有一些后续步...
2018-12-11 15:58:50 179
翻译 C++基础教程面向对象(学习笔记(108))
静态和动态库 一个库是一个代码包,是为了被很多程序重复使用。通常,C ++库分为两部分: 1)头文件,用于定义库向使用它的程序公开(提供)的功能。 2)预编译的二进制文件,包含预编译为机器语言的该功能的实现。 一些库可以分成多个文件和/或具有多个头文件。 由于几个原因,库被预编译。首先,由于库很少更改,因此不需要经常重新编译。每次编写使用它们的程序时重新编译库都是浪费时间。其次,因为预编译对象是机...
2018-12-11 15:47:47 152
翻译 C++基础教程面向对象(学习笔记(107))
随机文件I / O. 文件指针 每个文件流类都包含一个文件指针,用于跟踪文件中的当前读/写位置。当从文件中读取或写入某些内容时,读取/写入将发生在文件指针的当前位置。默认情况下,打开文件进行读取或写入时,文件指针将设置为文件的开头。但是,如果在附加模式下打开文件,则文件指针将移动到文件末尾,因此写入不会覆盖文件的任何当前内容。 使用seekg()和seekp()进行随机文件访问 到目前为止,我们所...
2018-12-11 15:36:42 166
翻译 C++基础教程面向对象(学习笔记(106))
基本文件I / O. C ++中的文件I / O与普通I / O非常相似(有一些小的复杂性)。C ++中有3个基本文件I / O类:ifstream(派生自istream),ofstream(派生自ostream)和fstream(派生自iostream)。这些类分别进行文件输入,输出和输入/输出。要使用文件I / O类,您需要包含fstream标头。 与已经可以使用的cout,cin,cerr和...
2018-12-11 15:25:40 123
翻译 C++基础教程面向对象(学习笔记(105))
流状态和输入验证 流状态 ios_base类包含几个状态标志,用于指示使用流时可能出现的各种情况: 旗 含义 goodbit 一切正常 badbit 发生了某种致命错误(例如程序试图读取文件末尾) eofbit 流已到达文件的末尾 failbit 发生了非致命错误(例如,当程序期望整数时用户输入了字母) 虽然这些标志位于ios_base中,因为ios派生自ios_base,ios输入的输入比ios...
2018-12-11 15:16:26 107
翻译 C++基础教程面向对象(学习笔记(104))
字符串的流类 到目前为止,您所看到的所有I / O示例都是写入cout或从cin读取。但是,还有另一组类称为字符串的流类,允许您使用熟悉的插入(<<)和提取(>>)运算符来处理字符串。与istream和ostream一样,字符串流提供了一个缓冲区来保存数据。但是,与cin和cout不同,这些流不连接到I / O通道(例如键盘,监视器等)。字符串流的主要用途之一是缓冲输出以便...
2018-12-09 14:49:35 104
翻译 C++基础教程面向对象(学习笔记(103))
使用ostream和ios输出 在本节中,我们将介绍iostream输出类(ostream)的各个方面。 注意:本课程中的所有I / O功能都位于std命名空间中。这意味着所有I / O对象和函数都必须以“std ::”为前缀,或者必须使用“using namespace std;”语句。 插入操作符 插入运算符(<<)用于将信息放入输出流。C ++为所有内置数据类型预定义了插入操作,...
2018-12-09 14:48:38 1326
翻译 C++基础教程面向对象(学习笔记(102))
使用istream输入 iostream库相当复杂 - 因此我们无法在这些教程中完整地介绍它。但是,我们将向您展示最常用的功能。在本节中,我们将介绍输入类(istream)的各个方面。 注意:本课程中的所有I / O功能都位于std命名空间中。这意味着所有I / O对象和函数都必须以“std ::”为前缀,或者必须使用“using namespace std;”语句。 提取算子 正如现在许多课...
2018-12-09 10:27:29 90
翻译 C++基础教程面向对象(学习笔记(101))
输入和输出(I / O)流 输入和输出功能未定义为核心C ++语言的一部分,而是通过C ++标准库提供(因此驻留在std命名空间中)。在前面的课程中,您包含了iostream库头,并使用cin和cout对象来执行简单的I / O. 在本课中,我们将更详细地介绍iostream库。 iostream库 当您包含iostream标头时,您可以访问负责提供I / O功能的整个类层次结构(包括一个实际上名...
2018-12-07 17:14:33 112
翻译 C++基础教程面向对象(学习笔记(100))
std :: string插入 插入 可以通过insert()函数将字符插入现有字符串。 string&string :: insert(size_type index,const string&str) string&string :: insert(size_type index,const char * str) //这两个函数都将str的字符插入到索引处的字符串中 //两个函数都返回*这样...
2018-12-07 17:04:06 139
翻译 C++基础教程面向对象(学习笔记(99))
std :: string追加 追加 使用operator + =,append()或push_back()函数可以轻松地将字符串附加到现有字符串的末尾。 string&string :: operator + =(const string&str) string&string :: append(const string&str) 这两个函数都将str的字符附加到字符串。 两个函数都返回*这样它...
2018-12-07 17:00:55 68
翻译 C++基础教程面向对象(学习笔记(98))
std :: string赋值和交换 字符串赋值 为字符串赋值的最简单方法是使用重载的operator =函数。还有一个assign()成员函数,它复制了一些这样的功能。 string&string :: operator =(const string&str) string&string :: assign(const string&str) string&string :: operator ...
2018-12-07 11:40:45 168
翻译 C++基础教程面向对象(学习笔记(97))
std :: string字符访问和转换为C风格的数组 Character 访问 有两种几乎相同的方式来访问字符串中的字符。更容易使用和更快的版本是重载运算符[]: char&string :: operator [](size_type nIndex) const char&string :: operator [](size_type nIndex)const //这两个函数都返回索引为nIn...
2018-12-07 11:34:44 83
翻译 C++基础教程面向对象(学习笔记(96))
std :: string长度和容量 一旦你创建了字符串,知道它们有多长时间通常很有用。这是长度和容量操作发挥作用的地方。我们还将讨论将std :: string转换回C风格字符串的各种方法,因此您可以将它们与期望字符串类型为char *的函数一起使用。 字符串的长度 字符串的长度非常简单 - 它是字符串中的字符数。确定字符串长度有两个相同的函数: size_type string :: leng...
2018-12-07 10:56:22 89
翻译 C++基础教程面向对象(学习笔记(95))
std :: string构造和销毁 在本课中,我们将介绍如何构造std :: string的对象,以及如何创建字符串,反之亦然。 字符串构造 字符串类有许多可用于创建字符串的构造函数。我们将在这里看看他们。 注意:string :: size_type解析为size_t,这与sizeof运算符返回的无符号整数类型相同。其实际尺寸因环境而异。出于本教程的目的,将其视为unsigned int。 s...
2018-12-06 18:01:20 189
翻译 C++基础教程面向对象(学习笔记(94))
std :: string和std :: wstring 标准库包含许多有用的类,但最有用的可能是std :: string。std :: string(和std :: wstring)是一个字符串类,它提供许多操作来分配,比较和修改字符串。在本章中,我们将深入研究这些字符串类。 注意:C风格的字符串将被称为“C风格的字符串”,而std :: strings(和std :: wstring)将简称...
2018-12-06 16:52:10 124
翻译 C++基础教程面向对象(学习笔记(93))
STL算法概述 除了容器类和迭代器之外,STL还提供了许多用于处理容器类元素的通用算法。这些允许您执行诸如搜索,排序,插入,重新排序,删除和复制容器类的元素之类的操作。 请注意,算法是作为使用迭代器操作的全局函数实现的。这意味着每个算法只需要实现一次,它通常会自动适用于提供一组迭代器(包括自定义容器类)的所有容器。虽然这非常强大并且能够快速编写复杂代码,但它也有一个糟糕的一面:算法和容器类型的某些...
2018-12-06 16:07:55 87
翻译 C++基础教程面向对象(学习笔记(92))
STL迭代器概述 一个迭代器是一个对象,可以遍历(迭代)的容器类,而无需知道该容器是如何实现的。对于许多类(特别是列表和关联类),迭代器是访问这些类的元素的主要方式。 迭代器最好可视化为指向容器中给定元素的指针,并带有一组重载运算符以提供一组明确定义的函数: Operator* 取消引用迭代器并且返回迭代器当前指向的元素。 Operator ++将迭代器移动到容器中的下一个元素。大多数迭代器也提供...
2018-12-06 15:54:21 80
翻译 C++基础教程面向对象(学习笔记(91))
STL容器概述 到目前为止,STL库最常用的功能是STL容器类。如果您需要快速了解容器类,请查看课程 容器类。 STL包含许多不同的容器类,可以在不同的情况下使用。一般来说,容器类分为三个基本类别:序列容器,关联容器和容器适配器。我们将在这里快速概述容器。 序列容器 序列容器是容器类,用于维护容器中元素的顺序。序列容器的一个定义特征是您可以选择按位置插入元素的位置。序列容器最常见的示例是数组,如果...
2018-12-05 11:25:09 108
翻译 C++基础教程面向对象(学习笔记(90))
标准模板库(STL) 恭喜!你完成了本教程的主要部分!在前面的课程中,我们介绍了所有主要的C ++语言特性(不包括C ++ 11语言扩展中的特性)。 所以显而易见的问题是,“下一步是什么?”。你可能注意到的一件事是,很多程序一遍又一遍地使用相同的概念:循环,字符串,数组,排序等…你可能也注意到使用非类容器版本编写程序和常见算法容易出错。好消息是C ++附带了一个库,里面装满了可重用的类,供你用来构...
2018-12-05 11:12:13 83
翻译 C++基础教程面向对象(学习笔记(89))
综合检测 智能指针类是一个组合类,用于管理动态分配的内存,并确保在智能指针对象超出范围时删除内存。 复制语义允许复制我们的类。这主要通过复制构造函数和复制赋值运算符完成。 移动语义意味着一个类将转移对象的所有权而不是复制。这主要通过移动构造函数和移动赋值运算符完成。 std :: auto_ptr已弃用,应避免使用。 r值引用是用于使用r值初始化的引用。使用双符号创建r值参考。编写带有r值引用参数...
2018-12-05 11:06:48 104
翻译 C++基础教程面向对象(学习笔记(88))
std :: shared_ptr和std :: weak_ptr的循环依赖问题 在上一课中,我们看到了std :: shared_ptr如何让我们拥有多个智能指针共同拥有相同的资源。但是,在某些情况下,这可能会成为问题。考虑以下情况,其中两个单独对象中的共享指针均指向另一个对象: #include <iostream> #include <memory> // for s...
2018-12-05 10:49:03 132
翻译 C++基础教程面向对象(学习笔记(87))
std :: shared_ptr 与std :: unique_ptr(专门用于拥有和管理资源)不同,std :: shared_ptr旨在解决您需要多个智能指针共同拥有资源的情况。 这意味着将多个std :: shared_ptr指向同一资源是可以的。在内部,std :: shared_ptr会跟踪std :: shared_ptr共享资源的数量。只要至少有一个std :: shared_pt...
2018-12-04 20:45:35 77
翻译 C++基础教程面向对象(学习笔记(86))
std :: unique_ptr 在本章的开头,我们讨论了在某些情况下如何使用指针可能导致错误和内存泄漏。例如,当函数提前返回或抛出异常并且未正确删除指针时,可能会发生这种情况。 #include <iostream> void someFunction() { Resource *ptr = new Resource; int x; std::cou...
2018-12-04 20:31:11 112
翻译 C++基础教程面向对象(学习笔记(85))
std :: move 一旦开始更频繁地使用移动语义,您将开始查找要调用移动语义的情况,但您必须使用的对象是l值,而不是r值。以下面的交换函数为例: #include <iostream> #include <string> template<class T> void swap(T& a, T& b) { T tmp { a }; ...
2018-12-04 19:50:55 133
翻译 C++基础教程面向对象(学习笔记(84))
移动构造函数并移动赋值 在前面智能指针和移动语义的介绍中,我们看了一下std :: auto_ptr,讨论了移动语义的愿望,并看了一下在为复制语义设计的函数时出现的一些缺点(复制构造函数)和复制赋值运算符)被重新定义以实现移动语义。 在本课中,我们将深入研究C ++ 11如何通过移动构造函数和移动赋值来解决这些问题。 复制构造函数和复制赋值 首先,让我们花点时间来回顾一下复制语义。 复制构造函数用...
2018-12-04 17:25:36 76
翻译 C++基础教程面向对象(学习笔记(83))
R值参考 我们需要了解l值和r值,然后告诉你不要太担心它们。这是C ++ 11之前的建议。但是理解C ++ 11中的移动语义需要重新审视该主题。所以我们现在就这样做。 L值和r值 尽管名称中包含“值”一词,但l值和r值实际上不是值的属性,而是表达式的属性。 C ++中的每个表达式都有两个属性:一个类型(用于类型检查)和一个值类别(用于某些类型的语法检查,例如是否可以将表达式的结果赋值)。在C ++...
2018-12-03 20:25:35 149
翻译 C++基础教程面向对象(学习笔记(82))
智能指针简介和移动语义 考虑一个我们动态分配值的函数: void someFunction() { Resource *ptr = new Resource; // Resource是一个结构或类 // 在这里做ptr的东西 delete ptr; } 虽然上面的代码看起来相当简单,但忘记释放ptr却相当容易。即使您确实记得在函数末尾删除ptr,如果函数提前退出,...
2018-12-03 20:00:11 168
翻译 C++基础教程面向对象(学习笔记(81))
综合测验 章节回顾 异常处理提供了一种机制,可以将错误或其他异常情况的处理与代码的典型控制流分离。这允许更自由地处理在给定情况下何时以及如何处理最有用的错误,从而减轻返回代码引起的许多(如果不是全部)混乱。 一个throw句用来引发异常。 try块查找在其中编写或调用的代码抛出的异常。这些异常被路由到catch块,这些块捕获特定类型的异常(如果它们匹配)并处理它们。默认情况下,捕获的异常被视为已处...
2018-12-01 10:43:07 116
翻译 C++基础教程面向对象(学习笔记(80))
异常危险和缺点 与几乎所有有益的东西一样,异常也存在一些潜在的缺点。本文并不是全面的,只是指出在使用异常(或决定是否使用它们)时应该考虑的一些主要问题。 清理资源 使用异常时新程序员遇到的最大问题之一是在发生异常时清理资源的问题。请考虑以下示例: try { openFile(filename); writeFile(filename, data); closeFile(f...
2018-12-01 10:36:08 134
翻译 C++基础教程面向对象(学习笔记(79))
函数try块 在大多数情况下,try和catch块工作得很好,但有一个特殊情况,它们是不够的。请考虑以下示例: class A { private: int m_x; public: A(int x) : m_x(x) { if (x <= 0) throw 1; } }; class B : public A { public: B(int x) : A(x) {...
2018-12-01 10:23:30 115
翻译 C++基础教程面向对象(学习笔记(78))
重新抛出异常 有时候,您可能会遇到想要捕获异常的情况,但不希望(或有能力)在捕获它时完全处理它。这在您想要记录错误,这很很常见,但会将问题传递给调用者以实际处理。 当函数可以使用返回代码时,这很简单。请考虑以下示例: Database* createDatabase(std::string filename) { try { Database *d = new Da...
2018-12-01 09:58:00 81
翻译 C++基础教程面向对象(学习笔记(77))
异常,类和继承 例外和成员函数 到目前为止,在本教程中,您只看到了非成员函数中使用的异常。但是,异常在成员函数中同样有用,甚至在重载运算符中也是如此。将以下重载的[]运算符视为简单整数数组类的一部分: int&amp; IntArray::operator[](const int index) { return m_data[index]; } 虽然只要index是一个有效的数组索引,这...
2018-12-01 09:33:28 265
翻译 C++基础教程面向对象(学习笔记(76))
未捕获的异常,catch-all处理程序和异常说明符 到目前为止,您应该对异常如何工作有一个合理的认识。在本课中,我们将介绍一些更有趣的异常情况。 未捕获的例外情况 在过去的几个例子中,有很多情况下函数假定其调用者(或调用堆栈上的某个其他函数)将处理异常。在下面的示例中,mySqrt()假设有人将处理它抛出的异常 - 但是如果没有人真正这样做会发生什么? 这是我们的平方根程序,减去main()中的...
2018-11-29 10:12:05 96
翻译 C++基础教程面向对象(学习笔记(75))
异常,函数和堆栈展开 在上一节关于基本异常处理的课程中,我们解释了throw,try和catch如何协同工作以启用异常处理。在本课中,我们将讨论异常处理如何与函数交互。 在try块之外抛出异常 在上一课的示例中,throw语句直接放在try块中。如果这是必要的,则异常处理的用途有限。 异常处理最有用的特性之一是throw语句不必直接放在try块中,因为异常在抛出时会向上传播。这允许我们以更加模块化...
2018-11-29 09:17:33 111
翻译 C++基础教程面向对象(学习笔记(74))
基本异常处理 在上一节关于异常需求的课程中,我们讨论了如何使用返回代码导致控制流和错误流混合,从而限制两者。 C ++中的异常是使用三个相互协作的关键字实现的:throw,try和catch。 抛出异常 我们在现实生活中一直使用信号来记录特定事件已经发生。例如,在美式橄榄球比赛期间,如果一名球员犯了一个犯规,裁判将在地面上扔一面旗帜,然后吹哨。然后评估并执行惩罚。一旦罚款得到处理...
2018-11-28 17:23:08 100
翻译 C++基础教程面向对象(学习笔记(73))
需要例外 在上一节处理错误的课程中,我们讨论了使用assert(),cerr()和exit()来处理错误的方法。但是,我们对另一个我们将要讨论的主题进行了遗留:例外情况。 返回代码失败时 在编写可重用代码时,错误处理是必要的。处理潜在错误的最常见方法之一是通过返回码。例如: int findFirstChar(const char* string, char ch) { const std...
2018-11-28 10:47:22 79
翻译 C++基础教程面向对象(学习笔记(72))
综合测验 模板允许我们使用占位符类型编写函数或类,以便我们可以使用不同的类型来模拟函数或类的相同版本。已实例化的函数或类称为函数或类实例。 所有模板函数或类必须以模板参数声明开头,该声明告诉编译器以下函数或类是模板函数或类。在模板参数声明中,指定了模板类型参数或表达式参数。模板类型参数只是占位符类型,通常名为T,T1,T2或其他单个字母名称(例如S)。表达式参数通常是整数类型,但可以是函数,类对象...
2018-11-28 10:14:26 89
翻译 C++基础教程面向对象(学习笔记(71))
指针的部分模板特化 在上一课 函数模板专业化中,我们看了一个简单的模板化Storage类: #include <iostream> template <class T> class Storage { private: T m_value; public: Storage(T value) { m_value = value; ...
2018-11-28 10:01:03 80
SimMechanics_help_完整版
2018-12-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人