C++程序設(shè)計(jì)及互動(dòng)多媒體開(kāi)發(fā) 課件全套 羅立宏 第1-10章 概述、C++新增語(yǔ)言 -虛擬現(xiàn)實(shí)應(yīng)用_第1頁(yè)
C++程序設(shè)計(jì)及互動(dòng)多媒體開(kāi)發(fā) 課件全套 羅立宏 第1-10章 概述、C++新增語(yǔ)言 -虛擬現(xiàn)實(shí)應(yīng)用_第2頁(yè)
C++程序設(shè)計(jì)及互動(dòng)多媒體開(kāi)發(fā) 課件全套 羅立宏 第1-10章 概述、C++新增語(yǔ)言 -虛擬現(xiàn)實(shí)應(yīng)用_第3頁(yè)
C++程序設(shè)計(jì)及互動(dòng)多媒體開(kāi)發(fā) 課件全套 羅立宏 第1-10章 概述、C++新增語(yǔ)言 -虛擬現(xiàn)實(shí)應(yīng)用_第4頁(yè)
C++程序設(shè)計(jì)及互動(dòng)多媒體開(kāi)發(fā) 課件全套 羅立宏 第1-10章 概述、C++新增語(yǔ)言 -虛擬現(xiàn)實(shí)應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩784頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C++程序設(shè)計(jì)課程說(shuō)明先修課程:

C語(yǔ)言課程內(nèi)容第一部分C++語(yǔ)法基礎(chǔ)

第1章概述

第2章C++新增語(yǔ)言

第3章類和對(duì)象

第4章C++新增類型第二部分C++圖形界面

第5章MFC對(duì)話框應(yīng)用程序

第6章MFC文檔視圖應(yīng)用程序

第7章QT開(kāi)發(fā)基礎(chǔ)第三部分C++多媒體開(kāi)發(fā)

第9章Cocos2d-x游戲開(kāi)發(fā)第一部分C++語(yǔ)法基礎(chǔ)第1章概述第1節(jié)從C到C++第1節(jié)C語(yǔ)言復(fù)習(xí)第1節(jié)從C到C++C和C++的發(fā)展歷史C與C++的區(qū)別面向?qū)ο蟮膬?yōu)點(diǎn)C++應(yīng)用領(lǐng)域關(guān)于編譯器1.1C和C++的發(fā)展歷史C和C++的發(fā)展歷史1973貝爾實(shí)驗(yàn)室DennisRitchie基于改進(jìn)Unix系統(tǒng)的需要,發(fā)明C語(yǔ)言1983貝爾實(shí)驗(yàn)室Bjarne博士等人擴(kuò)展了C語(yǔ)言,創(chuàng)造了C++語(yǔ)言1998C++標(biāo)準(zhǔn)第一版(C++98標(biāo)準(zhǔn))(C++1.0)2003C++標(biāo)準(zhǔn)第二版(C++03)(錯(cuò)誤修正版)2011C++標(biāo)準(zhǔn)第三版(C++11)(C++2.0)2014C++標(biāo)準(zhǔn)第四版(C++14)2017C++標(biāo)準(zhǔn)第五版(C++17)C++20C++23C++26

1.2C與C++的區(qū)別從語(yǔ)法上看C語(yǔ)言是C++的一部分,C語(yǔ)言代碼幾乎不用修改就能夠以C++的方式編譯區(qū)別C語(yǔ)言:面向過(guò)程C++:面向?qū)ο笊罾樱赫障鄼C(jī)1.3面向?qū)ο蟮膬?yōu)點(diǎn)與人類思維習(xí)慣一致系統(tǒng)的穩(wěn)定性好可重用性好較易于開(kāi)發(fā)大型軟件產(chǎn)品可維護(hù)性好1.4C++應(yīng)用領(lǐng)域1.服務(wù)器端開(kāi)發(fā)

e.g.linux開(kāi)發(fā)2.游戲

OpenGL,DirectX,Cocos2d-X,UE3.虛擬現(xiàn)實(shí)4.數(shù)字圖像處理

OpenCV,DirectShow5.科學(xué)計(jì)算6.網(wǎng)絡(luò)軟件

e.g.IE、Chrome7.分布式應(yīng)用8.設(shè)備驅(qū)動(dòng)程序9.嵌入式系統(tǒng)10.桌面軟件1.5關(guān)于編譯器本課程需要用到以下編譯器:VC6.0——學(xué)習(xí)VS2022

安裝時(shí)勾選MFC選項(xiàng)——常用QTCreator

——QT編程AndroidStudio

——發(fā)布安卓第2節(jié)

C語(yǔ)言復(fù)習(xí)結(jié)構(gòu)化程序設(shè)計(jì)字符串?dāng)?shù)組指針函數(shù)結(jié)構(gòu)體2.1結(jié)構(gòu)化程序設(shè)計(jì)順序結(jié)構(gòu)分支結(jié)構(gòu)if(條件一){……}elseif(條件二){……

}

……

else{……}循環(huán)結(jié)構(gòu)例1-1.閱讀以下程序并判斷輸出結(jié)果

#include"stdafx.h"intmain(){

inti,j;

printf("輸出表:\n");

for(i=1;i<10;i++){

for(j=1;j<=i;j++){

printf("%d*%d=%d\t",j,i,i*j);

}

printf("\n");

}

return0;}VC6.0創(chuàng)建程序的方法2.2字符串字符串的構(gòu)造、輸入、輸出、連接、復(fù)制……例1-2.閱讀以下程序并判斷輸出結(jié)果#include"stdafx.h"intmain(){charstr[10]; //定義一個(gè)字符數(shù)組printf("輸入少于9個(gè)字符\n");//輸出文本

printf("str=");scanf("%s",str); //記錄用于輸入的數(shù)據(jù)

