C++ Primer Plus
在C++ Primer Plus一书中摘录并总结的一些知识点。
?Suki
你终究会成为你正在成为的人,你的每一个选择都是来自你人生意义的诘问。
展开
-
函数探幽——函数重载(含重载引用参数)
8.4函数重载函数重载让您能够使用多个同名的函数。我们可以通过函数重载来设计一系列函数——它们完成相同的工作,但使用不同的参数列表。函数重载的关键是函数的参数列表——也称为函数特征标(function signature)。如果两个函数的参数数目和类型相同,同时参数的排序顺序也相同,则它们的特征标相同,而变量名时无关紧要的。C++允许定义名称相同的函数,条件是它们的特征标不同。如果参数数目和/或参数类型不同,则特征标也不同。例如,可以定义一组原型如下的print( )函数:void prin原创 2020-07-15 10:34:12 · 539 阅读 · 0 评论 -
抽象数据类型ADT
Stock类非常具体。然而,程序员常常通过定义类来表示更通用的概念。例如:就实现计算机专家们所说的抽象数据类型(abstreact data type, ADT)而言,使用类是一种非常好的方式。顾名思义,ADT以通用的方式描述数据类型,而没有引入语言或实现细节。例如:通过使用栈,可以以这样的方式存储数据,即总是从堆顶添加或删除数据。例如,C++程序使用栈来管理自动变量。当新的自动变量被生成后,它...原创 2020-04-11 00:21:08 · 456 阅读 · 0 评论 -
引用变量!
引用变量引用是已定义的变量的别名(另一个名称)。但引用变量的主要用途是用作函数的形参。通过将引用变量用作参数,函数将使用原始数据,而不是其副本。创建引用变量C和C++使用&符号来指示变量的地址。C++给&符号赋予了另一个含义,将其用来声明引用。例如,要将rodents作为rats变量的别名,可以这样做:int rats;int & rodents = rats; ...原创 2020-04-13 00:50:09 · 335 阅读 · 0 评论 -
6.8 简单文件输入/输出
有时候,通过键盘输入并非最好的选择。例如,假设您编写了一个股票分析程序,并下载了一个文件,其中包含1000种股票的价格。在这种情况下,让程序直接读取文件,而不是手工输入文件中的所有的值,将方便得多。同样,让程序将输出写入到文件将更为方便,这样可得到有关结果的永久性记录。幸运的是,C++使得将读取键盘输入和在屏幕上显示输出(统称为控制台输入/输出)的技巧用于文件输入输入/输出(文件I/O)非常简单。这里简单介绍的文本文件I/O。6.8.1 文本I/O和文本文件使用cin进行输入时,程序将输入视为一系列原创 2020-05-20 16:23:42 · 542 阅读 · 0 评论 -
包含多个递归调用的递归(打印一把标尺)
在需要将一项工作不断分为两项较小的、类似的工作时,递归非常有用。例如:请考虑使用这种方法来绘制标尺的情况。标出两端,找到中点并将其标出。然后将同样的操作用于标尺的左半部分和右半部分。如果要进一步细分,可将同样的操作用于当前的每一部分。 递归方法有时被称为分而治之策略(divide-and-conquer strategy)程序清单7.17使用递归函数subdivide()演示了这种方法,该函数使用一个字符串,将该字符串除两端为|字符外,其他全部为空格。main函数使用循环调用subdivide()原创 2020-06-08 12:17:36 · 365 阅读 · 0 评论 -
深入探讨函数指针
首先下面是一些函数的原型,它们的特征标和返回类型相同:const double* f1(const double ar[ ], int n); const double* f2(const double [ ], int); const double* f3(const double *, int);这些函数的特征标看似不同,但实际上相同。但是,函数定义必须提供标识符,因此需要使用const double ar[ ]或const double *ar。接下来,假设要声明一个指针,它可指向这三个函原创 2020-06-13 11:54:42 · 440 阅读 · 1 评论 -
7.10 函数指针(基础知识)
与数据项相似,函数也有地址。函数的地址是存储其机器代码的内存的开始地址。通常,这些地址对用户而言,既不重要,也没有什么用处,但对程序而言,却很有用。例如,可以编写将另一个函数的地址作为参数的函数。这样第一个函数将能够找到第二个函数并运行它。与直接调用另一个函数相比,这种方法很笨拙,但它允许在不同的时间传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。首先通过一个例子来阐释这一过程。假设要设计一个名为estimate()的函数,估算编写指定行数的代码所需的时间,并且希望不同的程序员都将使用该函数原创 2020-06-10 00:20:31 · 248 阅读 · 0 评论 -
7.8 函数与array对象(基础篇引入)
假设您要使用一个array对象来存储一年四个季度的开支:std::array<double,4> expenses;前面说过,要使用array类,需要包含头文件array,而名称array位于名称空间std中。如果函数来显示expenses的内容,可按值传递expenses:show(expenses);但如果函数要修改对象expenses,则需将该对象的地址传递给函数(或传递引用)fill(&expenses);如何声明这两个函数呢?expenses的类型为array&l原创 2020-06-08 11:10:44 · 239 阅读 · 0 评论 -
作用域内枚举(C++11)
传统的枚举存在一些问题,其中之一是两个枚举定义中的枚举量可能发生冲突。假设有一个处理鸡蛋和T恤的项目,其中可能包含类似下面这样的代码:enum egg {Small, Medium, Large, Jumbo};enum t_shirt {Small, Medium, Large , Xlarge};这将无法通过编译,因为egg Small 和t_shirt Small位于相同的作用域内,它...原创 2020-04-10 19:30:15 · 327 阅读 · 0 评论 -
扩展——String类--string类输入
对于C-风格字符串,有三种方式: char info[100]; cin>>info; //read a word cin.getline(info,100); //read a line, discard \n cin.get(info, 100); //read a line, leave \n in queue 对于string对象,有两种方式: string stuff; cin>>stuff; //read a word ge原创 2020-06-15 15:32:53 · 454 阅读 · 0 评论 -
扩展——String类--构造字符串
构造字符串程序清单16.1使用了string的7个构造函数(用ctor标识,这是传统C++中构造函数的缩写)。表16.1简要的描述了这些构造函数。使用构造函数时都进行了简化,即隐藏了这样一个事实:string实际上是模板具体化basic_string的一个typedef,同时省略了与内存管理相关的参数。size_type是一个依赖于实现的整型,是在头文件string中定义的。string类将string::npos定义为字符串的最大长度,通常为unsigned int的最大值。另外,表格中使用缩写NB原创 2020-06-14 17:02:00 · 535 阅读 · 0 评论 -
抽象和类
类型是什么总之,指定基本类型完成了三项工作: 决定数据对象需要的内存数量; 决定如何解释内存中的位(long和float在内存中占用的位数相同,但将它们转换成数值的方法不同); 决定可使用数据对象执行的操作或方法。C++中的类类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。下面来看一个表示股票的类:首先,必须考虑如何表示股票,可...原创 2020-03-24 13:08:38 · 236 阅读 · 1 评论 -
string类简介
ISO/ANSI C++98标准通过添加string类扩展了C++库,因此现在可以string类型的变量(使用C++的话说是对象)而不是字符数组来存储字符串。您将看到,string类使用起来比数组简单,同时提供了将字符串作为一种数据类型的表示方法。要是用string类,必须在程序中包含头文件string。String类位于名称空间std中,因此您必须提供一条using编译指令,或者使用std:...原创 2020-02-14 16:21:53 · 240 阅读 · 0 评论 -
读取数字的循环(关于错误输入的处理)
假设要编写一个将一系列数字读入到数组中的程序,并允许用户在数组填满之前结束输入。一种方法是利用cin。请看下面代码:int n;cin >> n;如果用户输入一个单词,而不是一个数组,情况将如何呢?发生这种类型不匹配的情况时,将发生4种情况:n的值保持不变;不匹配的输入将被留在输入队列中;cin对象中的一个错误标记被设置;对cin方法的调用将返回false(如果被转换为bool类型)。方法返回false意味着可以用非数字输入来结束读取数字的循环。非数字输入设置错误标记意味着必原创 2020-05-17 01:14:01 · 598 阅读 · 0 评论 -
使用数组区间的函数
另一种给函数提供所需信息的方法,即指定元素区间(range),这可以通过传递两个指针来完成:一个指针标识数组的开头,另一个指针标识数组的尾部。也就是说,对于数组而言,表示数组结尾的参数将是指向最后一个元素后面的指针。例如,假设有这样的声明:double elbuod [20];这指针elboud和elboud+20定义了区间。首先,数组名elboub指向了第一个元素。表达式elboud+19指...原创 2020-04-30 20:25:14 · 488 阅读 · 0 评论 -
从数组到链表2
从数组到链表2理想的情况是,用户可以不确定地添加数据(或者不断添加数据直到用完内存量),而不是先指定要输入多少项,也不用程序分配多余的空间。这可以通过在输入每一项后调用malloc()分配正好能储存该项的空间。如果用户输入3部影片,程序就调用malloc()3次;如果用户输入300部影片,程序就调用malloc()300次。不过我们又制造了一个麻烦。比较一下一种方法是调用malloc()一次,...原创 2019-12-28 22:08:34 · 166 阅读 · 1 评论 -
从数组到链表1
从数组到链表//本博客用于记录对Stephen Prata著作的《C Primer Plus》内容的摘录我们来处理一个数据表示的示例。假设要编写一个程序,让用户输入一年内看过的所有电影。要储存每部影片的各种信息,如片名、发行年份、导演、主演、评级等。建议使用一个结构储存每部电影,一个数组储存一年内看过的电影。为简单起见,我们规定结构中只有两个成员:片名和评级(0~10)下面的程序清单1演示了...原创 2019-12-28 19:09:17 · 195 阅读 · 0 评论