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

下載本文檔

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

文檔簡介

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

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

第1章概述

第2章C++新增語言

第3章類和對象

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

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

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

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

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

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

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

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

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

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

安裝時勾選MFC選項——常用QTCreator

——QT編程AndroidStudio

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

C語言復(fù)習(xí)結(jié)構(gòu)化程序設(shè)計字符串數(shù)組指針函數(shù)結(jié)構(gòu)體2.1結(jié)構(gòu)化程序設(shè)計順序結(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]; //定義一個字符數(shù)組printf("輸入少于9個字符\n");//輸出文本

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

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

}return0;}問題:為何出錯?2.3數(shù)組數(shù)組的構(gòu)造、輸入、輸出、查找……例1-3.閱讀以下程序并判斷輸出結(jié)果#include"stdafx.h"intmain(){inta[2][3],m,h,l,i,j;//從鍵盤為數(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("輸入一個數(shù)\n");scanf("%d",&num);printf("指針pnum的值:\n");printf("%x\n",pnum);printf("地址%d中的值是:\n",pnum);

printf("%x\n",*pnum);}2.5函數(shù)一個C程序程序有一個主函數(shù)。主函數(shù)是程序的入口。除了主函數(shù)以外,還可以有多個函數(shù)例1-5.編寫一個計算圓柱的表面積和體積的程序,要求輸入底面半徑和高,輸出圓柱的表面積和體積。#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("請輸入圓柱半徑:");scanf("%lf",&radius);printf("請輸入圓柱高度:");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.編寫程序,輸入兩個學(xué)生的信息(姓名、學(xué)號、性別、年齡、以及數(shù)學(xué)、英語、政治三科成績),并計算輸入平均分#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("請輸入第一位學(xué)生的姓名、學(xué)號、性別、年齡、以及數(shù)學(xué)、英語、政治三科成績:\n");scanf("%s%s%c%d%f%f%f",

&(),&(stu1.num),&(stu1.sex),&(stu1.age),&(stu1.MathScore),&(stu1.EnglishScore),&(stu1.PoliticsScore));printf("請輸入第二位學(xué)生的姓名、學(xué)號、性別、年齡、以及數(shù)學(xué)、英語、政治三科成績:\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è)計第2章C++新增語言第1節(jié)C++輸入輸出第2節(jié)循環(huán)語句新特性第3節(jié)動態(tài)內(nèi)存分配第4節(jié)函數(shù)新特性第5節(jié)異常第1節(jié)C++輸入輸出命名空間cout語句cin語句使用VisualStudio2022創(chuàng)建一個HelloWorldC++程序

#include<iostream>intmain(){

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

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

usingnamespace命名空間名稱;//釋放某個變量到當前作用域

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

cin>>表達式1>>表達式2>>……>>表達式n;e.g.inta;cin>>a;floatf;chars[20];cin>>f>>s;cout、cin舉例例2-3改寫例1-6,用cin、cout對結(jié)構(gòu)體的數(shù)據(jù)進行輸入輸出#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<<"請輸入第一位學(xué)生的姓名、學(xué)號、性別、年齡、以及數(shù)學(xué)、英語、政治三科成績:"<<endl;

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

cout<<"請輸入第二位學(xué)生的姓名、學(xué)號、性別、年齡、以及數(shù)學(xué)、英語、政治三科成績:"<<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)語句新特性auto關(guān)鍵字(C++11)范圍for語句(C++11)2.1auto關(guān)鍵字屬于C++11標準早在C++98標準中就存在了auto關(guān)鍵字,那時的auto用于聲明變量為自動變量,自動變量意為擁有自動的生命期,這是多余的,因為就算不使用auto聲明,變量依舊擁有自動的生命期:inta=5;//擁有自動生命期autointb=10;//擁有自動生命期staticintc=15;//延長了生命期C++98中的auto多余且極少使用,C++11已經(jīng)刪除了這一用法,取而代之的是全新的auto:變量的自動類型推斷。C++11中,auto可以在聲明變量的時候根據(jù)變量初始值的類型自動為此變量選擇匹配的類型。e.g.inta=5;autob=a;//自動類型推斷,b為int類型

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

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

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

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

(1)std::vector<std::string>vs;//vector和iterator是后面章節(jié)會學(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語句C++11標準一種更簡單的for語句,用于遍歷一個序列。語法:

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