printf("直接輸出字符串\n");printf("%s\n",str);printf("通過(guò)數(shù)組元素輸出字符串\n");for(inti=0;i<10;i++) { //遍歷字符數(shù)組printf("%s",str[i]); //?

}return0;}問(wèn)題:為何出錯(cuò)?2.3數(shù)組數(shù)組的構(gòu)造、輸入、輸出、查找……例1-3.閱讀以下程序并判斷輸出結(jié)果#include"stdafx.h"intmain(){inta[2][3],m,h,l,i,j;//從鍵盤(pán)為數(shù)組元素賦值

for(i=0;i<2;i++){for(j=0;j<3;j++){printf("a[%d][%d]=",i,j);scanf("%d",&(a[i][j]));}

}

printf("輸出二維數(shù)組a\n");for(i=0;i<2;i++){for(j=0;j<3;j++){printf("%i\t",a[i][j]);}//使元素分行顯示

printf("\n");

}

m=a[0][0];h=0;l=0;for(i=0;i<2;i++){for(j=0;j<3;j++){if(m<a[i][j]){m=a[i][j];h=i;l=j;}}}printf("數(shù)組中要查找的值是:\n");printf("m:a[%d][%d]=%d\n",h,l,m);return0;}2.4指針指針:變量在內(nèi)存的地址例1-4.閱讀以下程序并判斷輸出結(jié)果#include"stdafx.h"voidmain(){intnum;int*pnum;pnum=#printf("輸入一個(gè)數(shù)\n");scanf("%d",&num);printf("指針pnum的值:\n");printf("%x\n",pnum);printf("地址%d中的值是:\n",pnum);

printf("%x\n",*pnum);}2.5函數(shù)一個(gè)C程序程序有一個(gè)主函數(shù)。主函數(shù)是程序的入口。除了主函數(shù)以外,還可以有多個(gè)函數(shù)例1-5.編寫(xiě)一個(gè)計(jì)算圓柱的表面積和體積的程序,要求輸入底面半徑和高,輸出圓柱的表面積和體積。#include"stdafx.h"#include"math.h"constdoublePI=3.1215926535;doubleArea(doubler,doubleh);//函數(shù)聲明doubleVolume(doubler,doubleh);//函數(shù)聲明intmain(intargc,char*argv[])//主函數(shù){doubleradius,height;printf("請(qǐng)輸入圓柱半徑:");scanf("%lf",&radius);printf("請(qǐng)輸入圓柱高度:");scanf("%lf",&height);printf("圓柱表面積=%f\n",Area(radius,height));printf("圓柱體積=%f\n",Volume(radius,height));return0;}doubleArea(doubler,doubleh)//函數(shù)定義{doubleSd/*底面積*/,Sc/*側(cè)面積*/,S/*表面積*/;Sd=PI*pow(r,2);Sc=2*PI*r*h;S=Sc+2*Sd;returnS;}doubleVolume(doubler,doubleh)//函數(shù)定義{doubleSd/*底面積*/,V/*體積*/;Sd=PI*pow(r,2);V=Sd*h;returnV;}2.6結(jié)構(gòu)體結(jié)構(gòu)體是由一系列具有相同類型或不同類型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合。例1-6.編寫(xiě)程序,輸入兩個(gè)學(xué)生的信息(姓名、學(xué)號(hào)、性別、年齡、以及數(shù)學(xué)、英語(yǔ)、政治三科成績(jī)),并計(jì)算輸入平均分#include"stdio.h"structstudent//結(jié)構(gòu)體的定義{charname[30];charnum[10];charsex;intage;floatMathScore;floatEnglishScore;floatPoliticsScore;};floatAverage(structstudentstu){ return(stu.MathScore+stu.EnglishScore+stu.PoliticsScore)/3;}voidmain(){studentstu1,stu2;//結(jié)構(gòu)體變量定義

printf("請(qǐng)輸入第一位學(xué)生的姓名、學(xué)號(hào)、性別、年齡、以及數(shù)學(xué)、英語(yǔ)、政治三科成績(jī):\n");scanf("%s%s%c%d%f%f%f",

&(),&(stu1.num),&(stu1.sex),&(stu1.age),&(stu1.MathScore),&(stu1.EnglishScore),&(stu1.PoliticsScore));printf("請(qǐng)輸入第二位學(xué)生的姓名、學(xué)號(hào)、性別、年齡、以及數(shù)學(xué)、英語(yǔ)、政治三科成績(jī):\n");scanf("%s%s%c%d%f%f%f",&(),&(stu2.num),&(stu2.sex),&(stu2.age),&(stu2.MathScore),&(stu2.EnglishScore),&(stu2.PoliticsScore));printf("%s的平均分是%f\n",,Average(stu1));printf("%s的平均分是%f\n",,Average(stu2));}C++程序設(shè)計(jì)第2章C++新增語(yǔ)言第1節(jié)C++輸入輸出第2節(jié)循環(huán)語(yǔ)句新特性第3節(jié)動(dòng)態(tài)內(nèi)存分配第4節(jié)函數(shù)新特性第5節(jié)異常第1節(jié)C++輸入輸出命名空間cout語(yǔ)句cin語(yǔ)句使用VisualStudio2022創(chuàng)建一個(gè)HelloWorldC++程序

#include<iostream>intmain(){

std::cout<<"HelloWorld!\n";}對(duì)比VC6.0創(chuàng)建的HelloWorldC語(yǔ)言代碼:#include"stdafx.h"intmain(intargc,char*argv[]){printf("HelloWorld!\n");return0;}發(fā)現(xiàn)有所不同1.1cout輸出語(yǔ)句用于在計(jì)算機(jī)屏幕上顯示信息用“流”(stream)的方式實(shí)現(xiàn)<<:輸出流符號(hào)需包含頭文件stream。即#include<iostream>屬于C++98標(biāo)準(zhǔn)//以后不標(biāo)注默認(rèn)為屬于C++98。語(yǔ)法:

