05 2018 档案

摘要:处理指针成员的另一个完全不同的方法,是给指针成员提供值语义。具有值语义的类所定义的对象,其行为很像算术类型的对象:复制值型对象时,会得到一个不同的新副本。对副本所做的改变不会反映在原有对象上, 反之亦然。string类是值型类的一个例子。 要使指针成员表现得像一个值,复制 HasPtr 对象时必须复 阅读全文 »
posted @ 2018-05-15 20:50 刘-皇叔 编辑
摘要:包含指针的类需要特别注意复制控制,原因是复制指针时只复制指针中的地址,而不会复制指针指向的对象。设计具有指针成员的类时,类设计者必须首先需要决定的是该指针应提供什么行为。将一个指针复制到另一个指针时,两个指针指向同一对象。当两个指针指向同一对象时,可能使用任一指针改变基础对象。类似地,很可能一个指针 阅读全文 »
posted @ 2018-05-15 20:44 刘-皇叔 编辑
摘要:构造函数的一个用途是自动获取资源。例如,构造函数可以分配一个缓冲区或打开一个文件,在构造函数中分配了资源之后,需要一个对应操作自动回收或释放资源。析构函数就是这样的一个特殊函数,它可以完成所需的资源回收,作为类构造函数的补充。 何时调用析构函数 撤销类对象时会自动调用析构函数: 变量(如 item) 阅读全文 »
posted @ 2018-05-15 20:28 刘-皇叔 编辑
摘要:与类要控制初始化对象的方式一样,类也定义了该类型对象赋值时会发生什么: 与复制构造函数一样, 如果类没有定义自己的赋值操作符, 则编译器会合成一个。 介绍重载赋值 重载操作符是一些函数,其名字为 operator 后跟着所定义的操作符的符号。因此,通过定义名为 operator= 的函数,我们可以对 阅读全文 »
posted @ 2018-05-15 20:21 刘-皇叔 编辑
摘要:合成的复制构造函数 如果我们没有定义复制构造函数,编译器就会为我们合成一个。与合成的默认构造函数不同,即使我们定义了其他构造函数,也会合成复制构造函数。合成复制构造函数的行为是,执行逐个成员初始化,将新对象初始化为原对象的副本。所谓“逐个成员”,指的是编译器将现在对象的每个非 static 成员,依 阅读全文 »
posted @ 2018-05-15 20:18 刘-皇叔 编辑
摘要:只有单个形参,而且该形参是对本类类型对象的引用(常用 const 修饰),这样的构造函数称为复制构造函数。与默认构造函数一样,复制构造函数可由编译器隐式调用。复制构造函数可用于: 根据另一个同类型的对象显式或隐式初始化一个对象。 复制一个对象,将它作为实参传给一个函数。 从函数返回时复制一个对象。 阅读全文 »
posted @ 2018-05-15 20:15 刘-皇叔 编辑
摘要:铭记于心:学习一门语言最重要的方法就是不断的练习、练习、练习。 C++中的注释 单行注释符 界注释符 界注释符不能发生嵌套,一旦嵌套,在编译时会发生莫名其妙的错误,如下例子为错误: 为了体现界注释符的范围通常在界注释符每行开头加一个* 从键盘输入文件结束符 当从键盘向程序输入数据时,对于如何指出文件 阅读全文 »
posted @ 2018-05-14 10:31 刘-皇叔 编辑
摘要:容器特有的算法 list 容器上的迭代器是双向的,而不是随机访问类型。由于 list 容器不支持随机访问,因此,在此容器上不能使用需要随机访问迭代器的算法。这些算法包括 sort 及其相关的算法。还有一些其他的泛型算法,如 merge、remove、reverse 和 unique,虽然可以用在 l 阅读全文 »
posted @ 2018-05-10 22:57 刘-皇叔 编辑
摘要:算法的形参模式 任何其他的算法分类都含有一组形参规范。理解这些形参规范有利于学习新的算法——只要知道形参的含义,就可专注于了解算法实现的操作。大多数算法采用下面四种形式之一: 其中,alg 是算法的名字,beg 和 end 指定算法操作的元素范围。我们通常将该范围称为算法的“输入范围”。尽管几乎所有 阅读全文 »
posted @ 2018-05-10 22:56 刘-皇叔 编辑
摘要:算法要求的迭代器操作分为五个类别: Input iterator(输入迭代器) 读,不能写;只支持自增运算 Output iterator(输出迭代器) 写,不能读;只支持自增运算 Forward iterator(前向迭代器) 读和写;只支持自增运算 Bidirectional iterator( 阅读全文 »
posted @ 2018-05-10 22:54 刘-皇叔 编辑
摘要:反向迭代器 反向迭代器是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++ 运算将访问前一个元素,而 -- 运算则访问下一个元素。 回想一下,所有容器都定义了 begin 和 end 成员,分别返回指向容器首元素和尾元 阅读全文 »
posted @ 2018-05-10 22:51 刘-皇叔 编辑
摘要:虽然 iostream 类型不是容器,但标准库同样提供了在 iostream 对象上使用的迭代器: istream_iterator 用于读取输入流,而 ostream_iterator 则用于写输出流。这些迭代器将它们所对应的流视为特定类型的元素序列。使用流迭代器时,可以用泛型算法从流对象中读数据 阅读全文 »
posted @ 2018-05-10 22:49 刘-皇叔 编辑
摘要:C++ 语言提供了另外三种迭代器: 插入迭代器:这类迭代器与容器绑定在一起,实现在容器中插入元素的功能。 iostream 迭代器:这类迭代器可与输入或输出流绑定在一起,用于迭代遍历所关联的 IO 流。 反向迭代器:这类迭代器实现向后遍历,而不是向前遍历。所有容器类型都定义了自己的 reverse_ 阅读全文 »
posted @ 2018-05-10 22:45 刘-皇叔 编辑
摘要:实例: 在一个文本中实现: 1. 去掉所有重复的单词。 2. 按单词的长度排序。 3. 统计长度等于或超过 6 个字符的单词个数。 对于输入: 程序应该产生如下输出: 去除重复 假设我们的输入存储在一个名为 words 的 vector 对象中,第一个子问题是将 words 中重复出现的单词去除掉: 阅读全文 »
posted @ 2018-05-10 22:43 刘-皇叔 编辑
摘要:一些算法写入元素值。在使用这些算法写元素时要当心,必须确保算法所写的序列至少足以存储要写入的元素。有些算法直接将数据写入到输入序列,另外一些则带有一个额外的迭代器参数指定写入目标。这类算法将目标迭代器用作输出的位置。还有第三种算法将指定数目的元素写入某个序列。 写入输入序列的元素 写入到输入序列的算 阅读全文 »
posted @ 2018-05-10 22:36 刘-皇叔 编辑
摘要:accumulate 假设 vec 是一个 int 型的 vector 对象,下面的代码: 将 sum 设置为 vec 的元素之和再加上 42。accumulate 带有三个形参。头两个形参指定要累加的元素范围。第三个形参则是累加的初值。accumulate 函数将它的一个内部变量设置为指定的初值, 阅读全文 »
posted @ 2018-05-10 22:33 刘-皇叔 编辑
摘要:泛型算法 标准库容器定义的操作非常少。标准库没有给容器添加大量的功能函数,而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是“泛型”的,可作用在不同类型的容器和不同类型的元素上。 大多数算法是通过遍历由两个迭代器标记的一段元素来实现其功能。典型情况下,算法在遍历一段元素范围时,操纵其中的每一 阅读全文 »
posted @ 2018-05-10 22:30 刘-皇叔 编辑
摘要:我们的程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某单词在同一行中多次出现,程序将只显示该行一次。行号按升序显示。 查询程序的设计 设计程序的一个良好习惯是首先将程序所涉及的操作列出来。明确需要提供的操作有助于建立需要的 阅读全文 »
posted @ 2018-05-07 23:19 刘-皇叔 编辑
摘要:map 和 set 容器中,一个键只能对应一个实例。而 multiset 和 multimap类型则允许一个键对应多个实例。例如,在电话簿中,每个人可能有单独的电话号码列表。在作者的文章集中,每位作者可能有单独的文章标题列表。multimap和 multiset 类型与相应的单元素版本具有相同的头文 阅读全文 »
posted @ 2018-05-07 23:14 刘-皇叔 编辑
摘要:map 容器是键-值对的集合,好比以人名为键的地址和电话号码。相反地,set 容器只是单纯的键的集合。例如,某公司可能定义了一个名为 bad_checks的 set 容器,用于记录曾经给本公司发空头支票的客户。当只想知道一个值是否存在时,使用 set 容器是最适合的。例如,在接收一张支票前,该公司可 阅读全文 »
posted @ 2018-05-07 23:11 刘-皇叔 编辑
摘要:map 是键-值对的集合。map 类型通常可理解为关联数组(associative array) :可使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联, 而并非通过元素在数组中的位置来获取。 map 对象的定义 要使用 map 对象,则必须包含 map 阅读全文 »
posted @ 2018-05-07 23:09 刘-皇叔 编辑
摘要:关联容器的分类 关联容器(Associative containers) 支持通过键来高效地查找和读取元素。两个基本的关联容器类型是 map set。map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支 阅读全文 »
posted @ 2018-05-07 23:01 刘-皇叔 编辑
摘要:pair也是一种标准库类型,该类型在 utility 头文件中定义。 pair<T1, T2> p1; 创建一个空的 pair 对象,它的两个元素分别是 T1 和 T2类型,采用值初始化 pair<T1, T2> p1(v1, v2); 创建一个 pair 对象,它的两个元素分别是 T1 和 T2 阅读全文 »
posted @ 2018-05-07 22:59 刘-皇叔 编辑
摘要:容器适配器 除了顺序容器,标准库还提供了三种顺序容器适配器:queue、priority_queue 和 stack。 适配器(adaptor) 是标准库中通用的概念,包括容器适配器、迭代器适配器和函数适配器。本质上,适配器是使一事物的行为类似于另一事物的行为的一种机制。 适配器通用的操作和类型 s 阅读全文 »
posted @ 2018-05-06 21:54 刘-皇叔 编辑
摘要:string 类型定义了所有关系操作符,使程序员可以比较两个 string 对象是否相等(==)、不等(!=),以及实现小于或大于(<、<=、>、>=)运算。 string 对象采用字典顺序比较,也就是说,string 对象的比较与大小写敏感的字典顺序比较相同。操作符逐个字符地进行比较,直到比较到某 阅读全文 »
posted @ 2018-05-06 15:38 刘-皇叔 编辑
摘要:string 查找操作符 s.find( args) 在 s 中查找 args 的第一次出现 s.rfind( args) 在 s 中查找 args 的最后一次出现 s.find_first_of( args) 在 s 中查找 args 的任意字符的第一次出现 s.find_last_of( arg 阅读全文 »
posted @ 2018-05-06 15:11 刘-皇叔 编辑
摘要:string 类型提供了容器类型不支持其他几种操作: substr 函数,返回当前 string 对象的子串。 append 和 replace 函数,用于修改 string 对象。 一系列 find 函数,用于查找 string 对象。 substr 操作 s.substr(pos,n) 返回一个 阅读全文 »
posted @ 2018-05-06 14:30 刘-皇叔 编辑
摘要:与容器共有的 string 操作 s.insert(p, t) 在迭代器 p 指向的元素之前插入一个值为 t 的新元素。返回指向新插入元素的迭代器 s.insert(p, n,t) 在迭代器 p 指向的元素之前插入 n 个值为 t 的新元素。返回 void s.insert(p, b,e) 在迭代器 阅读全文 »
posted @ 2018-05-06 13:45 刘-皇叔 编辑
摘要:static 类成员 对于特定类类型的全体对象而言,访问一个全局对象有时是必要的。也许,在程序的任意点需要统计已创建的特定类类型对象的数量;或者,全局对象可能是指向类的错误处理例程的一个指针;或者,它是指向类类型对象的内在自由存储区的一个指针。 然而,全局对象会破坏封装:对象需要支持特定类抽象的实现 阅读全文 »
posted @ 2018-05-05 23:26 刘-皇叔 编辑
摘要:友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受声明出现部分的访问控制影响。 通常,将友元声明成组地放在类定义的开始或结尾是个好主意。 想 阅读全文 »
posted @ 2018-05-05 23:16 刘-皇叔 编辑
摘要:尽管大多数对象可以通过运行适当的构造函数进行初始化,但是直接初始化简单的非抽象类的数据成员仍是可能的。对于没有定义构造函数并且其全体数据成员均为 public 的类,可以采用与初始化数组元素相同的方式初始化其成员: 根据数据成员的声明次序来使用初始化式。例如,因为 ival 在 ptr 之前声明,所 阅读全文 »
posted @ 2018-05-05 23:13 刘-皇叔 编辑
摘要:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。 让我们再看看定义了两个构造函数的 Sales_item 版本: 这里的每个构造函数都定义了一个隐式转换。 因此, 在期待一个 Sales_item类型对象的地方,可以使用一个 string 或一个 istream: 这段程序使 阅读全文 »
posted @ 2018-05-05 23:11 刘-皇叔 编辑
摘要:只要定义一个对象时没有提供初始化式,就使用默认构造函数。为所有形参提供默认实参的构造函数也定义了默认构造函数。 合成的默认构造函数 一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数。这条规则的根据是,如果一个类在某种情况下需要控制对象初始化,则该类很可能在所有情况下都需要控制。 只有当 阅读全文 »
posted @ 2018-05-05 23:08 刘-皇叔 编辑
摘要:构造函数的基本概念 构造函数是特殊的成员函数,只要创建类类型的新对象, 都要执行构造函数。 构造函数的工作是保证每个对象的数据成员具有合适的初始值。 这个构造函数使用构造函数初始化列表来初始化 units_sold 和 revenue成员。isbn 成员由 string 的默认构造函数隐式初始化为空 阅读全文 »
posted @ 2018-05-05 23:06 刘-皇叔 编辑
摘要:每个类都定义了自己的新作用域和唯一的类型。在类的定义体内声明类成员,将成员名引入类的作用域。两个不同的类具有两个的类作用域。 即使两个类具有完全相同的成员列表,它们也是不同的类型。每个类的成员不同于任何其他类(或任何其他作用域)的成员。 例如: 使用类的成员 在类作用域之外,成员只能通过对象或指针分 阅读全文 »
posted @ 2018-05-05 22:52 刘-皇叔 编辑
摘要:基于 const 的重载 为了解决这个问题,我们必须定义两个 display 操作:一个是 const,另一个不是 const。 基于成员函数是否为 const, 可以重载一个成员函数; 同样地,基于一个指针形参是否指向 const,可以重载一个函数。const对象只能使用 const 成员。非 c 阅读全文 »
posted @ 2018-05-05 22:36 刘-皇叔 编辑
摘要:成员函数具有一个附加的隐含形参,即指向该类对象的一个指针。这个隐含形参命名为 this,与调用成员函数的对象绑定在一起。成员函数不能定义 this 形参,而是由编译器隐含地定义。成员函数的函数体可以显式使用 this 指针,但不是必须这么做。如果对类成员的引用没有限定,编译器会将这种引用处理成通过 阅读全文 »
posted @ 2018-05-05 22:32 刘-皇叔 编辑
摘要:定义一个类时,也就是定义了一个类型。一旦定义了类,就可以定义该类型的对象。定义对象时,将为其分配存储空间,但(一般而言)定义类型时不进行存储分配: 定义了一个新的类型,但没有进行存储分配。当我们定义一个对象 时,编译器分配了足以容纳一个 Sales_item 对象的存储空间。item 指的就是那个存 阅读全文 »
posted @ 2018-05-05 22:28 刘-皇叔 编辑
摘要:一旦遇到右花括号,类的定义就结束了。并且一旦定义了类,那以我们就知道了所有的类成员,以及存储该类的对象所需的存储空间。在一个给定的源文件中,一个类只能被定义一次。如果在多个文件中定义一个类,那么每个文件中的定义必须是完全相同的。 将类定义在头文件中,可以保证在每个使用类的文件中以同样的方式定义类。使 阅读全文 »
posted @ 2018-05-05 22:26 刘-皇叔 编辑
摘要:在类内部定义的成员函数,例如不接受实参的 get 成员,将自动作为inline 处理。也就是说,当它们被调用时,编译器将试图在同一行内扩展该函数。也可以显式地将成员函数声明为 inline: 可以在类定义体内部指定一个成员为 inline,作为其声明的一部分。或者,也可以在类定义外部的函数定义上指定 阅读全文 »
posted @ 2018-05-05 22:24 刘-皇叔 编辑
摘要:成员函数可被重载 成员函数只能重载本类的其他成员函数。类的成员函数与普通的非成员函数以及在其他类中声明的函数不相关,也不能重载它们。重载的成员函数和普通函数应用相同的规则:两个重载成员的形参数量和类型不能完全相同。调用非成员重载函数所用到的函数匹配过程也应用于重载成员函数的调用。 定义重载成员函数 阅读全文 »
posted @ 2018-05-05 22:21 刘-皇叔 编辑
摘要:成员函数 在类外部定义的成员函数必须指明它们是在类的作用域中。 Sales_item::avg_price 的定义使用作用域操作符来指明这是Sales_item 类中 avg_price 函数的定义。 在类内部,声明成员函数是必需的,而定义成员函数则是可选的。在类内部定义的函数默认为 inline。 阅读全文 »
posted @ 2018-05-05 22:17 刘-皇叔 编辑
摘要:类背后蕴涵的基本思想是数据抽象和封装。 数据抽象是一种依赖于接口和实现分离的编程(和设计)技术。类设计者必须关心类是如何实现的,但使用该类的程序员不必了解这些细节。相反,使用一个类型的程序员仅需了解类型的接口,他们可以抽象地考虑该类型做什么,而不必具体地考虑该类型如何工作。 封装是一项低层次的元素组 阅读全文 »
posted @ 2018-05-05 22:07 刘-皇叔 编辑
摘要:string 类型的构造方法 string s; 定义一个新的空 string 对象,命名为 s string s(cp); 定义一个新的 string 对象,用 cp 所指向的(以空字符 null 结束的)C 风格字符串初始化该对象 string s(s2); 定义一个新的 string 对象,并 阅读全文 »
posted @ 2018-05-04 18:11 刘-皇叔 编辑
摘要:插入操作如何影响容器的选择 list 容器表示不连续的内存区域,允许向前和向后逐个遍历元素。在任何位置都可高效地 insert 或 erase 一个元素。插入或删除 list 容器中的一个元素不需要移动任何其他元素。另一方面,list 容器不支持随机访问,访问某个元素要求遍历涉及的其他元素。 对于 阅读全文 »
posted @ 2018-05-04 17:41 刘-皇叔 编辑
摘要:vector 容器的自增长 在容器对象中 insert 或压入一个元素时,该对象的大小增加 1。类似地,如果 resize 容器以扩充其容量,则必须在容器中添加额外的元素。标准库处理存储这些新元素的内存分配问题。 为了支持快速的随机访问,vector 容器的元素以连续的方式存放——每一个元素都紧挨着 阅读全文 »
posted @ 2018-05-04 17:15 刘-皇叔 编辑
摘要:与赋值相关的操作符都作用于整个容器。除 swap 操作外,其他操作都可以用 erase 和 insert 操作实现。赋值操作符首先 erases 其左操作数容器中的所有元素, 然后将右操作数容器的所有元素 inserts 到左边容器中: 赋值后,左右两边的容器相等:尽管赋值前两个容器的长度可能不相等 阅读全文 »
posted @ 2018-05-04 16:31 刘-皇叔 编辑
摘要:c.erase(p) 删除迭代器 p 所指向的元素返回一个迭代器,它指向被删除元素后面的元素。如果 p 指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。如果 p 本身就是指向超出末端的下一位置的迭代器,则该函数未定义 c.erase(b,e) 删除迭代器 b 和 e 所标记的范 阅读全文 »
posted @ 2018-05-04 16:29 刘-皇叔 编辑
摘要:c.back() 返回容器 c 的最后一个元素的引用。如果 c 为空,则该操作未定义 c.front() 返回容器 c 的第一个元素的引用。如果 c 为空,则该操作未定义 c[n] 返回下标为 n 的元素的引用如果 n <0 或 n >= c.size(),则该操作未定义只适用于 vector 和 阅读全文 »
posted @ 2018-05-04 16:27 刘-皇叔 编辑
摘要:c.size() 返回容器 c 中的元素个数。返回类型为 c::size_type c.max_size() 返回容器 c 可容纳的最多元素个数,返回类型为c::size_type c.empty() 返回标记容器大小是否为 0 的布尔值 c.resize(n) 调整容器 c 的长度大小,使其能容纳 阅读全文 »
posted @ 2018-05-04 16:24 刘-皇叔 编辑
摘要:所有的容器类型都支持用关系操作符来实现两个容器的比较。想比较的容器必须具有相同的容器类型,而且其元素类型也必须相同。例如,vector<int> 容器只能与 vector<int> 容器比较,而不能与 list<int> 或vector< double > 容器比较。 容器的比较是基于容器内元素的比 阅读全文 »
posted @ 2018-05-04 16:22 刘-皇叔 编辑
摘要:所有顺序容器都支持push_back 操作,提供在容器尾部插入一个元素的功能。下面的循环每次读入一个 string 类型的值,并存放在 text_word: 对象中: 调用 push_back 函数会在容器 container 尾部创建一个新元素,并使容器的长度加 1。新元素的值为 text_wor 阅读全文 »
posted @ 2018-05-04 16:18 刘-皇叔 编辑
摘要:容器定义的类型别名 size_type 无符号整型,足以存储此容器类型的最大可能容器长度 iterator 此容器类型的迭代器类型 const_iterator 元素的只读迭代器类型 reverse_iterator 按逆序寻址元素的迭代器 const_reverse_iterator 元素的只读( 阅读全文 »
posted @ 2018-05-04 16:13 刘-皇叔 编辑
摘要:迭代器支持的运算 迭代器为所有标准库容器类型所提供的运算 *iter 返回迭代器 iter 所指向的元素的引用 iter->mem 对 iter 进行解引用,获取指定元素中名为 mem 的成员。等效于(*iter).mem ++iter iter++ 给 iter 加 1,使其指向容器里的下一个元素 阅读全文 »
posted @ 2018-05-04 13:49 刘-皇叔 阅读(885) 评论(0) 推荐(0) 编辑
摘要:顺序容器(sequential container)。它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。 标准库定义了三种顺序容器类型:vector、list 和 deque(是双端队列“doub 阅读全文 »
posted @ 2018-05-04 11:40 刘-皇叔 阅读(780) 评论(0) 推荐(0) 编辑
摘要:iostream 标准库支持内存中的输入/输出, 只要将流与存储在程序内存中的string 对象捆绑起来即可。此时,可使用 iostream 输入和输出操作符读写这个 string 对象。标准库定义了三种类型的字符串流: • istringstream,由 istream 派生而来,提供读 stri 阅读全文 »
posted @ 2018-05-03 19:18 刘-皇叔 阅读(463) 评论(0) 推荐(0) 编辑
摘要:在打开文件时,无论是调用 open 还是以文件名作为流初始化的一部分,都需指定文件模式(file mode)。每个 fstream 类都定义了一组表示不同模式的值, 用于指定流打开的不同模式。文件模式是整型常量,在打开指定文件时,可用位操作符设置一个或多个模式。文件流构造函数和 open 函数都提供 阅读全文 »
posted @ 2018-05-03 17:48 刘-皇叔 阅读(646) 评论(0) 推荐(0) 编辑
摘要:文件流对象的使用 fstream 头文件定义了三种支持文件 IO 的类型: 1. ifstream,由 istream 派生而来,提供读文件的功能。 2. ofstream,由 ostream 派生而来,提供写文件的功能。 3. fstream,由 iostream 派生而来,提供读写同一个文件的功 阅读全文 »
posted @ 2018-05-03 17:14 刘-皇叔 阅读(1965) 评论(0) 推荐(0) 编辑
摘要:每个 IO 对象管理一个缓冲区,用于存储程序读写的数据。如有下面语句: 系统将字符串字面值存储在与流 os 关联的缓冲区中。下面几种情况将导致缓冲区的内容被刷新,即写入到真实的输出设备或者文件: 1. 程序正常结束。作为 main 返回工作的一部分,将清空所有输出缓冲区。 2. 在一些不确定的时候, 阅读全文 »
posted @ 2018-05-03 16:50 刘-皇叔 阅读(458) 评论(0) 推荐(0) 编辑
摘要:实现 IO 的继承正是错误发生的根源。一些错误是可恢复的;一些错误则发生在系统底层,位于程序可修正的范围之外。IO 标准库管理一系列条件状态(condition state) 成员,用来标记给定的 IO 对象是否处于可用状态,或者碰到了哪种特定的错误。 strm::iostate 机器相关的整型名, 阅读全文 »
posted @ 2018-05-02 22:44 刘-皇叔 阅读(332) 评论(0) 推荐(0) 编辑
摘要:标准库类型和头文件 Header Type iostream istream wistream从流中读取 ostream wostream 写到流中去 iostream wiostream对流进行读写;从 istream 和 ostream 派生而来 fstream ifstream wifstre 阅读全文 »
posted @ 2018-05-02 22:41 刘-皇叔 阅读(204) 评论(0) 推荐(0) 编辑
摘要:函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定, 而与函数名无关: 这个语句将 pf 声明为指向函数的指针,它所指向的函数带有两个 const string& 类型的形参和 bool 类型的返回值。 *pf 两侧的圆括号是必需 阅读全文 »
posted @ 2018-05-02 18:05 刘-皇叔 阅读(267) 评论(0) 推荐(0) 编辑
摘要:函数匹配与实参转换 函数重载确定, 即函数匹配是将函数调用与重载函数集合中的一个函数相关联的过程。通过自动提取函数调用中实际使用的实参与重载集合中各个函数提供的形参做比较,编译器实现该调用与函数的匹配。匹配结果有三种可能: 1. 编译器找到与实参最佳匹配的函数,并生成调用该函数的代码。 2. 找不到 阅读全文 »
posted @ 2018-05-02 17:03 刘-皇叔 阅读(510) 评论(0) 推荐(0) 编辑
摘要:出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数。 可以定义一组函数,它们执行同样的一般性动作,但是应用在不同的形参类型上,调用这些函数时,无需担心调用的是哪个函数。 通过省去为函数起名并记住函数名字的麻烦,函数重载简化了程序的实现,使程序更容易理解。 任何程序都仅有一个 阅读全文 »
posted @ 2018-05-02 16:58 刘-皇叔 阅读(215) 评论(0) 推荐(0) 编辑
摘要:assert预处理宏 assert是一种预处理宏。所谓预处理宏其实是一个预处理变量,它的行为类似于内联函数。assert预处理宏用一个表达式作为它的条件: 若表达式expr为假,则assert输出信息并终止程序执行,如果表达式为真,则assert什么也不做。 assert宏定义在cassert头文件 阅读全文 »
posted @ 2018-05-02 15:00 刘-皇叔 阅读(329) 评论(0) 推荐(0) 编辑
摘要:内联函数 下面的例子中: 为这样的小操作定义一个函数的好处是: 阅读和理解函数 shorterString 的调用,要比读一条用等价的条件表达式取代函数调用表达式并解释它的含义要容易得多。 如果需要做任何修改, 修改函数要比找出并修改每一处等价表达式容易得多。 使用函数可以确保统一的行为,每个测试都 阅读全文 »
posted @ 2018-05-02 14:14 刘-皇叔 阅读(845) 评论(0) 推荐(0) 编辑
摘要:正如变量必须先声明后使用一样,函数也必须在被调用之前先声明。与变量的定义类似,函数的声明也可以和函数的定义分离;一个函数只能定义一次,但是可声明多次。 函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。这三个元素被称为函数原型, 函数原型描述了函数的接口。 阅读全文 »
posted @ 2018-05-02 13:54 刘-皇叔 阅读(1099) 评论(0) 推荐(0) 编辑
摘要:return 语句用于结束当前正在执行的函数,并将控制权返回给调用此函数的函数。return 语句有两种形式: 没有返回值的函数 不带返回值的 return 语句只能用于返回类型为 void 的函数。在返回类型为 void 的函数中,return 返回语句不是必需的,隐式的 return 发生在函数 阅读全文 »
posted @ 2018-05-02 11:32 刘-皇叔 阅读(1401) 评论(0) 推荐(0) 编辑
摘要:main:处理命令行选项 第一个形参argc表示数组中字符串的数量,第二个形参argv是一个数组,因为第二个形参是一个数组,所以main函数也可以定义为: 其中,argv指向char*。 当实参传给main函数之后,argv的第一个元素指向程序的名字或者一个空字符串,接下来的元素依次传递给命令行提供 阅读全文 »
posted @ 2018-05-02 09:31 刘-皇叔 阅读(857) 评论(0) 推荐(0) 编辑
摘要:const形参 当形参是const时,要注意顶层const: 当使用实参初始化形参时会忽略掉顶层的econst,也就是说形参的顶层const被忽略掉。当形参是顶层const时,传给它常量对象或者非常量对象都是可以的: 调用fcn函数时,既可以传入const inr也可以传入int。 忽略掉形参的顶层 阅读全文 »
posted @ 2018-05-01 23:28 刘-皇叔 阅读(2753) 评论(0) 推荐(1) 编辑
摘要:每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。 形参的初始化与变量的初始化一样:如果形参具有非引用类型,则复制实参的值,如果形参为引用类型,则它只是实参的别名。 传值参数 普通的非引用类型的参数通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有访 阅读全文 »
posted @ 2018-05-01 22:08 刘-皇叔 阅读(8385) 评论(1) 推荐(2) 编辑

点击右上角即可分享
微信分享提示