版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
面向?qū)ο蟪绦蛟O(shè)計
第二章從C過渡到C++
楊衛(wèi)東左崢嶸華中科技大學(xué)自動化學(xué)院2017秋案例Ch1_TestCodes\ch1\test1,debug,MFC消息響應(yīng)-Dlg_TestCodes\ch1\test1a\test1.dsw,struct,#pragmapackCh2TestCodes\ch2\test2a,t2a.cppTestCodes\ch2\Test2b\Test2b.dswTestCodes\ch2\Test2b\Test21.dswVs+OpencvOPENCV配置OPENCV配置OPENCV配置OPENCV配置OPENCV配置獲取文件名.bat@echooffdir*248d.lib*>1ist.txt/o/bexitremdir*.*>1ist.txt/o/bexitopencv_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.libOPENCV舉例應(yīng)用機器視覺作業(yè)1:VS+OPENCV第一次作業(yè)目的:vs+opencv編程實踐
內(nèi)容要求:實現(xiàn)一個圖像或視頻處理的例子,算法不限,帶圖形顯示界面
提交文件:rar壓縮包,包括工程及exe,demo數(shù)據(jù),注意刪掉臨時文件,文件命名格式為學(xué)號-姓名-cpp2017作業(yè)1
郵件提交,主題為文件名
時間:2017/10/30前本卷須知工程文件清理Struct字節(jié)對齊#pragmapack(4)/*指定按4字節(jié)對齊*///結(jié)構(gòu)體空間//ch1-2structPerson{ charname;//[9]; DWORDaddr[1]; charphone[10]; WORDa[2];//res DWORDdata[1]; };//2-24,4-28#pragmapack()/*取消指定對齊,恢復(fù)缺省對齊*/Personp[100];_TestCodes\ch1\test1a\test1.dswTy20150809v4-new-v7-home\Mydata4.cpp,數(shù)據(jù)定義第2章從C過渡到C++常量const變量命名空間usingnamespace內(nèi)存分配c++的函數(shù)靜態(tài)庫Lib和動態(tài)庫Dll在定義一個常量時,const比#define更加靈活。用const定義的常量含有數(shù)據(jù)類型,該常量可以參與邏輯運算const還有兩個“保護〞功能:強制保護函數(shù)的參數(shù)值不發(fā)生變化,對于一個函數(shù)而言,如果其‘&’或‘*’類型的參數(shù)只作輸入用,不作輸出用,那么應(yīng)當(dāng)在該參數(shù)前加上const,以確保函數(shù)的代碼不會改變該參數(shù)的值強制保護類的成員函數(shù)不改變?nèi)魏螖?shù)據(jù)成員的值在ISO/ANSIC++新標(biāo)準(zhǔn)中保存了C老標(biāo)準(zhǔn)中的常量,而且加以擴展,即任何類型的對象(指針、結(jié)構(gòu)、數(shù)組、類等〕都可以定義成常量,采用一個關(guān)鍵字const常量const常量const〔1〕根本的數(shù)據(jù)類型定義成常量如:constintAsize=100;以后Asize就成為整型常量
〔2〕數(shù)組定義成常量如:constintdata[]={1,2,3,4,5};把該數(shù)組的每個元素都定義成了常量,在以后的程序中不能被賦值〔3〕結(jié)構(gòu)定義成常量structcir{ intx; inty; floatr;};conststructcirc1={50,10,10.0};定義了一個cir結(jié)構(gòu)常量c1TestCodes\ch2\test2a,t2a.cpp常量const〔4〕指針定義成常量分為三種情況:1〕把指針?biāo)赶虻膶ο蠖x成常量但指針不是常量格式為:const<類型>*指針名=初值<類型>const*指針名=初值如:constchar*pc=“abcd〞;那么:pc[2]=‘a(chǎn)’;//出錯而pc為指針變量可以重定位如:pc=“1234〞;TestCodes\ch2\test2a,t2a.cpp常量const2〕把指針定義成常量但指針指向的對象不是常量格式為:<類型>*const指針名=初值如:char*constpc=“abcd〞;//如:constchar*pc=“abcd〞;那么:pc[2]=‘a(chǎn)’;//不出錯而pc為指針常量不可以重定位如:pc=“1234〞;//出錯3〕把指針定義成常量且指針指向的對象也定義為常量格式為:const<類型>*const指針名=初值如:constchar*constpc=“abcd〞;那么:pc[2]=‘a(chǎn)’;//出錯,指向的字符串不能更改而pc為指針常量不可以重定位如:pc=“1234〞;//出錯TestCodes\ch2\test2a,t2a.cpp在ISO/ANSIC++新標(biāo)準(zhǔn)中保存了C老標(biāo)準(zhǔn)中的變量,而且對其功能和應(yīng)用進行了擴展〔1〕C++可以在程序中隨時定義變量,不必象C那樣定義在作用域的開始局部如可以寫成: …….. for(inti=0;i<10;i++) { … }變量定義變量作用域〔2〕作用域運算符::假設(shè)全局變量與局部變量同名,在局部變量的作用域內(nèi)會把同名的全局變量隱藏起來,在C語言中肯定是無法訪問的,但在C++中可以通過作用域運算符“::〞來訪問它#include<iostream.h>intx;voidmain(){ intx=1; cout<<“x=“<<x<<endl; ::x=6; cout<<“x=“<<::x<<endl;}ch2\test2a\t2a.cpp引用變量〔3〕引用&C語言:取地址是把變量的地址取出來,讓一個指針指向這個地址C++中的引用:為變量起一個新名字,是引用而非指針
格式:<類型> &引用名=變量名;如: inti=10; int&j=i; i++; j++; ……..12,12why?引用變量指針可以隨時改變指向的變量,而引用只能在初始化的時候賦值,賦值后不能變更為其他變量指針:inti=10;int*p=&i;要想改變i的值就寫*p=5;還以改變p指向的變量如p=p+1;*p++,(*p)++// ++*p;引用:inti=10;int&p=i;要想改變i的值就寫p=5;這里寫p=p+1;就把i加1了命名空間namespace作用在大規(guī)模程序的設(shè)計中,或者使用各種各樣的C++庫時,這些標(biāo)識符的命名容易發(fā)生沖突,標(biāo)準(zhǔn)C++引入了關(guān)鍵字namespace〔命名空間/名字空間/名稱空間/名域〕,可以更好地控制標(biāo)識符的作用域符號常量、變量、宏、函數(shù)、結(jié)構(gòu)、枚舉、類和對象等的名稱〔name〕隔離,防止名稱沖突命名空間〔namespace〕:是一種描述邏輯分組的機制,可以將按某些標(biāo)準(zhǔn)在邏輯上屬于同一個集團的聲明放在同一個命名空間中usingnamespacestd;命名空間namespace如何定義給自己每一個對象都加前綴以區(qū)別,mylib_cout命名空間usingnamespacestd,告訴編譯器這行代碼之后用到的cout、cin等函數(shù)都是std這個命名空間內(nèi)定義的標(biāo)準(zhǔn)C++庫〔不包括標(biāo)準(zhǔn)C庫〕中所包含的所有內(nèi)容〔包括常量、變量、結(jié)構(gòu)、類和函數(shù)等〕都被定義在std命名空間里面#include<iostream>usingnamespacestd;voidmain(){ cout<<"\nTypeanumber:"; inti; cin>>i;cout<<"\nTypeaanothernumber:"; floatf;cin>>f;cout<<"\nThetwonumberswere“<<i<<"and"<<f<<"\n";}TestCodes\ch2\test2a,t2a.cpp命名空間namespace增加命名空間是開放的,可隨時把新的成員名稱參加到已有的命名空間之中去可組合現(xiàn)有的命名空間,定義為新的命名空間namespaceA{
inti;
voidf();}//
現(xiàn)在A有成員i和f()namespaceA{
intj;
voidg();}//
現(xiàn)在A有成員i、f()、j和g()namespaceMYLib{
usingnamespacespace1;
usingnamespacespace2;
usingspace3::List;
voidfun(String&,List&);}使用命名空間作用域解析運算符〔::〕Space1::f()using指令〔usingnamespace〕usingnamespace
space1;using聲明〔using〕把命名空間的特定成員的名稱,添加該聲明所在的區(qū)域中,使得該成員可以直接被使用。但是該命名空間的其他成員,仍然需要作用域解析運算符來定位更平安,編譯器會提示出錯using
space1::f;f();//space1::f()內(nèi)存分配內(nèi)存的三種分配方式:從靜態(tài)存儲區(qū)分配:此時的內(nèi)存在程序編譯的時候已經(jīng)分配好,并且在程序的整個運行期間都存在。全局變量,static變量等在此存儲在棧區(qū)分配:相關(guān)代碼執(zhí)行時創(chuàng)立,執(zhí)行結(jié)束時被自動釋放。局部變量在此存儲。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率高,但容量有限在堆區(qū)分配:動態(tài)分配內(nèi)存。用new/malloc時開辟,delete/free時釋放。生存期由用戶指定,靈活。但有內(nèi)存泄露等問題TestCodes\ch2\Test2b\Test2b.dsw內(nèi)存分配malloc與free是C++/C語言的標(biāo)準(zhǔn)庫函數(shù),new/delete是C++的運算符,都可申請動態(tài)內(nèi)存和釋放內(nèi)存對于非內(nèi)部數(shù)據(jù)類型的對象:new/delete,執(zhí)行構(gòu)造和析構(gòu)函數(shù) CMyMemTest*pp2=newCMyMemTest[5]; cout<<pp2[1].m_Step<<endl; delete[]pp2;free——“new創(chuàng)立的動態(tài)對象〞?delete——“malloc申請的動態(tài)內(nèi)存〞new/delete必須配對使用,malloc/free也一樣TestCodes\ch2\Test2b\Test2b.dsw內(nèi)存分配1)new的使用 格式: new<類型>(初值表)或new<類型>使用如下例:(有幾點要注意).用new運算符可以創(chuàng)立一維動態(tài)數(shù)組格式:<類型>*指針變量名=new<類型>[元素個數(shù)]如:int*p=newint[10];2)delete的使用delete只能作用于用new返回的指針格式:delete指針名; delete[]指向數(shù)組的指針名;//用于由new創(chuàng)立的數(shù)組內(nèi)存分配…….int*p;int*pi=newint[10];……if((p=newint)==NULL){ cout<<“heaperror\n〞; exit(1);}else{…….}delete[]pi;deletep;內(nèi)存分配舉例:二維指針CMyLibfloat**ppArrayF;BYTE**ppArrayB;/*Allocationa2_dimensiondynamicarray*/void**CMyLib::fspace_2d(introw,intcol,intlenth){ inti; void**a; a=(void**)calloc(sizeof(void*),row); for(i=0;i<row;i++) { a[i]=(void*)calloc(lenth,col); } return(a);}TestCodes\ch2\Test2b\Test2c.dsw內(nèi)存分配/*Tofreea2_dimensiondynamicarray*/voidCMyLib::ffree_2d(void**a,introw){ inti;if(a==NULL)return; for(i=0;i<row;i++) free(a[i]); free(a); a=NULL;}作業(yè):一維/二維指針復(fù)用二維指針/一維指針轉(zhuǎn)換——內(nèi)存復(fù)用指針訪問二維指針與一維指針轉(zhuǎn)換void**CMyLib::fspace_2d1(introw,intcol,intlenth){ inti; void**b; void*pp; b=(void**)calloc(sizeof(void*),row); pp=(void*)calloc(lenth,row*col); for(i=0;i<row;i++) { b[i]=(void*)((BYTE*)pp+i*col*lenth);//???? } return(b);}//如何釋放?TestCodes\ch2\Test2b\Test2b.dsw
fspace2D.dsw//簡化版C++的函數(shù)
(1)設(shè)置函數(shù)參數(shù)的缺省值
c++容許在函數(shù)的原型說明中給一個或多個形參指定初值,該初值將會成為缺省值,當(dāng)調(diào)用函數(shù)未指定初值時生效.classTest{private:intx,y;public: //ch2-p26,defaultTest(inti,intj=20){x=i;y=j;}intgetx(){returnx;}intgety(){returny;}};TestCodes\ch2\Test2b\Test2b.dsw內(nèi)聯(lián)函數(shù)
(2)內(nèi)聯(lián)函數(shù)(inlinefunction)[考慮效率問題:直接嵌入] 1)定義
inline+函數(shù)定義例: #include<iostream.h> inlineintadd(inta,intb) { returna+b; } voidmain() { intx; x=add(3,5); cout<<“x=“<<x<<endl; }#defineADD(a,b)(a+b)有幾點要注意函數(shù)重載Overload
(3)函數(shù)重載 是指在同一作用域內(nèi)多個函數(shù)體可以使用相同的函數(shù)名,這類函數(shù)稱為重載函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年建設(shè)工程濱水公園建設(shè)合同
- 工業(yè)廠房裝修賠償合同
- 動物園改造安裝合同
- 煤炭配送準(zhǔn)時率保障合同
- 新能源汽車充電服務(wù)合同
- 長江運輸短倒合同
- 2024年智能工廠自動化改造實施方案合同
- 機動車委托銷售合同
- 建議借款合同
- 跨境旅游服務(wù)合同及健康免責(zé)承諾書
- 電力通信光纜檢修標(biāo)準(zhǔn)化作業(yè)指導(dǎo)書
- 2024年全國統(tǒng)一考試高考新課標(biāo)Ⅱ卷數(shù)學(xué)試題(真題+答案)
- 2024山西省文化旅游投資控股集團有限公司招聘筆試參考題庫附帶答案詳解
- 加油站廉潔培訓(xùn)課件
- 2023屆上海市松江區(qū)高三下學(xué)期二模英語試題(含答案)
- 《民航服務(wù)溝通技巧》教案第16課民航服務(wù)人員平行溝通的技巧
- 深圳市物業(yè)專項維修資金管理系統(tǒng)操作手冊(電子票據(jù))
- 2023年鐵嶺衛(wèi)生職業(yè)學(xué)院高職單招(數(shù)學(xué))試題庫含答案解析
- 起重機械安裝吊裝危險源辨識、風(fēng)險評價表
- 華北理工兒童口腔醫(yī)學(xué)教案06兒童咬合誘導(dǎo)
- 中國建筑項目管理表格
評論
0/150
提交評論