cout<<表達(dá)式1<<表達(dá)式2<<……<<表達(dá)式n;e.g.inta=3;boolb=true;charc='m';chard[6]="China";cout<<a;cout<<b<<''<<c<<endl;//endl表示換行

cout<<d<<"isabigcountry."<<endl;cout控制符需包含頭文件#include

<iomanip>e.g.doublepi=3.1415926535,e=2.71828183;//固定輸出兩位小數(shù)cout<<setiosflags(ios::fixed)<<setprecision(2)<<pi<<“”<<e<<endl;控制符描述dec置基數(shù)為10,后由十進(jìn)制輸出(系統(tǒng)默認(rèn)形式)hex置基數(shù)為16,后由十六進(jìn)制輸出oct置基數(shù)為8,后由八進(jìn)制輸出setfill(c)設(shè)填充字符為csetprecision(n)設(shè)置實(shí)數(shù)的精度為n位setw(n)設(shè)域?qū)挒閚個(gè)字符setiosflags(ios::fixed)固定的浮點(diǎn)顯示setiosflags(ios::scientific)指數(shù)表示setiosflags(ios::left)左對(duì)齊setiosflags(ios::right)右對(duì)齊setiosflags(ios::skipws)忽略前導(dǎo)空白setiosflags(ios::uppercase)16進(jìn)制數(shù)大寫(xiě)輸出setiosflags(ios::lowercase)16進(jìn)制數(shù)小寫(xiě)輸出1.2命名空間(namespace)在C++中,名稱(name)可以是符號(hào)常量、變量、函數(shù)、結(jié)構(gòu)、枚舉、類和對(duì)象等等。工程越大,名稱互相沖突性的可能性越大。另外使用多個(gè)廠商的類庫(kù)時(shí),也可能導(dǎo)致名稱沖突。為了避免,在大規(guī)模程序的設(shè)計(jì)中,以及在程序員使用各種各樣的C++庫(kù)時(shí),這些標(biāo)識(shí)符的命名發(fā)生沖突,標(biāo)準(zhǔn)C++引入關(guān)鍵字namespace(命名空間/名字空間/名稱空間),可以更好地控制標(biāo)識(shí)符的作用域。例:創(chuàng)建一個(gè)命名空間:namespaceA{intx=20;}namespaceB{intx=30;}voidfunction(){cout<<"A::x:"<<A::x<<endl;cout<<"B::x:"<<B::x<<endl;}using聲明語(yǔ)法://釋放整個(gè)命名空間到當(dāng)前作用域

usingnamespace命名空間名稱;//釋放某個(gè)變量到當(dāng)前作用域

using命名空間名稱::變量名或函數(shù)名;e.g.usingnamespacestd;或usingstd::cout;使用命名空間,改寫(xiě)HelloWorld#include<iostream>usingnamespacestd;intmain(){cout<<"HelloWorld!\n";}1.3cin輸入語(yǔ)句從鍵盤(pán)獲取數(shù)據(jù),對(duì)指定的變量進(jìn)行賦值用“流”(stream)的方式實(shí)現(xiàn)>>:輸入流符號(hào)需包含頭文件stream。即#include<iostream>語(yǔ)法:

cin>>表達(dá)式1>>表達(dá)式2>>……>>表達(dá)式n;e.g.inta;cin>>a;floatf;chars[20];cin>>f>>s;cout、cin舉例例2-3改寫(xiě)例1-6,用cin、cout對(duì)結(jié)構(gòu)體的數(shù)據(jù)進(jìn)行輸入輸出#include"iostream.h"http://usingnamespacestd;//VC6.0不需此句structstudent//結(jié)構(gòu)體的定義{charname[30];charnum[10];charsex;intage;floatMathScore;floatEnglishScore;floatPoliticsScore;};floatAverage(structstudentstu){ return(stu.MathScore+stu.EnglishScore+stu.PoliticsScore)/3;}voidmain(){studentstu1,stu2;//結(jié)構(gòu)體變量定義

cout<<"請(qǐng)輸入第一位學(xué)生的姓名、學(xué)號(hào)、性別、年齡、以及數(shù)學(xué)、英語(yǔ)、政治三科成績(jī):"<<endl;

cin>>>>stu1.num>>stu1.sex>>stu1.age>>stu1.MathScore>>stu1.EnglishScore>>stu1.PoliticsScore;

cout<<"請(qǐng)輸入第二位學(xué)生的姓名、學(xué)號(hào)、性別、年齡、以及數(shù)學(xué)、英語(yǔ)、政治三科成績(jī):"<<endl;

cin>>>>stu2.num>>stu2.sex>>stu2.age>>stu2.MathScore>>stu2.EnglishScore>>stu2.PoliticsScore;

cout<<<<"的平均分是"<<Average(stu1)<<endl;cout<<<<"的平均分是"<<Average(stu2)<<endl;}第2節(jié)循環(huán)語(yǔ)句新特性auto關(guān)鍵字(C++11)范圍for語(yǔ)句(C++11)2.1auto關(guān)鍵字屬于C++11標(biāo)準(zhǔn)早在C++98標(biāo)準(zhǔn)中就存在了auto關(guān)鍵字,那時(shí)的auto用于聲明變量為自動(dòng)變量,自動(dòng)變量意為擁有自動(dòng)的生命期,這是多余的,因?yàn)榫退悴皇褂胊uto聲明,變量依舊擁有自動(dòng)的生命期:inta=5;//擁有自動(dòng)生命期autointb=10;//擁有自動(dòng)生命期staticintc=15;//延長(zhǎng)了生命期C++98中的auto多余且極少使用,C++11已經(jīng)刪除了這一用法,取而代之的是全新的auto:變量的自動(dòng)類型推斷。C++11中,auto可以在聲明變量的時(shí)候根據(jù)變量初始值的類型自動(dòng)為此變量選擇匹配的類型。e.g.inta=5;autob=a;//自動(dòng)類型推斷,b為int類型

