面向对象的程序设计c++解说演示课件_第1页
面向对象的程序设计c++解说演示课件_第2页
面向对象的程序设计c++解说演示课件_第3页
面向对象的程序设计c++解说演示课件_第4页
面向对象的程序设计c++解说演示课件_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计第二章 从C过渡到C+,杨卫东 左峥嵘华中科技大学 自动化学院,2017秋,案例,Ch1_TestCodesch1test1, debug,MFC消息响应-Dlg_TestCodesch1test1atest1.dsw, struct, #pragma packCh2TestCodesch2test2a, t2a.cppTestCodesch2Test2bTest2b.dswTestCodesch2Test2bTest21.dswVs + Opencv,OPENCV配置,OPENCV配置,OPENCV配置,OPENCV配置,OPENCV配置,获取文件名.batecho offdir *248d.lib* 1ist.txt /o /b exitrem dir *.* 1ist.txt /o /b exit,opencv_calib3d2411d.libopencv_contrib2411d.libopencv_core2411d.libopencv_features2d2411d.libopencv_flann2411d.libopencv_gpu2411d.libopencv_highgui2411d.libopencv_imgproc2411d.libopencv_legacy2411d.libopencv_ml2411d.libopencv_nonfree2411d.libopencv_objdetect2411d.libopencv_photo2411d.libopencv_stitching2411d.libopencv_ts2411d.libopencv_video2411d.libopencv_videostab2411d.lib,OPENCV举例,应用,机器视觉,作业1:VS+OPENCV,第一次作业目的: vs + opencv 编程实践内容要求: 实现一个图像或视频处理的例子,算法不限,带图形显示界面提交文件: rar压缩包,包括工程及exe,demo数据,注意删掉临时文件,文件命名格式为 学号-姓名-cpp2017作业1邮件提交: ,主题为文件名时间: 2017/10/30 前,注意事项,工程文件清理,Struct字节对齐,#pragma pack (4) /*指定按4字节对齐*/ 结构体空间/ ch1-2 struct Personchar name;/9;DWORD addr1;char phone10;WORD a2; / resDWORD data1;/2-24, 4-28#pragma pack () /*取消指定对齐,恢复缺省对齐*/Person p100;_TestCodesch1test1atest1.dswTy20150809v4-new-v7-homeMydata4.cpp,数据定义,第2章 从C过渡到C+,常量const变量命名空间 using namespace内存分配c+的函数静态库Lib和动态库Dll,在定义一个常量时,const 比 #define更加灵活。用 const 定义的常量含有数据类型,该常量可以参与逻辑运算const 还有两个“保护”功能:强制保护函数的参数值不发生变化,对于一个函数而言,如果其&或*类型的参数只作输入用,不作输出用,那么应当在该参数前加上const,以确保函数的代码不会改变该参数的值强制保护类的成员函数不改变任何数据成员的值在ISO/ANSI C+新标准中保留了 C老标准中的常量,而且加以扩展,即任何类型的对象(指针、结构、数组、类等)都可以定义成常量,采用一个关键字 const,常量const,常量const,(1)基本的数据类型定义成常量如: const int Asize=100; 以后 Asize就成为整型常量 (2)数组定义成常量如: const int data =1,2,3,4,5;把该数组的每个元素都定义成了常量,在以后的程序中不能被赋值(3)结构定义成常量 struct cir int x; int y;float r; ;const struct cir c1= 50,10,10.0; 定义了一个cir结构常量c1TestCodesch2test2a, t2a.cpp,常量const,(4)指针定义成常量分为三种情况:1)把指针所指向的对象定义成常量但指针不是常量格式为: const *指针名 = 初值 const *指针名 = 初值如: const char *pc = “abcd”;则:pc2=a;/出错而pc为指针变量可以重定位如:pc=“1234”;TestCodesch2test2a, t2a.cpp,常量const,2)把指针定义成常量但指针指向的对象不是常量格式为: * const 指针名 = 初值 如: char * const pc = “abcd”; /如: const char *pc = “abcd”;则:pc2=a;/不出错而pc为指针常量不可以重定位如:pc=“1234”;/出错3)把指针定义成常量且指针指向的对象也定义为常量格式为: const * const 指针名 = 初值 如: const char * const pc = “abcd”;则:pc2=a;/出错,指向的字符串不能更改而pc为指针常量不可以重定位如:pc=“1234”;/出错TestCodesch2test2a, t2a.cpp,在ISO/ANSI C+新标准中保留了 C老标准中的变量,而且对其功能和应用进行了扩展(1)C+可以在程序中随时定义变量,不必象C那样定义在作用域的开始部分如可以写成:.for (int i=0;i10;i+) ,变量定义,变量作用域,(2)作用域运算符 :若全局变量与局部变量同名,在局部变量的作用域内会把同名的全局变量隐藏起来,在C语言中肯定是无法访问的,但在C+中可以通过作用域运算符“:”来访问它#includeint x;void main( )int x=1;cout “ x=“ x endl;:x=6;cout “ x=“ :x i; cout f; cout n The two numbers were “ i and f n; TestCodesch2test2a, t2a.cpp,命名空间namespace,增加命名空间是开放的,可随时把新的成员名称加入到已有的命名空间之中去可组合现有的命名空间,定义为新的命名空间,namespace A int i;void f(); /现在A有成员i和f()namespace A int j;void g(); /现在A有成员i、f()、j和g(),namespace MYLib using namespace space1;using namespace space2;using space3:List;void fun(String ,使用命名空间,作用域解析运算符(:)Space1:f()using指令(using namespace)using namespace space1;using声明(using)把命名空间的特定成员的名称,添加该声明所在的区域中,使得该成员可以直接被使用。但是该命名空间的其他成员,仍然需要作用域解析运算符来定位更安全,编译器会提示出错usingspace1:f;f(); / space1 :f(),内存分配,内存的三种分配方式:从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题TestCodesch2Test2bTest2b.dsw,内存分配,malloc 与 free 是 C+/C 语言的标准库函数,new/delete 是 C+的运算符,都可申请动态内存和释放内存对于非内部数据类型的对象: new/delete,执行构造和析构函数CMyMemTest *pp2 = new CMyMemTest5;cout pp21.m_Step endl;delete pp2; free “new 创建的动态对象” ?delete “malloc 申请的动态内存” new/delete 必须配对使用,malloc/free 也一样TestCodesch2Test2bTest2b.dsw,内存分配,1) new的使用格式:new (初值表) 或 new 使用如下例: (有几点要注意).用new运算符可以创建一维动态数组 格式: *指针变量名 = new 元素个数如: int *p= new int10;2) delete的使用 delete只能作用于用new返回的指针格式:delete 指针名;delete 指向数组的指针名;/用于由new创建的数组,内存分配,.int *p;int *p i= new int10; if ( (p = new int )=NULL)cout “heap errorn”;exit(1);else.delete pi;delete p;,内存分配,举例:二维指针CMyLibfloat *ppArrayF;BYTE *ppArrayB;/* Allocation a 2_dimension dynamic array */void * CMyLib:fspace_2d(int row,int col,int lenth)int i;void *a;a = (void *)calloc(sizeof(void *),row);for(i=0;irow;i+)ai = (void *)calloc(lenth,col);return(a);,TestCodesch2Test2bTest2c.dsw,内存分配,/* To free a 2_dimension dynamic array */void CMyLib:ffree_2d(void *a,int row)int i; if(a=NULL) return ;for(i=0;irow;i+) free(ai);free(a);a = NULL;,作业:一维/二维指针复用,二维指针/一维指针转换内存复用,指针访问,二维指针与一维指针转换void * CMyLib:fspace_2d1(int row, int col, int lenth)int i;void *b;void *pp;b = (void *)calloc(sizeof(void *),row);pp = (void *)calloc(lenth,row*col);for(i=0;irow;i+)bi = (void*) (BYTE*)pp + i*col*lenth); /?return(b);/ 如何释放?TestCodesch2Test2bTest2b.dsw fspace2D.dsw / 简化版,C+的函数,(1) 设置函数参数的缺省值 c+容许在函数的原型说明中给一个或多个形参指定初值,该初值将会成为缺省值,当调用函数未指定初值时生效.class Test private: int x,y;public: / ch2-p26, default Test(int i,int j=20) x=i;y=j; int getx()return x; int gety()return y; ; TestCodesch2Test2bTest2b.dsw,内联函数,(2) 内联函数(inline function)考虑效率问题:直接嵌入1)定义inline + 函数定义例: #include inline int add(int a,int b)return a+b;void main()int x;x=add(3,5);cout “x=“xendl;#define ADD(a, b) (a+b)有几点要注意,函数重载Overload,(3) 函数重载是指在同一作用域内多个函数体可以使用相同的函数名,这类函数称为重载函数 #include void print(char *str)coutstrendl;void print(int val)coutvalendl; void print(double a)coutaendl;TestCodesch2Test2bTest2b.dsw,匹配规则: 首先用函数参数的个数加以区分,然后用参数类型加以区分.void main()int a=10;double b=10.0;print (“good morning”);print(a);print(b);对于重载函数的调用,在编译时就已经确定,是静态的。,静态库Lib和动态库Dll,源码、Lib、DLL静态库Lib举例T2_MemLibT2_LibDemo动态库DllT2_动态库

温馨提示

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

评论

0/150

提交评论