for(autox:f)//對數(shù)組f中的每個元素,依次進行處理{cout<<x<<endl;}例2-4改寫例1-1,使用范圍for語句實現(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é)動態(tài)內(nèi)存分配關(guān)于動態(tài)內(nèi)存分配new運算符delete運算符3.1關(guān)于動態(tài)內(nèi)存分配為什么需要動態(tài)內(nèi)存分配?程序中大部分的內(nèi)存需求都是在程序執(zhí)行之前通過定義所需的變量來確定的。但是可能存在程序的內(nèi)存需求只能在運行時確定的情況。例如,當需要的內(nèi)存取決于用戶輸入。C語言動態(tài)內(nèi)存分配語句回顧malloc函數(shù):動態(tài)分配指定字節(jié)的內(nèi)存

定義:void*malloc(unsignedintnum_bytes);e.g.int*p;p=(int*)malloc(sizeof(int));//動態(tài)申請能儲存一個整數(shù)的內(nèi)存。*p代表該無名字整數(shù)char*q;//聲明一個字符指針,準備動態(tài)申請一個用戶指定長度的字符數(shù)組(字符串)intsize;scanf(“%d”,&size);//用戶對size賦值,用戶指定數(shù)組長度q=(char*)malloc(size*sizeof(char));//動態(tài)申請長度為size的字符數(shù)組動態(tài)分配的內(nèi)存需要在程序結(jié)束之前全部釋放,否則會造成內(nèi)存泄露。free函數(shù):釋放之前動態(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運算符C++提供了new與delete運算符,進行動態(tài)內(nèi)存分配語法:①變量申請:類型*pointer=new類型;//...

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

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

deletep;//釋放變量內(nèi)存

p=newint[10];//動態(tài)申請一個10個元素的整型數(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ù)調(diào)用的機制而是通過將函數(shù)體直接插入調(diào)用處來實現(xiàn)的,這樣可以大大減少由函數(shù)調(diào)用帶來的開銷,從而提高程序的運行效率。一般來說inline用于定義某些短小并將被頻繁調(diào)用的函數(shù)。只需在函數(shù)定義前加inline關(guān)鍵字就可以把函數(shù)定義為內(nèi)聯(lián)函數(shù)。編譯器在編譯階段對內(nèi)聯(lián)函數(shù)進行處理。只是對編譯器的建議,具體有沒有真正內(nèi)聯(lián),要看編譯器。優(yōu)缺點:

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

缺點:利用得不好,會造成代碼臃腫。語法:

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標準語法:

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

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

可改寫成:

auto

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

可改寫成:

autofunc(inta,intb)->void;4.3引用參數(shù)引用:是某一個變量或?qū)ο蟮膭e名。對引用的操作與對其所綁定的變量或?qū)ο蟮牟僮魍耆葍r語法:類型&引用名=目標變量名;e.g.doublea=10.3;double&b=a;b=b+10;cout<<“a=“<<a<<“,b=“<<b<<endl;傳值參數(shù)傳址參數(shù)例2-6閱讀程序,判斷每個swap函數(shù)是否能實現(xiàn)變量數(shù)值的對換。#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語言的兩種函數(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改寫例1-5求圓柱表面積和體積的例子,要求改為:

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

(2)函數(shù)Area()除了返回表面積外,還要返回底面積和側(cè)面積。//因為后置返回類型為C++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<<"請輸入圓柱半徑:"; cin>>radius; cout<<"請輸入圓柱高度:"; 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ù)重載我們在平時寫代碼中會用到幾個函數(shù)但是他們的實現(xiàn)功能相同,但是有些細節(jié)卻不同。例如求絕對值,在C語言中有以下函數(shù):

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

用戶(應(yīng)用程序員)需把每個函數(shù)名都記住,顯然很麻煩。用戶能不能只需記一個函數(shù),就能使用所有功能呢?于是C++提出了用一個函數(shù)名定義多個函數(shù),這就是函數(shù)重載(Overload)C++允許在同一作用域中聲明幾個類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個數(shù),類型,順序)必須不同,常用來處理實現(xiàn)功能類似數(shù)據(jù)類型不同的問題。例2-8編寫程序,使用函數(shù)重載的方法,用一個函數(shù)名實現(xiàn)前述C語言的各個求絕對值函數(shù)。#include"math.h"intMyAbs(intx)//整數(shù)版本{returnx>0?x:-x;}__int64MyAbs(__int64x)//長整數(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++標準異常5.1C++異常處理異常是程序在執(zhí)行期間產(chǎn)生的問題。C++異常是指在程序運行時發(fā)生的特殊情況,比如嘗試除以零的操作。異常提供了一種轉(zhuǎn)移程序控制權(quán)的方式。C++異常處理涉及到三個關(guān)鍵字:try、catch、throw·throw:當問題出現(xiàn)時,程序會拋出一個異常?!atch:在想要處理問題的地方,通過異常處理程序捕獲異常。·try:

try塊中的代碼標識將被激活的特定異常。它后面通常跟著一個或多個catch塊。語法:try{//保護代碼。正常情況下程序會執(zhí)行完這里的代碼。//但遇到異常(出錯)情況時拋出異常}catch(ExceptionNamee1){//catch塊。如果上面拋出的異常是e1類型,執(zhí)行該段。}catch(ExceptionNamee2){//catch塊。如果上面拋出的異常是e2類型,執(zhí)行該段。}……catch(ExceptionNameeN){//catch塊。如果上面拋出的異常是eN類型,執(zhí)行該段。}catch(…)//catch塊。(…)表示如果異常不是以上列出的所有類型,執(zhí)行該段。}//注:以上每個catch段皆為可選例2-9一個捕捉除數(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<<"請輸入兩個數(shù):\nx=";cin>>x;cout<<"y=";cin>>y;z=division(x,y);cout<<z<<endl;

}

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

}return0;}5.2C++標準異常C++提供了一系列標準的異常,定義在<exception>中,我們可以在程序中使用這些標準的異常。它們是以父子類層次結(jié)構(gòu)組織起來的。異常描述std::exception該異常是所有標準C++異常的父類。std::bad_alloc該異??梢酝ㄟ^new

拋出。std::bad_cast該異??梢酝ㄟ^dynamic_cast

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

格式:對象.成員使用箭頭運算符

格式:對象指針->成員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改寫例1-5中圓柱,使用類來表達#include<iostream>usingnamespacestd;constdoublePI=3.1215926535;classCylinder{public:doublex,y;//底面圓心坐標

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

doubleArea(double&Sd,double&Sc);

//函數(shù)聲明

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

{return3.1415926*r*r*h;}};//函數(shù)定義寫在類外部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;

//對象使用.運算符訪問成員

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;

//指針使用->運算符訪問成員

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訪問權(quán)限public:公有訪問權(quán)限

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

只有對象內(nèi)部才能訪問,外部不能訪問e.g.classA{public:inta;private:intb;public:A(){}}voidmain(){AmyA;myA.a=1;//√myA.b=2;//編譯提示私有成員不能訪問}*1.4this指針this指針是一個隱含的指針,它是指向?qū)ο蟊旧恚砹藢ο蟮牡刂穼ο笳{(diào)用成員函數(shù)時,成員函數(shù)除了接受實參外,還接受到了一個對象的地址。這個地址被一個隱含的形參this指針所獲取。所有對數(shù)據(jù)成員的訪問都隱含地被加上前綴this->。例如:x=0;等價于this->x=0。例:繼續(xù)思考前例,增加一個帶參數(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;//×不能訪問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類,如何對成員變量進行初始化?如何對圓心坐標(x,y)初始化為(0,0)?并把底面半徑r和高h初始成為1?在main()函數(shù)中?e.g.voidmain(){Cylinderc;c.x=0;c.y=0;c.r=1;c.h=1;……}類中加一個init函數(shù),給main函數(shù)調(diào)用?e.g.voidCylinder::init()

{x=0;y=0;r=1;h=1;}能不能在定義對象的時候類自己就能進行初始化?

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

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ù)定義寫在類內(nèi)部,沒有inline,//多數(shù)編譯器也會當成內(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;//自動調(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);

//自動調(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ù)是對象被注銷時自動調(diào)用的一個成員函數(shù)析構(gòu)函數(shù)不帶參數(shù)常用來做清理變量、釋放內(nèi)存的工作例如,考慮圓柱類中加一個“名字”屬性,用字符指針記錄(動態(tài)申請字符串)。當對象被注銷時(例如程序退出),可以利用析構(gòu)函數(shù)來對該指針進行清理例3-2中加入名字屬性和析構(gòu)函數(shù)。類的代碼修改為……classCylinder{public:doublex,y;//底面圓心坐標

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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論