cout<<typeid(b).name()<<endl;//typeid運(yùn)算符可以輸出變量的類型autoc=3.1416;//自動(dòng)類型推斷,c為float類型

autod='A';//自動(dòng)類型推斷,d為char類型

cout<<"c的類型為"<<typeid(c).name()<<endl;cout<<"d的類型為"<<typeid(d).name()<<endl;auto一般在循環(huán)語(yǔ)句中用得較多,可以使循環(huán)語(yǔ)句更加簡(jiǎn)潔易懂

e.g.for(autoi=1;i<10;i++){……}對(duì)比以下兩種寫(xiě)法:

(1)std::vector<std::string>vs;//vector和iterator是后面章節(jié)會(huì)學(xué)到的類型。向量和迭代器for(std::vector<std::string>::iteratori=vs.begin();i!=vs.end();i++){//...}

(2)std::vector<std::string>vs;for(autoi=vs.begin();i!=vs.end();i++){//..}2.2范圍for語(yǔ)句C++11標(biāo)準(zhǔn)一種更簡(jiǎn)單的for語(yǔ)句,用于遍歷一個(gè)序列。語(yǔ)法:

for(類型變量:數(shù)組){//對(duì)變量(即數(shù)組中每個(gè)元素)進(jìn)行處理}e.g.intf[]{1,1,2,3,5,8,13,21,34,55,89,144};//fabonaci數(shù)列前十二項(xiàng)

for(autox:f)//對(duì)數(shù)組f中的每個(gè)元素,依次進(jìn)行處理{cout<<x<<endl;}例2-4改寫(xiě)例1-1,使用范圍for語(yǔ)句實(shí)現(xiàn)九九乘法表#include<iostream>usingnamespacestd;intmain(){intnums[]={1,2,3,4,5,6,7,8,9};cout<<"輸出表:"<<endl;

for(autoi:nums){for(autoj:nums){cout<<j<<'*'<<i<<'='<<i*j<<'\t';if(j>=i)break;}cout<<endl;}return0;}第3節(jié)動(dòng)態(tài)內(nèi)存分配關(guān)于動(dòng)態(tài)內(nèi)存分配new運(yùn)算符delete運(yùn)算符3.1關(guān)于動(dòng)態(tài)內(nèi)存分配為什么需要?jiǎng)討B(tài)內(nèi)存分配?程序中大部分的內(nèi)存需求都是在程序執(zhí)行之前通過(guò)定義所需的變量來(lái)確定的。但是可能存在程序的內(nèi)存需求只能在運(yùn)行時(shí)確定的情況。例如,當(dāng)需要的內(nèi)存取決于用戶輸入。C語(yǔ)言動(dòng)態(tài)內(nèi)存分配語(yǔ)句回顧malloc函數(shù):動(dòng)態(tài)分配指定字節(jié)的內(nèi)存

定義:void*malloc(unsignedintnum_bytes);e.g.int*p;p=(int*)malloc(sizeof(int));//動(dòng)態(tài)申請(qǐng)能儲(chǔ)存一個(gè)整數(shù)的內(nèi)存。*p代表該無(wú)名字整數(shù)char*q;//聲明一個(gè)字符指針,準(zhǔn)備動(dòng)態(tài)申請(qǐng)一個(gè)用戶指定長(zhǎng)度的字符數(shù)組(字符串)intsize;scanf(“%d”,&size);//用戶對(duì)size賦值,用戶指定數(shù)組長(zhǎng)度q=(char*)malloc(size*sizeof(char));//動(dòng)態(tài)申請(qǐng)長(zhǎng)度為size的字符數(shù)組動(dòng)態(tài)分配的內(nèi)存需要在程序結(jié)束之前全部釋放,否則會(huì)造成內(nèi)存泄露。free函數(shù):釋放之前動(dòng)態(tài)分配的內(nèi)存

定義:voidfree(void*FirstByte)e.g.char*Ptr=NULL;Ptr=(char*)malloc(100*sizeof(char));

free(Ptr);Ptr=NULL;3.2new與delete運(yùn)算符C++提供了new與delete運(yùn)算符,進(jìn)行動(dòng)態(tài)內(nèi)存分配語(yǔ)法:①變量申請(qǐng):類型*pointer=new類型;//...

deletepointer;②數(shù)組申請(qǐng):類型*pointer=newType[N];//N為數(shù)組元素個(gè)數(shù)//...

delete[]pointer;例2-5C++動(dòng)態(tài)分配內(nèi)存演示例子#include<iostream>usingnamespacestd;intmain(){int*p=newint;//動(dòng)態(tài)申請(qǐng)一個(gè)整型變量*p=5;*p=*p+10;cout<<"p="<<p<<endl;cout<<"*p="<<*p<<endl;

deletep;//釋放變量?jī)?nèi)存

p=newint[10];//動(dòng)態(tài)申請(qǐng)一個(gè)10個(gè)元素的整型數(shù)組

for(inti=0;i<10;i++){p[i]=i+1;cout<<"p["<<i<<"]="<<p[i]<<endl;}

delete[]p;//釋放數(shù)組內(nèi)存

return0;}第4節(jié)函數(shù)新特性內(nèi)聯(lián)函數(shù)后置返回類型(C++11)引用參數(shù)函數(shù)重載4.1inline內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)是C++中的一種特殊函數(shù),它可以像普通函數(shù)一樣被調(diào)用,但是在調(diào)用時(shí)并不通過(guò)函數(shù)調(diào)用的機(jī)制而是通過(guò)將函數(shù)體直接插入調(diào)用處來(lái)實(shí)現(xiàn)的,這樣可以大大減少由函數(shù)調(diào)用帶來(lái)的開(kāi)銷,從而提高程序的運(yùn)行效率。一般來(lái)說(shuō)inline用于定義某些短小并將被頻繁調(diào)用的函數(shù)。只需在函數(shù)定義前加inline關(guān)鍵字就可以把函數(shù)定義為內(nèi)聯(lián)函數(shù)。編譯器在編譯階段對(duì)內(nèi)聯(lián)函數(shù)進(jìn)行處理。只是對(duì)編譯器的建議,具體有沒(méi)有真正內(nèi)聯(lián),要看編譯器。優(yōu)缺點(diǎn):

