您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 电子商务 > 第2章从C到C++.
上海大学雷电第2章从C到C++上海大学雷电HardwareOS(Windows)Win32API/MFC/.NET库PC机的编程上海大学雷电开发环境1.VisualC++C/C++,STL,ATL,MFC,.NET2.VisualC#.NET类库3.VisualC++6.0项目文件.h,.c,.cpp,.dsp,.dsw,.res,.rc.exe,.dll上海大学雷电一个简单的C++程序2.1名字空间提供了一种组织相关类的方式,是一种逻辑组合,而不是物理组合,防止名字冲突.例:namespaceMyNS{voidfunc(){….}}1)作用域分辨符::MyNS::func();2)usingnamespaceMyNS;func();2.2C++输入输出标准C++库定义的类在std名空间下usingnamespacestd;cinx;coutxendl;std::cinx;练习:计算平均值(参考例2-9)例:121314平均值:13上海大学雷电2.3文件是输入输出流,但设备是磁盘文件使用方法1.包含头文件fstream2.创建文件对象:读文件对象类型:ifstream写文件对象类型:ofstream打开文件:open(文件名)3.读写文件数据4.关闭文件close()Ex2_3,Example2.3(p24):income.cpp作业:p262.3.2课后练习2上海大学雷电小结服务和客户服务是被动的(函数、数据类型(类)、对象)客户是主动的(调用函数、定义变量、实例化对象)服务客户是相对的。消息的传递:通过对象成员函数的调用名空间的概念名空间定义了一组标识的集合(这样做有语意可防止命名冲突)。使用其中的标识的方法:1)名空间名::标识符2)usingnamespace名空间名;对象的应用类对象;系统已创建的对象:cin,cout使用全局标识符可以使用前缀::但前无名空间上海大学雷电2.4若干重要的C++特性2.4.2常量constintsize=10;intA[size];?constintsize=10;intA[size];区别:#definesize10intA[size];constint*p=A;p++;//ok*p=100;//X变量声明向左看上海大学雷电2.4.4enum例2:enumDay{sun,mon,tue,wed,thu,fri,sat};enumDayworkday;workday=mon;结果:workday为1;例1:enum{FALSE,TRUE};intok=TRUE;结果:ok为1;例3:enumColor{red=0xff0000,gre=0x00ff00,blue=0x0000ff};每个枚举符的值是常量(不是变量),且是整数。各枚举符的值依次递增1,除非指定其值,第0个枚举符值没有指定则为0。用途:定义一组整型常量目的:改善标识符常量的可读性一般格式:enum[枚举类型名]{标识符常量1[=整数1],标识符常量2[=整数2],….};Ex2_4上海大学雷电2.4.5变量可在需要时声明intsum=0;for(inti=1;i=10;i++){sum+=i;}上海大学雷电bool数据类型值true,falseboolP=true;boolQ=false;boolR=true;boolS=false;Booleanoperators:P;//trueP&&R;//trueP||Q;//trueP&&S;//false!R;//falseintb;cinb;if(15b5)//没有意义的编程{cout15b5;}上海大学雷电2.4.6结构体还可包含函数.Ex2_2Pointstruct{intnum;charname[20];intage;}stu1,stu2,*pstu;structStudent{intnum;charname[20];intage;}stu1,stu2,*pstu;与定义基本数据类型变量类似1.一般方法2.同时定义3.类型名匿名structStudent{intnum;charname[20];intage;};structStudentstudent;Studentstudents[6];Student*pstu;Studentstu1,stu2;structStudent{intnum;charname[20];intage;intgetAge(){returnage;}};上海大学雷电2.5string类型该类型的变量是对象头文件:stringlenthc_str=++=[]!=====eraseinsertreplacesubstrfindfind_first_ofEx2_5charstr[32];cinstr;if(str==leidian)X{couthello;}改写它上海大学雷电Windows数据类型BOOLtypedefintBOOL;COLORREFtypedefDWORDCOLORREF;DWORDtypedefunsignedlongDWORD;HANDLEtypedefPVOIDHANDLE;HDCtypedefHANDLEHDC;LPARAMtypedefLONG_PTRLPARAM;LPCSTRtypedefconstchar*LPCSTR;LPSTRtypedefchar*LPSTR;LPVOIDtypedefvoid*LPVOID;LRESULTtypedefLONG_PTRLRESULT;WPARAMtypedefUINT_PTRWPARAM;UINTtypedefunsignedintUINT;上海大学雷电2.6函数2.6.1函数原型2.6.2main函数入口函数:mainwindows入口函数:WinMainwindows动态连接库入口函数:DllMain不同产商的编译器其入口函数名可能不同.入口函数由系统调用,非入口函数,只有被入口函数直接或间接调用才能被连接到运行文件.Ex2_6上海大学雷电2.6.3引用用&声明.引用也是指针(不进行实体的拷贝),但是当作值使用.引用变量是一个实体变量的别名,自己不拥有内存。数据访问方式同实体变量;定义时必须同时指定所引用的实体变量,除非是在函数的参数表中定义。数据传递方法:Ex21)传值:如voidswap1(intx,inty);2)传地址:如voidswap2(int*x,int*y);3)传引用:如voidswap3(int&x,int&y);注意:int&fx(intx){inty=x*x;returny;}X练习:p49:7.-11.p51:16.2.6.7函数默认参数声明函数可指定默认参数值,必须按照从右往左的规则指定。调用时不覆盖它,就使用这个默认参数值.练习:p5012.istream&getline(char*str,intsize,chardim=‘\n’);上海大学雷电2.6.8函数重载使用相同名字的函数.voidswap(int*x,int*y);voidswap(int&x,int&y);2.6.9函数签名如何区分?函数名,参数个数,数据类型和顺序(不包括返回类型).函数必须有独一无二的签名.voidswap(int*x,int*y);intswap(int*x,int*y);练习:p50:13.C、C++混编上海大学雷电在头文件中#ifdef__cplusplusextern“C”{#endif//一些代码#ifdef__cplusplus}#endif取消对C++函数名等的重整上海大学雷电函数设计示例(Win32API)原型:intGetSystemDirectory(char*lpBuffer,intuSize);调用:chartchBuffer[1024];GetSystemDirectory(tchBuffer,1024);调用:SYSTEMTIMEst;GetLocalTime(&st);//getscurrenttime原型:voidGetLocalTime(SYSTEMTIME*lpSystemTime);原型:boolSetSysColors(intcElements,constint*lpaElements,constCOLORREF*lpaRgbValues);调用:intaiElements[3]={COLOR_ACTIVEBORDER,COLOR_ACTIVECAPTION,COLOR_WINDOW};DWORDaColors[3];aColors[0]=RGB(0x80,0x00,0x80);//darkpurpleaColors[1]=RGB(0x00,0x80,0x80);//darkcyanaColors[2]=RGB(0xC0,0xC0,0xC0);//lightgraySetSysColors(3,aiElements,aColors);上海大学雷电2.7new、delete操作符intn;cinn;intp[n];//error!double*p=newdouble[100];……delete[]p;用new动态分配的内存,具有全局的生命周期,使用完后要用delete销毁所分配的内存。数组PP指针变量动态内存区练习:p53:1.-6.内存内存intP[6];int*P;P=newint[6];上海大学雷电对象的可见性,生命期全局变量可见性,生命期:全局局部变量(auto对象)可见性:{}内自动对象生命期::{}内static变量生命期:全局堆对象生命期:全局“不可见”(无标识符),只能通过指针或引用变量访问。ExP51.16填空练习:int*getDatas(intn){_______________;for(inti=0;in;i++){__________;s++;intb;cinb;a[i]=s*b;}returna;}intmain(intargc,char*argv[]){constintN=3;______=getDatas(N);for(inti=0;iN;i++){coutp[i]endl;}delete[]_____;return0;}输入246输出2818上海大学雷电内存泄漏动态分配和释放内存的功能是C/C++编程的最强大功能之一,但最大的长处也可能成为最大的弱点。C/C++应用程序即是如此,在这些应用程序中,内存处理问题属于最常见的错误。最难捉摸也最难检测到的错误之一是内存泄漏,即未能正确释放以前分配的内存的错误。只发生一次的小的内存泄漏可能不会被注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种征兆:从性能不良(并且逐渐降低)到内存完全用尽。更糟的是,泄漏的程序可能会用掉太多内存,以致另一个程序失败,而使用户无从查找问题的真正根源。此外,即使无害的内存泄漏也可能是其他问题的征兆。Example2.7.1:elephant.cpp上海大学雷电函数小结模块内部数据与外部数据的传递0。全局变量,常量1。返回1)值2)地址3)引用2。参数变量1)值2)地址3)引用注意:返回的对象生命期一般设计方法:1)返回应用数据。2)返回错误代码,应用数据通过参数表传入传出。上海大学雷电2.8例外处理抛出例外throw捕捉例外try----catchintf(inta,intb){if(b==0)throw“er:分母是0”;returna/b;}voidg(){try{coutf(1,0)endl;}catch(char*e){couteendl;}}规则:try,catch成对使用。一旦执行throw后,程序跳转到离它最近的匹配的catch块执行,若无由系统处理(一般是终止程序)。可以从很深的调用栈中返回.Ex2_7异常处理-适用于逻辑上可能出现的错误断言(assert)-适用于逻辑上不可
本文标题:第2章从C到C++.
链接地址:https://www.777doc.com/doc-2154830 .html