
C++
文章平均质量分 72
seven-soft
十几年工作经验,软件破解、软件反编译、网络抓包;精通c、c++、java语言,熟悉eclipse、Microsoft Visual Studio、XCODE 开发环境,精通wince和Android开发。精通嵌入式CPU软件开发。
展开
-
5.4 指针与地址
指针的概念◆ 1、“存储器”的概念文件柜-->文件柜上的抽屉-->抽屉上的编号对应于:存储器----->存储单元----->存储单元的地址◆ 2、存储器的使用1)定义变量时,系统为变量分配相应的存储单元,通过变量名可以直接使用该存储单元。例如: int x=5,y; y=15; // y可以理解成该存储单元的当前名字2) 通过存储单元的地址来原创 2016-06-13 08:55:18 · 326 阅读 · 0 评论 -
7.3 链表-单链表的基本算法
线性表是最简单,最常用的一种数据结构。线性表的逻辑结构是n个数据元素的有限序列(a1,a2,…,an)。而线性表的物理结构,我们已经学习过顺序表,也就是数组 ;另一种线性表的物理结构——链表 。什么是单链表单链表(Singly Linked list)也称线性链表。每个元素占用一个节点(Node)。一个节点至少包含两个域,一个域存放数据信息info,其数据类型由应用问题决定,另原创 2016-06-14 06:31:33 · 262 阅读 · 0 评论 -
7.4 链表-单链表类型模板
单链表的概念和基本算法请点击这里:C++单链表的基本算法分析:考虑单链表的特点及其基本操作,可以将每个节点归属成一个节点类,该类的一个对象就是一个节点,凡与节点数据(或指向节点的指针)操作有关函数作为节点类成员函数,包括生成新节点、在当前节点后插入节点、在当前节点后删除一个节点、……;在节点类的基础上,再定义链表类,该类的一个对象就是一个单链表,操作包括生成(建立)有序链表、搜索遍原创 2016-06-14 06:33:43 · 493 阅读 · 0 评论 -
7.5 链表-双向链表
考虑顺序表中总是可以很方便地找到表元素的前驱和后继,但单链表只能找后继。如要找前驱,必须从表头开始搜索。为了克服这一缺点,可采用双向链表(Double Linked List)。双向链表的结点有三个域:左链接指针(llink),数据域(info),右链接指针域(rlink)。双向链表经常采用带头结点的循环链表方式,如下图所示。(查看动画演示)图7.10 带表头结点的原创 2016-06-14 06:34:18 · 354 阅读 · 0 评论 -
7.6 栈与队列-栈的基本操作和应用
栈和队列都是特殊的线性表,是限制存取位置的线性结构;可以由顺序表实现,也可以由链表实现。什么是栈栈定义为:只允许在表的一端进行插入和删除的线性表。允许进行插入和删除的一端叫做栈顶(top),而另一端叫栈底(bottom)。栈中没有任何元素时,称为空栈。设给定栈s=(a0,a1,……,an-1),称a0为栈底,an-1为栈顶。栈又称作后进先出(LIFO:Last In原创 2016-06-14 06:34:52 · 683 阅读 · 0 评论 -
7.7 栈与队列-队列及其操作
队列(Queue)也是一种限定存取位置的线性表。它只允许在表的一端插入,而在另一端删除。允许插入的一端称为队尾(rear),允许删除的一端叫做队头(front)。每次在队尾加入新元素,加入称为进队,删除称为出队。(查看动画演示)队列的这种特性正好与栈相反,叫做先进先出(FIFO,First In First Out)。顺序队列空队时指针(下标)front和rear在原创 2016-06-14 06:35:30 · 476 阅读 · 0 评论 -
7.8 二叉树
树形结构是一类重要的非线性数据,树和二叉树是常用的树形结构。二叉树的概念◆ 1、树的概念树(Tree)是由n(n≥0)个结点组成的有限集合。如n=0,称为空树。非空树有一个特定的结点,它只有直接后继,没有直接前驱,称之为根(root)。除根以外的其它结点划分为m(m≥0)个互不相交的有限集合T0,T1,……,Tm-1,每个集合又是一棵树,称为根的子树(subtree)。每棵原创 2016-06-14 06:36:05 · 589 阅读 · 0 评论 -
8.1 继承与派生的概念
层次概念是计算机的重要概念。通过继承(inheritance)的机制可对类(class)分层,提供类型/子类型的关系。C++通过类派生(class derivation)机制来支持继承。被继承的类型称为基类(base class)或超类(superclass),新产生的类为派生类(derived class)或子类(subclass)。基类和派生类的集合称作类继承层次结构(hi原创 2016-06-14 06:36:53 · 707 阅读 · 0 评论 -
8.2 派生类的构造函数与析构函数
定义形式派生类的构造函数的定义形式为: 派生类名::派生类名(参数总表):基类名1(参数名表1) 《,基类名2(参数名表2),……,基类名n(参数名表n)》,《成员对象名1(成员对象参数名表1),……,成员对象名m(成员对象参数名表m)》 { ……//派生类新增成员的初始化 }; //所列出的成员对象名全部为新增成员对象的名字注原创 2016-06-14 06:37:34 · 461 阅读 · 0 评论 -
8.3 多重继承与派生类成员标识
C++多重继承的概念由多个基类共同派生出派生类的继承结构称为多重继承或多继承(multiple-inheritance)。多重继承是从实际的需要产生的。例如:从大学在册人员产生学生和教职工。再从学生派生研究生。如果考虑到研究生可以当助教,那么他们又有了教职工的特性。教职工可分为教师和行政人员,但行政人员也可以去授课,兼有教师的特点等。这就是多继承,其继承关系如下图所示。原创 2016-06-14 06:38:25 · 481 阅读 · 0 评论 -
8.4 虚基类
在上一节中,有两个身份证号显然是不合理的。为此,可以把class Person这个共同基类设置为虚基类,这样,从不同路径继承来的同名数据成员在内存中就只有一个拷贝,同名函数也只有一种映射。虚基类定义方式虚基类(virtual base class)定义方式如下: class 派生类名:virtual 访问限定符 基类类名{...};或: class 派生原创 2016-06-14 06:39:03 · 249 阅读 · 0 评论 -
7.2 浅复制与深复制
对象的构造,也可以由复制构造函数完成,即用一个对象的内容去初始化另一个对象的内容。此时,若对象使用了堆空间(注意和“堆对象”区分),就有深、浅复制的问题,不清楚则很容易出错。什么是浅复制缺省复制构造函数:用一个对象的内容初始化另一个同类对象,也称为缺省的按成员拷贝,不是对整个类对象的按位拷贝。这种复制称为浅复制。class CGoods{ char *Name;原创 2016-06-14 06:30:59 · 284 阅读 · 0 评论 -
7.1 自由存储区内存分配
C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store)。自由存储区内存的分配与释放◆ 1、堆的概念通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配。有些操作对象只原创 2016-06-14 06:30:12 · 482 阅读 · 0 评论 -
5.5 this 指针
问题:当在对象的外部访问该对象的公有成员时,必须指明是哪一个对象。但是当我们用对象的成员函数来访问本对象的成员时,在成员函数中只要给出成员名就可以实现对该对象成员的访问。再进一步可用同一个类创建很多个对象,但它们共用同一份成员函数的拷贝。既然是同一份拷贝,那么成员函数又怎么知道是取哪一个对象的成员数据呢?其实,当调用一个成员函数时,系统自动产生一个隐藏的指针,这个指针称为this指针,始终原创 2016-06-13 08:56:07 · 320 阅读 · 0 评论 -
5.6 数组与指针的关系
数组名、指针和指针运算◆ 指针和数组的关系数组名被看作该数组的第一个元素在内存中的首地址(仅在sizeof操作中例外,该操作给出数组所占内存大小)。数组在内存的首地址,逻辑上可看作是存放在该数组的数组名中的。数组名在表达式中被自动转换为一个指向数组第一个元素的指针常量。数组名中所放的地址是不可改变的,所以称指针常量(即隐含说明“元素类型* const数组名”)。数组名指向的原创 2016-06-13 08:56:47 · 432 阅读 · 0 评论 -
5.7 字符串和string类
一.C风格字符串◆ 1、字符串是用字符型数组存储的,字符串要求其尾部以’\0’作为结束标志。如: char string[ ]=”C++ programming language”;用sizeof来测string长度为25个字节,而实际串本身长度(含空格)为24个字节,多出来的一个就是串结束符’\0’(含0)。◆ 2、指针与字符串 char *pstr=”C++原创 2016-06-13 08:57:31 · 398 阅读 · 0 评论 -
5.8 多级指针与多维数组
多级指针的概念多级指针可对应于多维数组,这种指针变量中存的是另一个指针变量的地址,其说明如下: int val=10; int *ptr=&val; int **pptr=&ptr; int ***ppptr=&pptr; //是多少级指针就有多少*号这里val值为10,*ptr值也为10,**pptr的值和***ppptr的值均为10。注意这里的*原创 2016-06-13 08:58:09 · 524 阅读 · 0 评论 -
6.1 C++模板-函数模板
参数化程序设计——通用的代码就必须不受数据类型的限制,可以把数据类型改为一个设计参数。这种类型的程序设计称为参数化(parameterize) 程序设计。这种设计由模板(template)完成。包括函数模板(function template)和类模板(class template)。本节主要讲解函数模板及其应用,类模板请点击这里:C++类模板与线性表什么是函数模板原创 2016-06-13 08:58:52 · 367 阅读 · 0 评论 -
6.2 C++模板-类模板与线性表
参数化程序设计——通用的代码就必须不受数据类型的限制,可以把数据类型改为一个设计参数。这种类型的程序设计称为参数化(parameterize) 程序设计。这种设计由模板(template)完成。包括函数模板(function template)和类模板(class template)。本节主要讲解类模板及线性表,函数模板请点击这里:C++函数模板及应用类模板定义类模原创 2016-06-13 08:59:44 · 660 阅读 · 0 评论 -
6.3 常用的查找方法
查找(search)当然也是最常见的运算,就是在数据集合中寻找满足条件的数据对象,找到后进一步给出对象的具体信息,在数据库技术中称为检索(retrieval)。查找的依据查找的依据是关键字(key word)是否相同。可以唯一地把资料区分出来的数据被称为主关键字。例如学生的资料,该资料是一个结构体变量;struct student{ int id ; //学号原创 2016-06-13 09:00:20 · 615 阅读 · 0 评论 -
6.4 常用的排序方法
数据排序(sorting)是最重要的计算应用之一。例如查字典,字典中的词条是按序存放的,我们才能按字母顺序找到要查的字。又如图书馆的藏书也是按书的编号有序排列的。在计算机上数据库里的资料也是有序排列的。排序的概念:排序(sorting)是数据处理中经常使用的一种重要运算,其功能是将数据元素的无序序列调整为有序序列。数据元素中一般有多个数据项,排序可选择其中一个可排序的数据项(可进行原创 2016-06-13 09:01:10 · 454 阅读 · 0 评论 -
6.5 索引查找与指针数组
◆ 1、指针数组: 数据元素为指针的数组称指针数组。◆ 2、索引查找:索引,就象一本书的目录,找到标题,再看一下页号,立即可以翻到。如果每一个查找对象的数据元素很大,比如一个学生的简历,要排序也挺麻烦,去查找也不方便。如果每位同学的简历对应一个指针,构成一个数组,而把学生学号作为数组元素的下标,这样就形成了一个指针数组,找到学号对应元素,其所保存的指针值,即简历的地址,查找起来要方便多原创 2016-06-13 09:01:52 · 600 阅读 · 0 评论 -
6.6 函数指针与指针识别
函数指针及其应用◆ 1、函数名与函数指针函数名对应于该函数执行代码的入口地址。通过取地址运算符“&”也可以取得函数的入口地址。指向函数的指针可以作为函数的参数传递。定义方式如下: 返回类型 (*指针变量名)(参数表)由于一个函数不能以函数作为参数,所以当一个函数需要将函数作为参数时必须借用指向函数的指针(也可以用包含该函数的类对象)。◆ 2、函数指针的使用方法原创 2016-06-13 09:02:39 · 328 阅读 · 0 评论 -
8.5 派生类应用讨论
派生类与基类◆ 1、赋值兼容性在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则。它包括以下情况:派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员原创 2016-06-14 06:39:47 · 385 阅读 · 0 评论 -
8.6 多态性与虚函数
多态性是面向对象程序设计的关键技术之一。利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能。若程序设计语言不支持多态性,不能称为面向对象的语言。在C++中有两种多态性:编译时的多态性:通过函数的重载和运算符的重载来实现的。运行时的多态性:在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据具体情况来动态地确定。它是通过类继承关系和虚函数来原创 2016-06-14 06:40:53 · 382 阅读 · 0 评论 -
10.4 异常与继承
在C++程序中,表示异常的类通常被组成为一个组(即如在前面各节讨论的那样)或者一个层次结构。◆ 1、例如:定义一个称为Excp的基类,由它来打印错误信息:class Excp{public: void print(string msg) {cerr};再从该基类派生出两个异常类: class stackExcp原创 2016-06-15 09:01:20 · 428 阅读 · 0 评论 -
10.5 异常规范
◆ 1、异常规范(exception specification)是指:提供了一种方案,可以随着函数声明列出该函数可能抛出的异常,并保证该函数不会抛出任何其他类型的异常。例如,在stack类定义中可有: void Push(const T&data) throw(pushOnFull) ; T Pop() throw(popOnEmpty); //红色部分是异常规范原创 2016-06-15 09:02:01 · 598 阅读 · 0 评论 -
10.6 C++标准库的异常类层次结构
C++标准库中的异常层次的根类被称为exception,定义在库的头文件中。◆ 1、exception类的接口如下:namespace std //注意在名字空间域std中{ class exception { public: exception() throw() ; //默认构造函数原创 2016-06-15 09:02:38 · 431 阅读 · 0 评论 -
11.1 标准模板库简介
库(library)是一系列程序组件的集合,它们可以在不同的程序中重复使用。库函数设计的第一位的要求就是通用性,模板(template)为通用性带来了不可估量的前景。标准模板库(Standard Template Library)简称STL,是ANSI/ISO C++最有特色、最实用的部分之一。STL包含:容器类(container)、 迭代子(iterator)、 算法(algo原创 2016-06-15 09:03:24 · 457 阅读 · 0 评论 -
11.2 迭代子类
◆ 迭代子属性:C++标准库中对普通类型迭代子按照基本访问功能分类,有五种四级预定义迭代子(输入/输出为同一级),其中功能最强最灵活的是随机访问迭代子。下表为迭代子属性:◆ 迭代子可执行的操作:如下表所示:【例11.1】寻找数组元素。#include#includeusing namespace std;int main(){ in原创 2016-06-15 09:04:22 · 478 阅读 · 0 评论 -
11.3 顺序容器类
顺序容器:包括矢量(vector)、列表(list)和双端队列(deque)。vector类和deque类是以数组为基础的,list类是以双向链表为基础的。矢量类◆ 1、矢量类的概念:矢量(vector)类提供具有连续内存地址的数据结构,可通过下标运算符[ ]直接有效地访问矢量的任何元素。与数组不同,vector的内存用尽时,vector自动分配更大的连续内存区,将原先的元原创 2016-06-15 09:04:57 · 455 阅读 · 0 评论 -
11.4 泛型算法与函数对象
这里,算法表现为一系列的函数模板。它们完整定义在STL头文件中。使用者可以用很多方式来特化每一个模板函数,大大提高了它作为通用型程序组件的适用性。这些函数模板使用迭代子作为它的参数和返回值,以此在容器(序列)上进行各种操作。本节进一步讨论算法的通用性。函数对象◆ 1、函数对象的基本概念:每个泛型算法(Generic Algorithm)的实现都独立于容器类型,它消除原创 2016-06-15 09:05:53 · 519 阅读 · 0 评论 -
11.5 关联容器类
关联容器(associative container):它们能通过关键字(search key)直接访问(存储和读取元素)。包括四类:集合(set),多重集合(multiset),映射(map)和多重映射(multimap)。集合和多重集合类◆ 1、集合和多重集合类:提供了控制数值集合的操作,其中数值是关键字,即不必另有一组值与每个关键字相关联。集合与多重集合类的主要差原创 2016-06-15 09:06:57 · 453 阅读 · 0 评论 -
11.6 容器适配器
容器适配器(container adapter): 包括栈,队列和优先级队。适配器并不独立,它依附在一个顺序容器上。例如,要声明一个用矢量实现的字符型堆栈,声明如下: stack> sk;然后适配器可以象顺序容器一样使用,但没有自己的构造和析构函数,而是使用其实现类(如vector)的构造函数和析构函数。队列(queue)默认用deque为基础,栈(stack)可用v原创 2016-06-15 09:07:36 · 398 阅读 · 0 评论 -
C++任务队列与多线程
很多场合之所以使用C++,一方面是由于C++编译后的native code的高效性能,另一方面是由于C++优秀的并发能力。并行方式有多进程 和多线程之分,本章暂且只讨论多线程,多进程方面的知识会在其他章节具体讨论。多线程是开发C++服务器程序非常重要的基础,如何根据需求具体的设计、分配线程以及线程间的通信,也是服务器程序非常重要的部分,除了能够带来程序的性能提高外,若设计失误,则可能导致程序复杂而原创 2016-07-22 05:27:55 · 3181 阅读 · 0 评论 -
10.3 异常的重新抛出和catch_all
◆ 1、当catch语句捕获一个异常后,可能不能完全处理异常,完成某些操作后,该异常必须由函数链中更上级的函数来处理,这时catch子句可以重新抛出(rethrow)该异常,把异常传递给函数调用链中更上级的另一个catch子句,由它进行进一步处理。重新抛出表达式仍为: throw;但仅有一个关键字,因为异常类型在catch语句中已经有了,不必再指明。被重新抛出的异常就是原来的异原创 2016-06-15 09:00:44 · 1513 阅读 · 0 评论 -
10.2 栈展开与异常捕获
catch子句当try块中的语句抛出异常时,系统通过查看跟在其后的catch子句列表,来查找可处理该异常的catch子句。catch子句由三部分组成:关键字catch、圆括号中的异常声明以及复合语句中的一组语句。catch子句不是函数,所以圆括号中不是形参,而是一个异常类型声明,可以是类型也可以是对象。catch子句只有一个子句,没有定义和调用之分。使用时由系统按规则自原创 2016-06-15 08:59:51 · 401 阅读 · 0 评论 -
9.1 C++的基本流类体系
流类体系整个流类体系是一个派生类体系,如下图所示。图 输入/输出流类派生体系按ANSI C++标准,类ios是抽象类,它的析构函数是虚函数,它的构造函数为保护的,作为所有基本流类的基类。VC++中有一个构造函数ios (streambuf*)为公有,与ANSI C++不同。在流类库中,最重要的两部分功能为标准输入/输出(standard input/output原创 2016-06-14 06:41:40 · 547 阅读 · 0 评论 -
9.2 输入输出的格式控制
C++在类ios中提供格式化输入输出。格式控制符使用格式控制符,可以进行格式化输入输出。这些格式对所有文本方式的输入输出流均适用。格式控制符定义为公有的无名的枚举类型:enum{ skipws=0x0001, //跳过输入中的空白字符 left=0x0002, //输出左对齐 right=0x0004, //输出右对齐原创 2016-06-14 06:42:20 · 369 阅读 · 0 评论 -
9.3 标准设备的输入/输出
本节对cin,cout,cerr,clog,>>和(提取和插入运算符)的使用细节作进一步讨论。提高标准输入/输出的健壮性◆ 1、标准设备输入使用要点:cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能原创 2016-06-14 06:43:09 · 371 阅读 · 0 评论