優(yōu)點(diǎn):利用得好,程序會(huì)提高性能,

缺點(diǎn):利用得不好,會(huì)造成代碼臃腫。語(yǔ)法:

inline

返回值類型函數(shù)名(函數(shù)參數(shù)){//此處定義函數(shù)體}e.g.

inlinedoubleVolume(doubler,doubleh)//函數(shù)定義{ doubleSd/*底面積*/,V/*體積*/; Sd=PI*pow(r,2); V=Sd*h; returnV;}4.2函數(shù)后置返回類型C++11標(biāo)準(zhǔn)語(yǔ)法:

一個(gè)普通前置返回類型的函數(shù)

返回類型函數(shù)名(參數(shù)列表)

可改寫(xiě)成:

auto

函數(shù)名(參數(shù)列表)->返回類型e.g.voidfunc(inta,intb);

可改寫(xiě)成:

autofunc(inta,intb)->void;4.3引用參數(shù)引用:是某一個(gè)變量或?qū)ο蟮膭e名。對(duì)引用的操作與對(duì)其所綁定的變量或?qū)ο蟮牟僮魍耆葍r(jià)語(yǔ)法:類型&引用名=目標(biāo)變量名;e.g.doublea=10.3;double&b=a;b=b+10;cout<<“a=“<<a<<“,b=“<<b<<endl;傳值參數(shù)傳址參數(shù)例2-6閱讀程序,判斷每個(gè)swap函數(shù)是否能實(shí)現(xiàn)變量數(shù)值的對(duì)換。#include<iostream.h>voidswap1(inta,intb);voidswap2(int*pa,int*pb);//voidswap3(int&a,int&b)intmain(){intx=3,y=5;cout<<"Beforeswap:x="<<x<<",y="<<y<<endl;C語(yǔ)言的兩種函數(shù)參數(shù)swap1(x,y);//swap2(&x,&y);//swap3(x,y);cout<<"Afterswap:x="<<x<<",y="<<y<<endl;return0;}voidswap1(inta,intb)//傳值參數(shù){intt;t=a;a=b;b=t;}voidswap2(int*pa,int*pb)//傳址參數(shù){intt;t=*pa;*pa=*pb;*pb=t;}C++新增:引用參數(shù)引用參數(shù)voidswap3(int&a,int&b){intt;t=a;a=b;b=t;}綜合例子例2-7改寫(xiě)例1-5求圓柱表面積和體積的例子,要求改為:

(1)函數(shù)Volume改為內(nèi)聯(lián)函數(shù)和后置返回類型;

(2)函數(shù)Area()除了返回表面積外,還要返回底面積和側(cè)面積。//因?yàn)楹笾梅祷仡愋蜑镃++11新特性,因此用VS2022創(chuàng)建工程#include"math.h"#include<iostream>usingnamespacestd;constdoublePI=3.1215926535;doubleArea(doubler,doubleh,double&Sd/*底面積*/,double&Sc/*側(cè)面積*/);//函數(shù)聲明autoVolume(doubler,doubleh)->double;//函數(shù)聲明intmain()//主函數(shù){ doubleradius,height,areaSurface,areaBottom,areaSide; cout<<"請(qǐng)輸入圓柱半徑:"; cin>>radius; cout<<"請(qǐng)輸入圓柱高度:"; cin>>height; areaSurface=Area(radius,height,areaBottom,areaSide); cout<<"圓柱表面積="<<areaSurface<<endl; cout<<"圓柱底面積="<<areaBottom<<endl; cout<<"圓柱側(cè)面積="<<areaSide<<endl; cout<<"圓柱體積="<<Volume(radius,height)<<endl; return0;}doubleArea(doubler,doubleh,double&Sd/*底面積*/,double&Sc/*側(cè)面積*/)//函數(shù)定義{ doubleS/*表面積*/; Sd=PI*pow(r,2); Sc=2*PI*r*h; S=Sc+2*Sd; returnS;}inlineautoVolume(doubler,doubleh)->double

//函數(shù)定義{ doubleSd/*底面積*/,V/*體積*/; Sd=PI*pow(r,2); V=Sd*h; returnV;}4.4函數(shù)重載我們?cè)谄綍r(shí)寫(xiě)代碼中會(huì)用到幾個(gè)函數(shù)但是他們的實(shí)現(xiàn)功能相同,但是有些細(xì)節(jié)卻不同。例如求絕對(duì)值,在C語(yǔ)言中有以下函數(shù):

intabs(intx)//求整數(shù)的絕對(duì)值longlabs(long)//求長(zhǎng)整數(shù)的絕對(duì)值doublefabs(doublex)//求double小數(shù)的絕對(duì)值floatfabsf(floatx);//求float小數(shù)的絕對(duì)值doublecabs(structcomplexz)//計(jì)算復(fù)數(shù)的絕對(duì)值

