C++语法、架构、内部机制
文章平均质量分 75
Winston_wu
㊣
展开
-
字符串循环右移(一道面试题的代码实现)
#include void revStr(char* arr, const size_t N ){ for(int i=0;i char tmp = arr[i]; arr[i]=arr[N-1-i]; arr[N-1-i]=tmp; } } void moveStr(char* arr, const size_t N, const size_t K){原创 2013-04-17 20:21:10 · 681 阅读 · 0 评论 -
C++ Primer 4 第十六章 模板和泛型编程
第十六章 模板和泛型编程1. 模板定义定义函数模板:函数模板是一个独立于类型的函数,可作为一种方式,产生函数的特定类型版本。模板定义以关键字 template 开始,后接模板形参表,模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间以逗号分隔。模板形参表不能为空。 // implement strcmp-like generic compare functi原创 2012-02-29 17:31:43 · 565 阅读 · 0 评论 -
C++ Primer 4 第十五章 面向对象编程
第十五章 面向对象编程1. 面向对象编程:概述在 C++ 中,基类必须指出希望派生类重写哪些函数,定义为 virtual 的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。在 C++ 中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调原创 2012-02-29 17:31:00 · 394 阅读 · 0 评论 -
C++ Primer 4 第十一章 泛型算法
第十一章 泛型算法1. 概述算法永不执行容器提供的操作:泛型算法本身从不执行容器操作,只是单独依赖迭代器和迭代器操作实现。算法基于迭代器及其操作实现,而并非基于容器操作。这个事实也许比较意外,但本质上暗示了:使用“普通”的迭代器时,算法从不修改基础容器的大小。正如我们所看到的,算法也许会改变存储在容器中的元素的值,也许会在容器内移动元素,但是,算法从不直接添加或删除元素。2. 初窥算法原创 2012-02-29 17:28:19 · 376 阅读 · 0 评论 -
C++ Primer 4 第十章 关联容器
第十章 关联容器关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。1. 引言:pair 类型 pair 包含两个数据值。与容器一样,pair 也是一种模板类型。但又与之前介绍的容器不同,在创建 pair 对象时,必须提供两个类型名:pair 对象所包含的两个数据成员各自对应的类型名字原创 2012-02-29 17:27:40 · 472 阅读 · 0 评论 -
C++ Primer 4 第六章 语句
第六章 语句1. 简单语句程序语句最简单的形式是空语句,它使用以下的形式(只有一个单独的分号):; // null statement2. 声明语句3. 复合语句(块)复合语句,通常被称为块,是用一对花括号括起来的语句序列(也可能是空的)。块标识了一个作用域,在块中引入的名字只能在该块内部或嵌套在块中的子块里访问。通常,一个名字只从其定义处到该块的结尾这段范围内可见。与其原创 2012-02-29 17:25:05 · 399 阅读 · 0 评论 -
CPP学习备忘[12] 模板
【1】模板使程序员能够快速建立具有类型安全的类库集合和函数集合,以方便更大规模的软件开发。C++的STL全赖于模板实现,模板是C++面向对象程序设计的重要补充。 【2】函数模板的定义形式为: template 返回类型 函数模板名(数据参数表) { 函数模板定义体; } 【3】函数模板不是函数,它是以具体的类型为实参来生成函原创 2011-12-13 11:41:35 · 405 阅读 · 0 评论 -
CPP学习备忘[10] 抽象类
【1】一般地,一个容器,其元素是基类对象的指针或引用,才有多态可言。若没有指向基类的操作,子类就不能行使多态。 【2】抽象类的用途是被继承。定义抽象类就是在类定义中至少声明一个纯虚函数。所谓纯虚函数就是指明为不具体实现的虚函数。纯虚函数一旦声明,就不用定义,纯虚函数的声明形式是在虚函数声明形式后跟“=0”,例如:virtual void withdrawal(double amount)=原创 2011-12-13 11:41:10 · 354 阅读 · 0 评论 -
CPP学习备忘[9] 多态
【1】虽然从广义上说,数据类型是数据结构在一定的编程语言中的描述形式,但实际上描述群体数据(容器)的抽象数据类型才是数据结构的真正体现。 【2】类定义不占用任何内存空间,也没有任何对象的预处理,所以没有任何操作上的开销。 【1】一个操作随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态。 C++中采用一种滞后绑定技术来支持多态性,即滞后到运行时,根据具原创 2011-12-13 11:39:59 · 325 阅读 · 0 评论 -
CPP学习备忘[7] 对象生灭
【1】当以无初始化的形式,如:Date d;定义时,若创建全局对象,则以全0位的模式表示对象。若创建局部对象,则以随机值表示对象。 作为对象的构造函数,其根本的使命就是创建对象实体,如果创建失败,这时若真要论及处理,就该让程序捕捉该异常,或者干脆终止程序的运行。因此构造函数的工作不以对象体作为返回值,也不以运行的成败状态作为继续运行的依据,构造函数的成功运行,确立了对象实体今后的操作合法原创 2011-12-13 11:38:33 · 402 阅读 · 0 评论 -
C++ Primer 4 第十四章 重载操作符与转换
第十四章 重载操作符与转换1. 重载操作符的定义 重载操作符是具有特殊名称的函数:保留字 operator 后接需定义的操作符号。像任意其他函数一样,重载操作符具有返回类型和形参表,如下语句: Sales_item operator+(const Sales_item&, const Sales_item&);可以重载的操作符: + -原创 2012-02-29 17:30:14 · 476 阅读 · 0 评论 -
C++ Primer 4 第十七章 用于大型程序的工具
第十七章 用于大型程序的工具1. 异常处理异常是通过抛出对象而引发的。该对象的类型决定应该激活哪个处理代码。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个. 执行 throw 的时候,不会执行跟在 throw 后面的语句,而是将控制从 throw 转移到匹配的 catch,该 catch 可以是同一函数中局部的 catch,也可以在直接或间接调用发生异常的函数的另一个原创 2012-02-29 17:32:26 · 500 阅读 · 0 评论 -
C++ Primer 4 第十八章 特殊工具与技术
第十八章 特殊工具与技术1. 优化内存分配C++ 提供下面两种方法分配和释放未构造的原始内存: 1)allocator 类,它提供可感知类型的内存分配。这个类支持一个抽象接口,以分配内存并随后使用该内存保存对象。 2)标准库中的operator new 和 operator delete,它们分配和释放需要大小的原始的、未类型化的内存。C++ 还原创 2012-02-29 17:33:00 · 428 阅读 · 0 评论 -
C++ Primer 4 第九章 顺序容器
第九章 顺序容器顺序容器内的元素按其位置存储和访问。标准库定义了三种顺序容器类型:vector、list 和 deque。它们的差别在于访问元素的方式,以及添加或删除元素相关操作的运行代价。标准库还提供了三种容器适配器。实际上,适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型。顺序容器适配器包括 stack、queue 和 priority_queue 类型原创 2012-02-29 17:27:05 · 492 阅读 · 0 评论 -
C++ Primer 4 第八章 标准 IO 库
第八章 标准 IO 库1. 面向对象的标准库IO 类型在三个独立的头文件中定义:iostream 定义读写控制窗口的类型,fstream 定义读写已命名文件的类型,而 sstream 所定义的类型则用于读写存储在内存中的 string 对象。在 fstream 和 sstream 里定义的每种类型都是从 iostream 头文件中定义的相关类型派生而来。istream 是 ifstream原创 2012-02-29 17:26:23 · 411 阅读 · 0 评论 -
C++ Primer 4 第五章 表达式
第五章 表达式1. 算术操作符 操作符 % 称为“求余(remainder)”或“求模(modulus)”操作符,用于计算左操作数除以右操作数的余数。该操作符的操作数只能为整型,包括 bool、char、short 、int 和 long 类型,以及对应的 unsigned 类型。2. 关系操作符和逻辑操作符 逻辑与和逻辑或操作符总是先计算其左操作数原创 2012-02-29 17:24:37 · 358 阅读 · 0 评论 -
C++ primer 4 第十三章 复制控制
第十三章 复制控制 复制构造函数、赋值操作符和析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。 当定义一个新类型的时候,需要显式或隐式地指定复制、赋值和撤销该类型的对象时会发生什么——这是通过定义特殊成员:复制构造函数、赋值操作符和析构函数来达到的。如果没有显式定义复制构造函数或赋值操作符,编译器(通常)会为我们定义。原创 2012-02-29 17:29:34 · 366 阅读 · 0 评论 -
C++ Primer 4 第十二章 类
第十二章 类1. 类的定义和声明成员函数:在类内部定义的函数默认为 inline,在类外部定义的成员函数必须指明它们是在类的作用域中。成员函数有一个附加的隐含实参,将函数绑定到调用函数的对象。将关键字 const 加在形参表之后,就可以将成员函数声明为常量:double avg_price() const; const 成员不能改变其所操作的对象的数据成员。const 必须同时出现在声明和原创 2012-02-29 17:28:59 · 390 阅读 · 0 评论 -
C++ Primer 4 第七章 函数
第七章 函数1. 函数的定义函数调用做了两件事情:用对应的实参初始化函数的形参,并将控制权转移给被调用函数。主调函数的执行被挂起,被调函数开始执行。函数的运行以形参的(隐式)定义和初始化开始。与初始化式的类型必须与初始化对象的类型匹配一样,实参的类型也必须与其对应形参的类型完全匹配:实参必须具有与形参类型相同、或者能隐式转换为形参类型的数据类型。函数不能返回另一个函数或者内置数组类原创 2012-02-29 17:25:51 · 459 阅读 · 0 评论 -
C++ Primer 4 第四章 数组和指针
第四章 数组和指针1. 数组 数组定义中的类型名可以是内置数据类型或类类型;除引用之外,数组元素的类型还可以是任意的复合类型。没有所有元素都是引用的数组。 数组的维数必须用值大于等于1的常量表达式定义。此常量表达式只能包含整型字面值常量、枚举常量或者用常量表达式初始化的整型 const 对象。非 const 变量以及要到运行阶段才知道其值的 const 变原创 2012-02-29 17:24:01 · 521 阅读 · 0 评论 -
C++ Primer 4 第三章 标准库类型
1. 命名空间的 using 声明 使用 using 声明可以在不需要加前缀 namespace_name:: 的情况下访问命名空间中的名字。using 声明的形式如下: using namespace::name; 一个 using 声明一次只能作用于一个命名空间成员。using 声明可用来明确指定在程序中用到的命名空间中的名字,如果希望使用原创 2012-02-29 17:23:11 · 338 阅读 · 0 评论 -
C++Primer 4 第二章 变量和基本类型
第二章 变量和基本类型1. 基本内置类型 C++定义了一组表示整数、浮点数、单个字符和布尔值的算术类型,另外还定义了一种称为void的特殊类型。void 类型没有对应的值,仅用在有限的一些情况下,通常用作无返回值函数的返回类型。 算术类型的存储空间依机器而定。C++标准规定了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。整型:表示原创 2012-02-29 17:22:22 · 541 阅读 · 0 评论 -
CPP学习备忘[13] 异常
【1】异常使用三部曲1. 框定异常(try语句块)2. 定义异常处理(catch语句块)3. 抛掷异常(throw语句)前两个步骤是在一个函数中定义的,而抛掷异常则可以跨函数使用。当直接在try语句块中使用时,异常处理则退化为一般的错误处理模式;在try语句块中,会有一些语句调用了其他函数,它们之间则构成一个调用链,在调用链中的某一个节点上,如果出现抛掷语句原创 2011-12-13 11:42:10 · 351 阅读 · 0 评论 -
CPP学习备忘[8] 继承
【1】派生类对象本体包括两个部分,一个为基类部分另一个为派生类部分。 派生类的默认无参构造函数会首先调用父类的无参构造函数,如果父类定义了有参构造函数(因此没有默认的无参构造函数),又没有重载定义无参构造函数,则会导致编译发怒。 并不是非得调用默认无参构造函数,可以在派生类的构造函数中规定调用基类构造函数的形式。如: class GraduateStudent : p原创 2011-12-13 11:39:11 · 332 阅读 · 0 评论 -
CPP学习备忘[1] 基本编程语句
【1】switch括号中的表达式只能是整型、字符型或枚举型表达式。case后面的常量表达式之类型必须与其匹配。【2】流iostream主管数据类型的识别工作和沟通操作系统,全权负责把流中的数据送到对应的设备上。流的格式操作亦可直接以输出流的方式操作。常用的流状态: showpos 在正数(包括0)之前显示+号 left 左对齐 right 右对齐 b原创 2011-12-12 08:37:15 · 354 阅读 · 0 评论 -
CPP学习备忘[2] 数据类型
【1】C++中的数据类型,有语言既定的内部数据类型,也有程序员自定义的外部数据类型,其中内部数据类型有:int、char、bool、float、double; 【2】在C++中有两种字符串,一种是从C沿袭过来的,称为C-串。C-串是以一个全0位字节作为结束符的字符序列。 C-串的类型为char*,说得更精确一点是const char*。由于C-串类型是字符指针,因此比较两个相同的原创 2011-12-12 08:37:51 · 298 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[14]——第15章 面向对象编程
<!--@font-face {font-family:SimSun}@font-face {font-family:SimSun}p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-原创 2011-12-10 12:04:50 · 452 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[12]——第13章 复制控制
第13章复制控制 【89】13.1什么是复制构造函数?何时使用它? 答:复制构造函数是具有如下特点的构造函数:只有单个形参,且形参是对本类类型对象的引用(常用const修饰) 复制构造函数在下列情况下使用: 根据另一个同类型的对象显式或隐式初始化一个对象。 复制一个对象,将它作为实参传给一个函数。原创 2011-12-10 12:03:41 · 386 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[10]——第11章 泛型算法
第11章 泛型算法【81】11.10标准库定义了一个find_if函数,与find一样,find_if函数带有一对迭代器形参,指定其操作的范围,与count_if一样,该函数还带有第三个形参,表明用于检查范围内每个元素的谓词函数。find_if返回一个迭代器,指向第一个使用谓词函数返回非零值的元素,如果这样的元素不存在,则返回第二个迭代器实参。使用find_if函数实现统计长度大于6的单词原创 2011-12-10 12:01:53 · 416 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[13]——第14章 重载操作符与转换
第14章 重载操作符与转换 【95】14.1在什么情况下重载操作符与内置操作符不同?在什么情况下重载操作符与内置操作符相同? 答:重载操作符与内置操作符的不同之处在于:重载操作符必须具有至少一个类类型或枚举类型的操作数;重载操作符不保证操作数的求值顺序,例如,&&和||的重载版本就失去了“短路求值“特性,两个操作数都要进行求值,而且不规定操作数的求值顺序。原创 2011-12-10 12:04:18 · 530 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[8]——第9章 顺序容器
第9章 顺序容器 【57】9.2创建和初始化一个vector对象有四种方式,为每种方式提供一个例子,并解释每个例子生成的vector对象包含什么值。 答:1)分配指定数目的元素,并对这些元素进行值初始化; vectorivec(10); //ivec包含10个0值元素原创 2011-12-10 12:00:14 · 800 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[7]——第7章 函数
第7章 函数 【45】7.1形参和实参有什么区别? 答:形参在函数定义的形参表中进行定义,是一个变量,其作用域为整个函数。而实参出现在函数调用中,是一个表达式。进行函数调用时,用传递给函数的实参对形参进行初始化。 【46】7.7解释下面两个形参声明的不同之处: void f(T);原创 2011-12-10 11:59:36 · 634 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[3]——第3章 标准库类型
<!--@font-face {font-family:SimSun}@font-face {font-family:SimSun}p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-原创 2011-12-10 11:55:34 · 483 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[2]——第2章 变量和基本类型
<!--@font-face {font-family:SimSun}@font-face {font-family:SimSun}p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-原创 2011-12-10 11:54:26 · 416 阅读 · 0 评论 -
CPP学习备忘[4] 性能
【1】既要用函数调用来体现其结构化和可读性,又要使效率尽可能地高,解决办法就是将这种小函数声明为内联(inline);对函数的内联声明必须在调用之前,因为内联函数的代码在程序运行时是直接嵌在调用处执行的,它不影响链接,只在编译时确定运行代码,因此编译时ii,在调用之前看到内联声明就十分必要。 内联函数使用的场合一般为:1. 函数体适当小,这样就使嵌入工作容易进行,不会破坏原调原创 2011-12-12 08:40:14 · 297 阅读 · 0 评论 -
CPP学习备忘[5] 程序结构
【1】头文件更重要的作用是在设计阶段(相对于编程阶段)规定界面,也就是通过头文件可以明白地看出,某个程序文件提供了什么服务,这种头文件称为用户界面。程序员有了用户界面就可以大胆地使用上面提供的资源,然后在程序工程中添加上该头文件的实现(也就是定义函数的cpp文件)就行了。对于系统头文件,连添加cpp文件的工作都可省了,因为C++系统会默认地搜索头文件所对应的库; 由于头文件可能出现在一个原创 2011-12-12 08:41:02 · 302 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[4]——第4章 数组指针
<!--@font-face {font-family:SimSun}@font-face {font-family:SimSun}p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-原创 2011-12-10 11:57:03 · 630 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[17]——第18章 特殊工具与技术
第18章 特殊工具与技术 【140】18.11解释下面的new和delete表达式中发生什么。 struct Exercise{ Exercise(); ~Exercise(); };原创 2011-12-10 12:06:43 · 388 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[16]——第17章 用于大型程序的工具
第17章 用于大型程序的工具 【127】17.1下面的throw语句中,异常对象的类型是什么? a)range_errorr(“error”); throw r; b)exception*p=&r; throw *p; 答:a)异常对象r的类型是range_error b)被抛出的异常原创 2011-12-10 12:06:10 · 557 阅读 · 0 评论 -
《C++ Primer 4 Answer Book》 整理[15]——第16章 模板与泛型编程
第16章 模板与泛型编程 【111】16.2编写一个函数模板,接受一个ostream引用和一个值,将该值写入流。用至少4种不同类型调用函数,通过写至cout、文件和stringstream来测试你的程序。 答:#include #include #include原创 2011-12-10 12:05:39 · 722 阅读 · 0 评论