C++程序目标大纲.docx_第1页
C++程序目标大纲.docx_第2页
C++程序目标大纲.docx_第3页
C++程序目标大纲.docx_第4页
C++程序目标大纲.docx_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+程序目标大纲目标:明确每项程序工具面向的目标,设计的时候直接根据需要抽取。抽象与规划多态性继承性OOP面向对象提高程序效率新数据类型输入输出流安全性STL调试思想附一 抽象与规划:*设计时必须弄清楚objects and interfaces【Class-Responsibility-Collaboration (CRC) card】*设计文档【requirements analysis: when the job done/the customer satisfied】【system specification: a top-level exploration into the problem】【ideally, lists and basic diagrams】二 多态性:缺省*函数的缺省参数【特殊与一般的关系,突出上镜率高的参数值】*using namespace【区分不同开发团队,加前缀,避免同名冲突】重载*函数重载【词一样而义不同,函数名相同,参数列表不同,算法不同】*函数模板【重载加强,只用写一次代码,编译器自动生成函数】*模板与模板重载;模板与函数重载*类模板【类似类的模板】*【将预定义的运算拓展到对象整体】 重载运算符函数including:赋值、单目+、双目+、关系、流、类型转换、 、自定义【an operator is simply a function call with a different syntax】*覆盖,父子函数头完全相同,子对象调子函,父对象调父函 【继承中的部分多态,静态绑定,子类父函调用父函】*虚函数virtual 【完全多态,动态绑定,虚子类父函调用所在类的子函】*纯虚函数,无函数体的虚函数,【高层抽象,多态母体,各子类根据自己需要进行覆盖】*抽象类,含纯虚函数的类【多态母体,抽象类Student派生类DAStudent】三 继承性:*代码复用:自定义C库、dll动态链接库【C&P】*访问控制【keep clients hands off/enable library designers to change classes internally】*继承【子类继承父类成员,可直接访问部分父类成员,使用权而已!】【is-a与is-like-a关系的不同】*新成员修饰符protected【子能访问父protected 成员,外类不能】*继承修饰符【限定父类成员在子类中表现,过滤成员修饰符】including : privateprotectedpublic*多重继承【链状继承】*多继承【两个爸爸,慎用】*类模板继承【类与类模、类模与类模亦能相互继承】*初始化列表,构造函数中在函数体前执行【子类构造时调用父类的构造函数】【初始化const量】【初始化类中对象成员提高效率】四 OOP面向对象:类与对象* OOP【数据隐藏、封装、透明;创建新类型】类的初始化和销毁*类的多文件组织【数据封装、隐藏】*类的构造函数【在创建对象时自动初始化】*类的无参构造函数【普通对象用默认值初始化】【快速初始化对象数组】【用户一旦定义任何构函,系统无参默认失效,需要用户自己定义】*类的有参构造函数【由用户输入初始值】*this指针构函。this指针指向该对象【直接由this指针访问对象数据,更方便】*初始化列表。构函参数表和函数体之间,调用类似内联?【避免将常量用于左值,初始化类的常量数据成员】【效率较高,初始化类的类成员?】*析构函数【必无参/唯一/对象被delete、对象生存期结束】【在类中涉及newfile时必须定义析构函数?】*【浅拷贝,快速赋值、初始化对象B,对象A直接按位复制值给B】 对象赋值=*【深拷贝,快速初始化,解决浅拷贝导致野指针等问题】 拷贝构造函数类的保护*【拒绝非法修改】声明私有数据、函数成员,提供公共函数为接口*句柄类。h:类私有结构体声明及其指针cpp:类私有机构体定义【HeaderFile中隐藏私有成员内容,拒绝取址强突】类中的数据共享*静态数据成员,同类共享,不依赖于对象【描述一类对象的公共性质】【不依赖于对象,故必须自力更生定义并初始化,一般在x.cpp中】*静态函数成员。不依赖对象【主要用于维护静态数据成员】* friend友元函数。允许外部函数、外类函数访问自己的私有成员【适度破坏封装】【描述既非单体亦非全体的性质,如求两点距离】*friend class 友元类。外类成为友,其所有函数可以自由访问【如矩阵运算】*取址强行访问私有成员【内存无权限+对象内存结构+取址+指针类型强制转换】*【深赋值,深拷贝只能初始化,无法解决含指针类的赋值】 重载赋值运算符*【类的嵌套】对象组合*条件编译【宏、值作为编译条件,选择性编译删一个宏加密变解密】五 提高程序效率:*减小exe体积【link时一次性整个obj连接进来-putting a single function in each source code file when you build your own libraries】* register变量修饰符,存在寄存器中的auto变量 【修饰频繁变量】*宏代码替换【无返回值函数,简单替换而已】*inline内联函数【频繁小函数,变调用为替换,用代码换性能】【较宏:无连码错误、可操作类私有对象】六 新数据类型*vector类 【容器,可装任意个固定类型的数据对象,貌似动态数组】STRING*初始化【引用string heyMom(Where are my socks?);】【等号string standardReply = Beamed into deep 】【另一个字符串string useThisOneAgain(standardReply);】【从第五个字符复制100个或者碰到换行s1=s3.substr(5, 100)】【从第6个复制15个字符string s6(s3, 6, 15);】【任意截取另一字符串子集string s(source.begin(), source.end();】*存储管理【长度bigNews.size()】【容量,可以继续装的元素数量bigNews.capacity()】【增加容量bigNews.reserve(500)】*在字符串中查找【迭代器source.begin(), source.end()】【从0位置找到指定字符串的地址int start = s.find(tag, 0);若为找到返回string:npos】 *修改字符串【在1位置后插入字符串bigNews.insert(1, thought I );】【在末尾增加字符串bigNews.append(Ive been working too hard.);】【将start位置后指定size的字符串替换为指定字符串s.replace(start, tag.size(), hello there);】七 I/O Stream流Stream*a queue of un-formatted bytes that can insert into & extract from标准输出*碰到换行符停止【以buf/array等无换行尾内容为输入源时一定要在末尾加上*manipulators流操作符【endl/ends/flush/oct/dec/hex/ws】【cout ws;吃掉空格】*whitespace-delimilated input 【接收到空格即停止】Line-oriented input整行输入*get(&buf, size, terminator) 【从cin读入到buf,直到遇到terminator或者到指定size,并且在buf末尾添加/0】【默认terminator为/n,碰到后将/n留在流中,需要用ignore()/get()将余下的/n取走才能有效的进行下一次输入】【while(in.get(buf, sz)in.get();】*getline(&buf, size, terminator)【从cin读入到buf,直到遇到terminator或者到指定size,并且在buf末尾添加/0】【碰到后将/n踢掉,直接进行下次输入】【while(in.getline(buf, sz)】*get( )【将流中下一个字符踢出,并且返回一个int】*ignore(extract_num_1,last_char_extracted_EOF)*将输入流中的内容写入STRING流【将cin流中的内容写入STRING类对象S1,直到碰到设定的终止符,或者EOF:getline(cin,s1, );】Streambuf直接访问流缓冲区*用rdbuf()取得streambuf指针,即get读指针的位置【文件间内容复制ofileifile.rdbuf()endl;】【整块in内容写到cout:while(in.get(*cout.rdbuf() in.ignore();】在流中定位*streampos指针【指向下一个where the“next” character will come from /go】*如何定位【tellp()/tellg()返回streampos】【absolute:seekp(sp)/seekg(sp)跳至某绝对位置】【relative:seekp(step_num, ios:direction)/seekg()跳至某相对位置】Strstream内存流* strstream内存流【manipulate bytes in memory,put/get characters on the memory】*如何allocate strstream所需内存【内存输入流istrstream: 构函istrstream(char* buf);/istrstream(char* buf, int size);将buf中的bytes作为istrstream对象的内容创建出来用于输入;例子 istrstream s(47 1.414 This is a test);】【内存输出流ostrstream:ostrstream(char* buf, int size, ios:out);以out/app方式向buf中写入bytes,最多不超过size;】*ostrstream必须自己在bytes后面添加上/0【os int/float】【分成whole&fraction:strstreamintfloat】函数格式控制*Internal formatting data【连续变量variables: precision, the output field width, char to pad space】【分立值format flags: on/off;1/n】*change on/off flags调整二值分立值,直接开关【开启用cout.setf(ios:showpos);关闭用cout.unsetf(ios:showpos);】* change 1/n flags调整多值分立值,生明field,先关全部,开指定【效果:push one in, the rest pop out】【先关basefield,再单独开hex: setf(ios:hex, ios:basefield).】*change variables【using member funcs】【关于width(int n):设定min值,而非max值,输入最短】【width用width(int n)设定时不是一劳永逸,而是只管下一次】操作符格式控制* manipulator【supplied to duplicate the actions provided by the member function】*无参数操作符,包含于中【dec 等效于setf(ios:dec, ios:basefield】Besides hex/oct/dec:*有参数操作符,包含于中【将格式控制融入输出过程condensed into a single chained insertion】Exeption Handling*除了get()外所有的get/getline返回流对象,直接问流【while(in.get(buf, sz),直接判对象】*对任意流对象可以问【任意对象的good/eof/fail/bad成员函返回一个整数值】【直接问对象while(cin)】八 安全性CONST系列:不能用于左值、生存期内不变、必须初始化*const变量定义时初始化!【较宏:多了类型检查,更安全,C+完全替代宏常量】【const int array 常整数array可当数组容量!】*const类对象。对外接口全部瘫痪,只能通过类中const函数访问!必须由初始化列表初始化!【纯引用、不修改的类对象,只读】*const常数据成员。类的某个数据为const不用于左值,只能由初始化列表初始化!【固定的类数据成员,如ID】*void func( )const,const常成员函数。【访问常对象】*char* const ptr 指南针,指针值为常量,只能定义时初始化!*const char *ptr 常量指针,不能通过指针修改该对象【在指针做输入函参时,const修饰则内部语句无法修改】【!输入函参的const仅对内部有效!】【指针做返回函参,const返参只能赋给const对象】* function(const int& num)常引用,引用内容在函数内部无法修改【指向、内容都不能改变的指针,用于常量和临时量如函反量做函参】引用*引用,int reference&=num,特殊的常量指针【编译器帮你强制初始化】【编译器帮你间接使用】【总之,引用就是原对象替身】【简化语法,避免使用箭头“”,方便】*function(int& num)引用做函参【可修改,常量指针做函参之语法简化】*num为指针,指针的引用【直接修改指针值,避免出现int*做函参】九 STL顺序存储容器sequence container*链表list/队列vector/双向队列deque【都是动态存储容器】【vector:一段连续的内存,随机访问效率高,非尾增减元素代价大】【deque:头尾都有vector尾所具有的性质】【list:指针双向链接,非连续,随机访问难,任意插入容易】【如何选择:主要操作是“查找”还是“随机插入”定list/vector】*从对象类型出发选择vector/list【vector动态策略:每次装满后分配两倍于现在的存储空间,将现有的复制到前一半,后一半空着备用,初始存储空间固定,单个对象越大,容量(一次分配后可增加的)越小,因此,对大对象效率较低】【大对象如何用vector存储:存指针而非对象/用reserve()自己指定一个容量vector svec; svec.reserve( 32 );/改用list】*定义顺序容器【svec.resize( 2 * svec.size(), piglet );双参数;前一个容器的初始容量默认为0;后一个默认填充值,根据该类型的默认值/默认构函确定】【list ilist2( ilist );用容器构造容器】*编辑顺序容器【svec.empty();返回是否长度为0】【svec.push_back( text_word );在尾部插入,list/deque也支持pushfront】【svec.resize( 2 * svec.size() );重新更改容器长度】【svec.reserve( 32 );更改容量,不新分配前提下可新增对象数】十 调试:*定义Debugging bug(current location)【以构函、析构标示所在块作用域的开始结束,从而定位bug位置】*Exeption handling【a different, parallel path of execution that can be taken when things go wrong】*编译过程how complier works【预处理preprocess分析树generate parse tree(global optimizer)树节点gernerate co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论