用戶(應(yīng)用程序員)需把每個(gè)函數(shù)名都記住,顯然很麻煩。用戶能不能只需記一個(gè)函數(shù),就能使用所有功能呢?于是C++提出了用一個(gè)函數(shù)名定義多個(gè)函數(shù),這就是函數(shù)重載(Overload)C++允許在同一作用域中聲明幾個(gè)類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個(gè)數(shù),類型,順序)必須不同,常用來(lái)處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問(wèn)題。例2-8編寫(xiě)程序,使用函數(shù)重載的方法,用一個(gè)函數(shù)名實(shí)現(xiàn)前述C語(yǔ)言的各個(gè)求絕對(duì)值函數(shù)。#include"math.h"intMyAbs(intx)//整數(shù)版本{returnx>0?x:-x;}__int64MyAbs(__int64x)//長(zhǎng)整數(shù)版本{if(x>=0)returnx;elsereturn-x;}doubleMyAbs(doublex)//雙精度小數(shù)版本{returnsqrt(x*x);}floatMyAbs(floatx)//單精度小數(shù)版本{return(float)sqrt(x*x);}doubleMyAbs(_complexc)//復(fù)數(shù)版本{returnsqrt(c.x*c.x+c.y*c.y);}intmain(){printf("|-5|=%d\n",MyAbs(-5));printf("|-50000000000|=%I64d\n",MyAbs(-50000000000));printf("|-8.0000000009|=%.10f\n",MyAbs(-8.0000000009));printf("|-8.9|=%f\n",MyAbs(-8.9));_complexa;a.x=10;a.y=10;printf("|(10,10)|=%f\n",MyAbs(a));return0;}構(gòu)成重載的條件:參數(shù)列表不同分析以下兩種情況,是否構(gòu)成函數(shù)的重載。第一種情況:(1)voidoutput();

(2)intoutput();第二種情況:(1)voidoutput(inta,intb=5);

(2)voidoutput(inta);思考:嘗試修改例2-4,函數(shù)swap1、swap2、swap3是否可以修改為同名重載函數(shù)?第5節(jié)異常異常處理C++標(biāo)準(zhǔn)異常5.1C++異常處理異常是程序在執(zhí)行期間產(chǎn)生的問(wèn)題。C++異常是指在程序運(yùn)行時(shí)發(fā)生的特殊情況,比如嘗試除以零的操作。異常提供了一種轉(zhuǎn)移程序控制權(quán)的方式。C++異常處理涉及到三個(gè)關(guān)鍵字:try、catch、throw·throw:當(dāng)問(wèn)題出現(xiàn)時(shí),程序會(huì)拋出一個(gè)異常?!atch:在想要處理問(wèn)題的地方,通過(guò)異常處理程序捕獲異常。·try:

try塊中的代碼標(biāo)識(shí)將被激活的特定異常。它后面通常跟著一個(gè)或多個(gè)catch塊。語(yǔ)法:try{//保護(hù)代碼。正常情況下程序會(huì)執(zhí)行完這里的代碼。//但遇到異常(出錯(cuò))情況時(shí)拋出異常}catch(ExceptionNamee1){//catch塊。如果上面拋出的異常是e1類型,執(zhí)行該段。}catch(ExceptionNamee2){//catch塊。如果上面拋出的異常是e2類型,執(zhí)行該段。}……catch(ExceptionNameeN){//catch塊。如果上面拋出的異常是eN類型,執(zhí)行該段。}catch(…)//catch塊。(…)表示如果異常不是以上列出的所有類型,執(zhí)行該段。}//注:以上每個(gè)catch段皆為可選例2-9一個(gè)捕捉除數(shù)為0的異常的程序#include<iostream>usingnamespacestd;doubledivision(doublea,doubleb){if(b==0){

throw"Error:Divisionby0!";}return(a*1.0/b);}intmain(){doublex,y;doublez=0;

try{cout<<"請(qǐng)輸入兩個(gè)數(shù):\nx=";cin>>x;cout<<"y=";cin>>y;z=division(x,y);cout<<z<<endl;

}

catch(constchar*msg){cerr<<msg<<endl;

}return0;}5.2C++標(biāo)準(zhǔn)異常C++提供了一系列標(biāo)準(zhǔn)的異常,定義在<exception>中,我們可以在程序中使用這些標(biāo)準(zhǔn)的異常。它們是以父子類層次結(jié)構(gòu)組織起來(lái)的。異常描述std::exception該異常是所有標(biāo)準(zhǔn)C++異常的父類。std::bad_alloc該異常可以通過(guò)new

拋出。std::bad_cast該異常可以通過(guò)dynamic_cast

拋出。std::bad_exception這在處理C++程序中無(wú)法預(yù)期的異常時(shí)非常有用。std::bad_typeid該異常可以通過(guò)typeid拋出。std::logic_error理論上可以通過(guò)讀取代碼來(lái)檢測(cè)到的異常。std::domain_error當(dāng)使用了一個(gè)無(wú)效的數(shù)學(xué)域時(shí),會(huì)拋出該異常。std::invalid_argument當(dāng)使用了無(wú)效的參數(shù)時(shí),會(huì)拋出該異常。std::length_error當(dāng)創(chuàng)建了太長(zhǎng)的std::string時(shí),會(huì)拋出該異常。std::out_of_range該異??梢酝ㄟ^(guò)方法拋出,例如std::vector和std::bitset<>::operator[]()。std::runtime_error理論上不可以通過(guò)讀取代碼來(lái)檢測(cè)到的異常。std::overflow_error當(dāng)發(fā)生數(shù)學(xué)上溢時(shí),會(huì)拋出該異常。std::range_error當(dāng)嘗試存儲(chǔ)超出范圍的值時(shí),會(huì)拋出該異常。std::underflow_error當(dāng)發(fā)生數(shù)學(xué)下溢時(shí),會(huì)拋出該異常。作業(yè)1.使用范圍for語(yǔ)句編寫(xiě)一個(gè)程序,實(shí)現(xiàn)一個(gè)數(shù)組的求和。2.利用函數(shù)重載實(shí)現(xiàn)三個(gè)比較大小的Compare函數(shù),供主函數(shù)調(diào)用。三個(gè)Compare函數(shù)分別可以處理兩個(gè)整數(shù)、兩個(gè)字符、兩個(gè)字符串的比較。比較規(guī)則如下:(1)若兩個(gè)整數(shù)比較:返回?cái)?shù)值較大的那個(gè)數(shù);(2)若兩個(gè)字符比較:返回ASCII碼值較大的那個(gè)字符;(3)若兩個(gè)字符串比較:從前到后比較每個(gè)字符的ASCII碼值,先找到更大值字符的那個(gè)字符串為更大。返回這個(gè)字符串。C++程序設(shè)計(jì)第3章類和對(duì)象第1節(jié)類和對(duì)象第2節(jié)構(gòu)造函數(shù)與析構(gòu)函數(shù)第3節(jié)常成員與靜態(tài)成員第4節(jié)友元函數(shù)第5節(jié)繼承與派生第6節(jié)虛函數(shù)與多態(tài)性第1節(jié)類和對(duì)象類和對(duì)象的定義對(duì)象的訪問(wèn)訪問(wèn)權(quán)限*this指針1.1類和對(duì)象的定義從結(jié)構(gòu)體說(shuō)起考慮用結(jié)構(gòu)體描述一個(gè)學(xué)生信息,參考例1-6。structstudent//結(jié)構(gòu)體定義{charname[30];charnum[10];charsex;intage;floatMathScore;floatEnglishScore;floatPoliticsScore;};例1-6中,為了計(jì)算學(xué)生的平均分,結(jié)構(gòu)體外部有一個(gè)函數(shù):floatAverage(structstudentstu){ return(stu.MathScore+stu.EnglishScore+stu.PoliticsScore)/3;}考慮:能不能讓Average函數(shù)放在結(jié)構(gòu)里內(nèi)部呢?使用戶看到結(jié)構(gòu)體的時(shí)候就知道有這個(gè)針對(duì)結(jié)構(gòu)體計(jì)算平均分的函數(shù)。答案是可以的:structstudent//結(jié)構(gòu)體定義{charname[30];charnum[10];charsex;intage;floatMathScore;floatEnglishScore;floatPoliticsScore;floatAverage()//參數(shù)不再需要{ return(MathScore+EnglishScore+PoliticsScore)/3;}};——這樣就變成了“類”等同于:classstudent//類的定義{public:charname[30];charnum[10];charsex;intage;floatMathScore;floatEnglishScore;floatPoliticsScore;floatAverage()//參數(shù)不再需要{ return(MathScore+EnglishScore+PoliticsScore)/3;}};類和對(duì)象類:封裝了物體各種屬性(成員變量)和方法(成員函數(shù))的數(shù)據(jù)類型對(duì)象:由“類”這種數(shù)據(jù)類型定義出來(lái)的“變量”,或稱類的實(shí)例。e.g.使用前述Student類定義兩個(gè)學(xué)生對(duì)象,以及一個(gè)對(duì)象的指針:studentstu1,stu2;//Student為類,stu1、stu2為對(duì)象student*pStu;再如:一個(gè)圓柱類classCylinder{public:doublex,y;//底面圓心坐標(biāo)doubler,h;//底面圓半徑,圓柱高doubleArea(double&Sd,double&Sc);//函數(shù)聲明inlinedoubleVolume()//內(nèi)聯(lián)函數(shù){return3.1415926*r*r*h;}};doubleCylinder::Area(double&Sd/*底面積*/,double&Sc/*側(cè)面積*/)//函數(shù)定義寫(xiě)在類外部{doubleS/*表面積*/;Sd=3.1415926*pow(r,2);Sc=2*3.1415926*r*h;S=Sc+2*Sd;returnS;}1.2對(duì)象的訪問(wèn)使用點(diǎn)號(hào)運(yùn)算符

格式:對(duì)象.成員使用箭頭運(yùn)算符

格式:對(duì)象指針->成員e.gCylinderc1;c1.x=10;c1.y=20;c1.r=5;c1.h=8;doublevolume_c1=c1.Volume();

Cylinderc2,*p;p=&c2;p->x=25;p->y=15;p->r=8;p->h=6;doublevolume_c2=p->Volume();例3-1改寫(xiě)例1-5中圓柱,使用類來(lái)表達(dá)#include<iostream>usingnamespacestd;constdoublePI=3.1215926535;classCylinder{public:doublex,y;//底面圓心坐標(biāo)

doubler,h;//底面圓半徑,圓柱高

doubleArea(double&Sd,double&Sc);

//函數(shù)聲明

inlinedoubleVolume()//函數(shù)聲明//內(nèi)聯(lián)函數(shù)

{return3.1415926*r*r*h;}};//函數(shù)定義寫(xiě)在類外部doubleCylinder::Area(double&Sd/*底面積*/,double&Sc/*側(cè)面積*/){doubleS/*表面積*/;Sd=PI*r*r;Sc=2*PI*r*h;S=Sc+2*Sd;returnS;}intmain()//主函數(shù){Cylinderc1;doublevolume;doublearea_surface,area_bottom,area_side;

//對(duì)象使用.運(yùn)算符訪問(wèn)成員

c1.x=10;c1.y=20;c1.r=5;c1.h=8;volume=c1.Volume();area_surface=c1.Area(area_bottom,area_side);cout<<"圓柱c1的體積為"<<volume<<",底面積為"<<area_bottom<<",表面積為"<<area_surface<<endl;

Cylinderc2,*p;p=&c2;

//指針使用->運(yùn)算符訪問(wèn)成員

p->x=25;p->y=15;p->r=8;p->h=6;volume=p->Volume();area_surface=p->Area(area_bottom,area_side);cout<<"圓柱c2的體積為"<<volume<<",底面積為"<<area_bottom<<",表面積為"<<area_surface<<endl;return0;}1.3訪問(wèn)權(quán)限public:公有訪問(wèn)權(quán)限

對(duì)象內(nèi)部和外部都能訪問(wèn)private:私有訪問(wèn)權(quán)限

只有對(duì)象內(nèi)部才能訪問(wèn),外部不能訪問(wèn)e.g.classA{public:inta;private:intb;public:A(){}}voidmain(){AmyA;myA.a=1;//√myA.b=2;//編譯提示私有成員不能訪問(wèn)}*1.4this指針this指針是一個(gè)隱含的指針,它是指向?qū)ο蟊旧恚砹藢?duì)象的地址對(duì)象調(diào)用成員函數(shù)時(shí),成員函數(shù)除了接受實(shí)參外,還接受到了一個(gè)對(duì)象的地址。這個(gè)地址被一個(gè)隱含的形參this指針?biāo)@取。所有對(duì)數(shù)據(jù)成員的訪問(wèn)都隱含地被加上前綴this->。例如:x=0;等價(jià)于this->x=0。例:繼續(xù)思考前例,增加一個(gè)帶參數(shù)的重載構(gòu)造函數(shù)e.g.classA{public:inta;private:intb;public:A(){}A(inta,intb){a=a;//?b=b;//?}print(){cout<<"a="<<a<<",b="<<b<<endl;}};voidmain(){AmyA;myA.a=1;//√

//myA.b=2;//×不能訪問(wèn)myA.print();AmyA2(1,2);myA2.print();}this->a=a;this->b=b;第2節(jié)構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)析構(gòu)函數(shù)2.1構(gòu)造函數(shù)考慮前述圓柱Cylinder類,如何對(duì)成員變量進(jìn)行初始化?如何對(duì)圓心坐標(biāo)(x,y)初始化為(0,0)?并把底面半徑r和高h(yuǎn)初始成為1?在main()函數(shù)中?e.g.voidmain(){Cylinderc;c.x=0;c.y=0;c.r=1;c.h=1;……}類中加一個(gè)init函數(shù),給main函數(shù)調(diào)用?e.g.voidCylinder::init()

{x=0;y=0;r=1;h=1;}能不能在定義對(duì)象的時(shí)候類自己就能進(jìn)行初始化?

——構(gòu)造函數(shù)構(gòu)造函數(shù)是對(duì)象被定義時(shí)自動(dòng)被調(diào)用的函數(shù)(在創(chuàng)建對(duì)象時(shí)由系統(tǒng)自動(dòng)調(diào)用,程序中不能直接調(diào)用)構(gòu)造函數(shù)與類名相同構(gòu)造函數(shù)無(wú)返回值構(gòu)造函數(shù)可以有多個(gè),即可以重載如果代碼中沒(méi)有定義構(gòu)造函數(shù),C++會(huì)提供一個(gè)默認(rèn)的構(gòu)造函數(shù)例3-2繼續(xù)改寫(xiě)3-1,使用構(gòu)造函數(shù)進(jìn)行初始化#include<iostream>usingnamespacestd;constdoublePI=3.1415926535;classCylinder{public:doublex,y;//底面圓心坐標(biāo)

doubler,h;//底面圓半徑,圓柱高

Cylinder(){//構(gòu)造函數(shù)x=0;y=0;r=1;h=1;}Cylinder(doublex0,doubley0,doubler0,doubleh0)//重載構(gòu)造函數(shù){x=x0;y=y0;r=r0;h=h0;}inlinedoubleVolume()//內(nèi)聯(lián)函數(shù)

{return3.1415926*r*r*h;}

//函數(shù)定義寫(xiě)在類內(nèi)部,沒(méi)有inline,//多數(shù)編譯器也會(huì)當(dāng)成內(nèi)聯(lián)函數(shù)doubleArea(double&Sd,double&Sc){doubleS/*表面積*/;Sd=PI*r*r;Sc=2*PI*r*h;S=Sc+2*Sd;returnS;}};intmain()//主函數(shù){

Cylinderc1;//自動(dòng)調(diào)用構(gòu)造函數(shù)

doublevolume;doublearea_surface,area_bottom,area_side;volume=c1.Volume();area_surface=c1.Area(area_bottom,area_side);cout<<"圓柱c1的體積為"<<volume<<",底面積為"<<area_bottom<<",表面積為"<<area_surface<<endl;

Cylinderc2(10,10,5,4);

//自動(dòng)調(diào)用帶參數(shù)的構(gòu)造函數(shù)

Cylinder*p;p=&c2;volume=p->Volume();area_surface=p->Area(area_bottom,area_side);cout<<"圓柱c2的體積為"<<volume<<",底面積為"<<area_bottom<<",表面積為"<<area_surface<<endl;return0;}2.2析構(gòu)函數(shù)格式:~類名()析構(gòu)函數(shù)是對(duì)象被注銷時(shí)自動(dòng)調(diào)用的一個(gè)成員函數(shù)析構(gòu)函數(shù)不帶參數(shù)常用來(lái)做清理變量、釋放內(nèi)存的工作例如,考慮圓柱類中加一個(gè)“名字”屬性,用字符指針記錄(動(dòng)態(tài)申請(qǐng)字符串)。當(dāng)對(duì)象被注銷時(shí)(例如程序退出),可以利用析構(gòu)函數(shù)來(lái)對(duì)該指針進(jìn)行清理例3-2中加入名字屬性和析構(gòu)函數(shù)。類的代碼修改為……classCylinder{public:doublex,y;//底面圓心坐標(biāo)

doubler,h;//底面圓半徑,圓柱高

char*pName;Cylinder(){x=0;y=0;r=1;h=1;pName=newchar[10];strcpy_s(pName,8,"Noname");

}Cylinder(doublex0,doubley0,doubler0,doubleh0,

constchar*pGivenName){x=x0;y=y0;r=r0;h=r0;

intlength=strlen(pGivenName);pName=newchar[length+1];strcpy_s(pName,length+1,pGivenName);}~Cylinder()//析構(gòu)函數(shù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論