第01章-C++語言基礎(chǔ)(一)更好的C_第1頁
第01章-C++語言基礎(chǔ)(一)更好的C_第2頁
第01章-C++語言基礎(chǔ)(一)更好的C_第3頁
第01章-C++語言基礎(chǔ)(一)更好的C_第4頁
第01章-C++語言基礎(chǔ)(一)更好的C_第5頁
已閱讀5頁,還剩74頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

業(yè)精于勤荒于嬉行成于思?xì)в陔S

——韓愈課程目的本課程主要介紹應(yīng)用C++語言進(jìn)行程序設(shè)計(jì)的基本原理與基本方法,通過課程學(xué)習(xí)和上機(jī)實(shí)習(xí),培養(yǎng)學(xué)員使用C++語言進(jìn)行程序設(shè)計(jì)的能力和實(shí)際系統(tǒng)開發(fā)的能力,為其它課程的學(xué)習(xí)和從事應(yīng)用開發(fā)工作打下堅(jiān)實(shí)的基礎(chǔ),特別為進(jìn)行面向?qū)ο蟮南到y(tǒng)開發(fā)和窗口程序設(shè)計(jì)打下基礎(chǔ)。課程內(nèi)容第01章C++語言基礎(chǔ)(一)更好的C第02章C++語言基礎(chǔ)(二)函數(shù)第03章類和對(duì)象(一)面向?qū)ο蠡A(chǔ)第04章類和對(duì)象(二)類與對(duì)象的進(jìn)一步討論第05章運(yùn)算符重載第06章繼承與派生第07章多態(tài)性與虛函數(shù)第08章標(biāo)準(zhǔn)模板庫(STL)第09章C++最新發(fā)展30課時(shí)第01章C++語言概述C++與C語言的不同1、概述1/3C++的歷史C++語言的原始設(shè)計(jì)者和實(shí)現(xiàn)者是美國(guó)貝爾實(shí)驗(yàn)室的BjarneStroustrup,最初在貝爾實(shí)驗(yàn)室內(nèi)部使用。1983年開始廣泛流行,1998年制定了ISO國(guó)際標(biāo)準(zhǔn)(ISO/IEC14882)。目前在世界范圍采用C++語言作為主要編程工具的程序員在所有編程語言中最多。C++與C的關(guān)系C語言是C++的一個(gè)子集,C++包含了C語言的全部?jī)?nèi)容。兼容性本質(zhì)差別擴(kuò)充與增強(qiáng)1、概述2/3C++對(duì)C語言進(jìn)行了擴(kuò)充和增強(qiáng)。例如:靈活多樣的注釋----單行注釋--//方便明了的變量說明----塊(分程序)內(nèi)任何位置可定義和聲明有效的動(dòng)態(tài)存儲(chǔ)分配----new和delete運(yùn)算符簡(jiǎn)單易用的輸入/輸出流機(jī)制----輸入/輸出流—cin/cout作用域限定運(yùn)算符::結(jié)構(gòu)體功能的延展顯式類型轉(zhuǎn)換新的形式函數(shù)重載更強(qiáng)的類型檢查機(jī)制函數(shù)參數(shù)的默認(rèn)值內(nèi)聯(lián)(inline)函數(shù)引用等等。1、概述3/3在面向?qū)ο蠓矫娴耐卣乖鰪?qiáng)主要包括如下方面:類(包括結(jié)構(gòu)型)數(shù)據(jù)封裝(類成員的訪問控制)構(gòu)造函數(shù)和析構(gòu)函數(shù)對(duì)象和消息友元類中的運(yùn)算符和函數(shù)重載類的繼承(或派生)多態(tài)--虛擬函數(shù)等2C++語言擴(kuò)充和增強(qiáng)C++語言的輸入和輸出注解動(dòng)態(tài)存儲(chǔ)分配和釋放存儲(chǔ)空間const說明符引用枚舉名,結(jié)構(gòu)名和聯(lián)合名都是類型名C++語言的類型類型轉(zhuǎn)換C++語言的運(yùn)算符C++語言的語句2.1C++語言的輸入和輸出C++語言的輸入和輸出的方法。使用C語言的外部函數(shù)(如printf,scanf等),要包含頭文件“stdio.h”C++語言還提供自己的輸入輸出方式。是通過“>>”和“<<”實(shí)現(xiàn)。包含“iostream.h”輸入格式為:cin>>變量輸出格式為:在輸出表達(dá)式時(shí),為避免二義性表達(dá)式最好加括號(hào)cin是標(biāo)準(zhǔn)輸入流,通常對(duì)應(yīng)于鍵盤的輸入;>>是表示輸入操作的運(yùn)算符。cout是標(biāo)準(zhǔn)輸出流,通常對(duì)應(yīng)于屏幕的顯示;<<是表示輸出操作的運(yùn)算符。下列程序程序顯示一行字符串#include<iostream.h>voidmain(){cout<<"Hello,World";}因此,在屏幕上顯示一行輸出:Hello,World例1:鍵入一個(gè)代表英寸的整數(shù),打印相應(yīng)厘米數(shù)#include<iostream.h>voidmain(){intinch=0;cout<<"inches=";cin>>inch;cout<<inch;cout<<"inches=";cout<<inch*2.54;cout<<"cm"<<endl;}cin是C++語言的標(biāo)準(zhǔn)輸入流;“>>”運(yùn)算符從標(biāo)準(zhǔn)輸入流cin中讀入數(shù)據(jù)存入第二個(gè)參數(shù)。對(duì)于輸入符號(hào)“>>”,如果需要連續(xù)輸入多個(gè)數(shù)據(jù),那么可以有以下兩種方法:每行只輸入一個(gè)數(shù)據(jù),以換行符結(jié)束一個(gè)數(shù)據(jù)的輸入。一行輸入多個(gè)數(shù)據(jù),以空格符作為一個(gè)數(shù)據(jù)的輸入結(jié)束標(biāo)記;以換行符結(jié)束一行數(shù)據(jù)的輸入。例:intnum,pstr[20];cin>>num>>pstr;如果輸入:120chengdu則num為120,而pstr僅指向字符串cheng,而不是chengdu。cout是C++語言的標(biāo)準(zhǔn)輸出流;“<<”運(yùn)算符把參數(shù)的內(nèi)容輸出到標(biāo)準(zhǔn)輸出設(shè)備上。對(duì)于輸入符號(hào)“<<”,如果需要連續(xù)輸入多個(gè)數(shù)據(jù),還可將上述程序后四句輸出改寫為:cout<<inch<<"inches="<<inch*2.54<<"cm";輸出回車換行”<<endl”由于cout、cin、<<和>>是在頭文件iostream.h中定義的,因此在程序中用到cout、cin、<<、>>都必須首先將頭文件包含到程序中。一、C++和C的輸入/輸出比較

#include<iostream.h>代替#include<stdio.h>cin>>代替scanf(cin>>無需在輸入變量之前加取地址運(yùn)算符&cout<<代替printf在同一個(gè)語句中,可以輸出多個(gè)表達(dá)式的值,也可輸入多個(gè)變量的值,但不可將輸入和輸出寫在同一個(gè)語句中。二、面向流的I/O的好處:使程序具有更好的可讀性減少出錯(cuò)的可能性(即安全性較好)使用較靈活2.2注解一、塊(block)注解塊注解的用法與C語言一致。以/*開頭,以*/結(jié)束??梢允窃谝恍兄校部稍诙嘈兄小H纾?/p>

/*thisisasinglelinecomment*/注解中有*時(shí),前后要加空格不許鑲嵌二、行(line)注解新的注解方法,Comment_to_end_of_line的結(jié)構(gòu),使用“//”開始,直到行結(jié)尾結(jié)束的注解,即

unm++;//incrementnum該注解以”//”開始,到行末結(jié)束。只能注解單行,可以鑲嵌。不可能在行注解后的同一行中書寫非注解的代碼。2.3C++中的聲明一、標(biāo)識(shí)符聲明的位置在C++中,局部(local)標(biāo)識(shí)符的聲明(declaration)是一種語句(statement),它可以出現(xiàn)在塊(blockstatement)的任何部分,只要寫在對(duì)應(yīng)的標(biāo)識(shí)符使用之前即可。而C中,聲明不是一種語句,它只能寫在一個(gè)塊的開始部分。例如:

{

cout<<"Enternewtag:";

inttag;//在其它執(zhí)行語句后才定義的標(biāo)識(shí)符

cin>>tag;

cout<<"Tagis:"<<tag<<'\n';

}2.3C++中的聲明二、局部標(biāo)識(shí)符的作用范圍和生命期局部標(biāo)識(shí)符的作用范圍(scope)和生命期(lifetime)與C語言一致,沒有發(fā)生變化。局部標(biāo)識(shí)符的作用范圍從其聲明開始至結(jié)束塊語句的右花括號(hào)為止。2.3C++中的聲明三、在for、if語句的頭部聲明標(biāo)識(shí)符標(biāo)識(shí)符聲明也能放置在for、if語句頭部的第一個(gè)表達(dá)式的位置。例如:

C++標(biāo)準(zhǔn)規(guī)定,for、if語句頭部聲明的標(biāo)識(shí)符,作用范圍為整個(gè)for、if語句。if(doubled=prim(number)){….}else{…….}for(intI=0;I<10;I++)

{

cout<<I<<'\n';

}2.3C++中的聲明四、C++中的聲明方法的好處C++語言中,為避免錯(cuò)用變量,通常將變量的使用限制在最小的作用域中,因此,可以在函數(shù)體內(nèi)任何位置定義變量。可提高程序的可讀性。一般,將局部變量推遲到使用時(shí)才定義(同時(shí)給出初始值)。

2.4const說明符關(guān)鍵字const有多種用途。1.說明符號(hào)常量C語言用符號(hào)來代表常量的方法是使用無參的宏定義量:#definePI3.14其中,PI并不是真正的符號(hào)常量,它僅僅是一個(gè)字符串,沒有類型,不占用存儲(chǔ)空間,不能取它的地址,只是在預(yù)處理時(shí),將它替換為3.14。C++語言提供一個(gè)更靈活的方式來描述常數(shù):consttypeconst_name=type類型的常數(shù);如:constfloatPI=3.14;這時(shí),PI是真正的符號(hào)常量,有類型,需要占用存儲(chǔ)空間能取它的地址,但不能被無const約束的指針指向,它的值不能被修改。如:int*pint;constintMAX=100;intmin;pint=&min;//正確pint=&MAX;//錯(cuò)誤說明函數(shù)的形參如函數(shù)voidfun(constintnum);在該函數(shù)內(nèi),num被認(rèn)為是常數(shù),只能使用,而不能修改。說明指針變量通常情況下指針變量的使用方法為:type*pointer;pointer=…;//修改指針的值,使該指針指向type類

//型的其他數(shù)據(jù)。*pointer=…;//通過間接訪問方式修改指針指向的數(shù)據(jù)const也可以與指針一起使用。分為三種情況:1)指向常量的指針。將指針聲明前加上const,使指向的對(duì)象為常量,而不是指針為常量。該指針稱為指向常量的指針??梢圆怀跏蓟?。例如:inta=1,b=2;constintc=3;constint*pi;pi=&a;*pi=10;//錯(cuò):不能修改指向數(shù)據(jù)a=10;pi=&c;*pi=100;//錯(cuò)誤c=100;//錯(cuò)誤:修改常量2)常指針。要把指針本身而不是它指向的對(duì)象聲明為常量,采用運(yùn)算符*const。該指針稱為常指針,必須初始化。通過它可以修改指向的數(shù)據(jù);指針本身為常量,一旦初始化后,就不能讓它指向其他的數(shù)據(jù)。實(shí)際上,該類指針只能指向變量,而不能指向真正的常量。例如:inta=1,b=2;constintc=3;int*constpi=&a;*pi=10;pi=&b;//錯(cuò)誤:不能修改指針本身,即不能讓它指向其他數(shù)據(jù)int*constpint=&b;*pint=20;pint=&a;//錯(cuò)誤:int*constpint_c=&c;//錯(cuò)誤不能指向常量3)指向常量的常指針。要使兩個(gè)目標(biāo)都是常量,二者都要聲明為const。該指針稱為指向常量的常指針。必須初始化;該類指針可以指向常量,也可以指向變量;但通過該指針不能修改它所指向的數(shù)據(jù);初始化后也不能讓它指向其他的數(shù)據(jù)。inta=1,b=2;constintc=3;constint*constpi=&a;*pi=10;//錯(cuò)誤:通過它,不能修改它所指向的數(shù)據(jù)pi=&b;//錯(cuò)誤:不能修改指針本身,即不能讓它指向其他的數(shù)據(jù)constint*constpint=&c;//例2-5一般變量做形參的例子#include<iostream.h>voidfun(intnum){num=100;}voidmain(){intannum=10;fun(annum);cout<<annum;}//結(jié)果:10//例2-6指針變量做形參的例子。#include<iostream.h>voidfun(int*pnum){*pnum=100;}voidmain(){intannum=10;fun(&annum);cout<<annum;}//結(jié)果:100//例2-7指向常量的指針做形參的例子#include<iostream.h>voidfun(constint*pnum){*pnum=100;//錯(cuò)誤,函數(shù)不能修改*pnum,只能使用*pnumcout<<*pnum+100;//正確}voidmian(){intannum=10;fun(&annum);cout<<annum;//輸出10}//又如:字符串間的復(fù)制。voidassign(char*to,constchar*from){while(*to++=*from++);}2.5引用(1)引用的概念引用是某個(gè)變量或?qū)ο蟮膭e名。如果一個(gè)變量或?qū)ο笠坏┒x它的引用后,則該引用被“綁定”在這個(gè)變量或?qū)ο笊?,即變量或?qū)ο笾当桓淖儯瑒t引用值也被改變,反之亦然。引用不是變量,它不被分配內(nèi)存空間,它的地址值是引用它的變量或?qū)ο蟮牡刂分怠6x引用的格式如下:

<類型>&<引用名>=<變量或?qū)ο竺?gt;;其中,&是修飾符,定義引用時(shí)必須用一個(gè)相同類型的變量或?qū)ο竺M(jìn)行初始化。(2)引用的應(yīng)用引用在C++語言的程序中,通常用作函數(shù)參數(shù)和函數(shù)返回值。引用簡(jiǎn)單地說,就是給一個(gè)變量取一個(gè)別名。引用與它所用的變量共享存儲(chǔ)單元。1.獨(dú)立引用引用表示為:TYPE&,它的含義為“TYPE類型的引用”。TYPE&ref_name=TYPE的一個(gè)變量;例如:inti;int&j=i;intk=9;j=k;//i的值為9其中,int&j=i;創(chuàng)建了一個(gè)整數(shù)的引用j,j引用了i,j是變量i的別名;即j與i共享變量i的存儲(chǔ)單元。以后,所有對(duì)j的操作都是對(duì)的的操作。又如:intii=0;int&rr=ii;rr++;語句rr++實(shí)際上是對(duì)ii遞加。這種使用引用的方法稱為獨(dú)立引用。例:voidfun(){inti;int&r=i;//r引用ir=1;//i的值變?yōu)?int*p=&r;//p指向i,取r的地址也就是取i的地址

int&rr=r;//rr也引用i,某些版本不允許定義引用的引用

int*q;int*&qr=q;//qr是指針q的別名

intb;qr=&b;//使q指向b}由于一引用變量必須引用指向某一變量,獨(dú)立引用必須在它被說明時(shí)加以初始化,初始化分為兩種情況:1)初始化時(shí),賦值表達(dá)式的右端是一個(gè)變量。例如int&rr=ii;//ii是一個(gè)變量2)初始化時(shí),賦值表達(dá)式的右端是一個(gè)常量值。例如double&rd=1.0;在早期是允許的,但最近版本中,引用與一個(gè)常量相聯(lián)系,使用constdouble&rd2=1.0;表示,表明rd引用的是一個(gè)常數(shù)單元,不能被賦值,這樣語義更明確。實(shí)際上,constdoublerd2=1.0;//符號(hào)常量比constdouble&rd2=1.0;//引用一個(gè)常量更直觀和方便。因此,嚴(yán)格地講,引用是一個(gè)存儲(chǔ)單元的別名,只是在一般情況下,引用代表一個(gè)變量。還可以定義常引用。intx=1;constint&rx=x;rx=120;//錯(cuò)誤,只能使用rx,不能修改例2-9引用使用的例子。voidmain(){intj,k;int&i=j;j=10;printf("j=%d,i=%d",j,i);k=121;i=k;printf("\nj=%d\n",j);}該程序顯示如下輸出:

j=10,i=10j=121例2-10#include<iostream.h>voidmain(){intnum=500;int&ref=num;cout<<ref<<endl;ref+=100;cout<<ref<<endl;cout<<num<<endl;}該程序輸出:500600600如果引用的不是變量,而是常量(包括自然表示的常量和用const說明的符號(hào)常量)那么,自動(dòng)申請(qǐng)一個(gè)臨時(shí)單元(臨時(shí)變量),引用引用的是臨時(shí)變量,而不是常量單元。例2-11該程序輸出:500600500#include<iostream.h>voidmain(){constintnum=500;int&ref=num;//VC中不可用

cout<<ref<<endl;ref+=100;cout<<ref<<endl;cout<<num<<endl;}2.引用作為函數(shù)參數(shù)C語言采用傳值方式進(jìn)行參數(shù)傳遞。當(dāng)一個(gè)函數(shù)需要修改對(duì)應(yīng)地實(shí)參地值時(shí),參數(shù)應(yīng)明確為指針類型。例2-12#include<iostream.h>voidfun(intnum){num=100;}voidmain(){intannum=10;fun(annum);cout<<annum;}輸出:10

例2-13結(jié)果:100#include<iostream.h>voidfun(int*pnum)//行參為指針變量{*pnum=100;//通過行參間接訪問實(shí)參annum,//因?yàn)?pnum就是annum}voidmain(){intannum=10;fun(&annum);//實(shí)參為地址形式

cout<<annum;}結(jié)果:100例2-14#include<iostream.h>voidfun(int&pnum){pnum=100;}voidmain(){intannum=10;fun(annum);cout<<annum;}

例2-15輸出為:i=10,j=20i=10,j=20實(shí)際上,并沒有完成交換的功能。#include<stdio.h>voidswap(inta,intb){intt;t=a;a=b;b=t;}voidmain(){inti,j;i=10;j=20;printf("i=%d,j=%d\n",i,j);swap(i,j);printf("i=%d,j=%d",i,j);}

例2-16輸出為:i=10,j=20i=20,j=10#include<stdio.h>voidswap(int*a,int*b){intt;t=*a;*a=*b;*b=t;}main(){inti,j;i=10;j=20;printf("i=%d,j=%d\n",i,j);swap(&i,&j);printf("i=%d,j=%d",i,j);}

例2-17輸出:i=10,j=20i=20,j=10#include<stdio.h>voidswap(int&a,int&b);{intt;t=a;a=b;b=t;}voidmain(){inti,j;i=10;j=20;printf("i=%d,j=%d\n",i,j);swap(i,j);printf("i=%d,j=%d",i,j);}

總之,C++語言有兩種參數(shù)傳遞方式:1)傳值方式。(變量和指針作函數(shù)參數(shù))2)傳地址方式。(引用作函數(shù)參數(shù))3.引用作函數(shù)的返回函數(shù)返回引用,實(shí)際上返回的是一個(gè)存儲(chǔ)單元,因此,如果一個(gè)函數(shù)返回引用的話,則函數(shù)調(diào)用可以出現(xiàn)在賦值號(hào)的右邊,也可以出現(xiàn)在賦值號(hào)的左邊。例2-18輸出為:120200#include"stdafx.h"#include<iostream.h>int&get_var(int*pint){return*pint;}voidmain(){intanint=10;intotherint;otherint=get_var(&anint)*12;get_var(&anint)=200;cout<<otherint<<""<<anint;}

函數(shù)返回引用,那么,return后面應(yīng)該為引用。除了獨(dú)立引用外,還可以是:數(shù)組元素

static變量指針?biāo)赶虻淖兞?,?p

結(jié)構(gòu)的分量聯(lián)合的分量例2-19有一函數(shù)定義如下:

int&func(int*anArray,int&anInt){int&anotherInt=anArray[anInt];anInt=anotherInt/3;returnanArray[anotherInt];}

如果有intMyArray[]={14,6,15,3,21,89,31,6};intMyInt=1;func(MyArray,MyInt)=55;

將置MyInt為2,MyArray[6]為55;

這里,實(shí)參MyArray是一個(gè)初始化了的數(shù)組,實(shí)參MyInt的值為1。函數(shù)體的第一條語句:此時(shí),函數(shù)調(diào)用func(MyArray,MyInt)=55;

就等價(jià)于MyArray[6]=55;例2-20從終端上輸入一正文,將每個(gè)出現(xiàn)的單詞存入一數(shù)組,要求記錄下每個(gè)單詞的出現(xiàn)次數(shù)。首先,定義一個(gè)簡(jiǎn)單的結(jié)構(gòu):#include<string.h>#include<iostream.h>structpair{char*name;intval;};constintlarge=1024;//最多1024個(gè)不同單詞staticpairvec[large];//存儲(chǔ)所有的單詞對(duì)vec數(shù)組的初始化要求:每個(gè)空項(xiàng)的name域里都放‘\0’。該函數(shù)在vec數(shù)組的各name域中尋找與p指向的字符串相匹配的字符串。如找到,返回該vec項(xiàng)的地址;找不到,返回vec空項(xiàng)的地址;如果沒有空項(xiàng)(i等于lager),返回最后一項(xiàng)的地址。pair*find(char*p){for(inti=0;vec[i].name;i++)//成員被初始化為0if(strcmp(p,vec[i].name)==0)return&vec[i];if(i==large)return&vec[large-1];return&vec[i];}下面的函數(shù)value()給定串參數(shù)p,找到相應(yīng)的整型對(duì)象,然后返回對(duì)它的引用。int&value(char*p){pair*res=find(p);if(res->name==0){res->name=newchar[strlen(p)+1];strcpy(res->name,p);res->val=0;}returnres->val;}函數(shù)find()和value()用了兩種不同的方式來說明函數(shù)的返回值。find函數(shù)返回的是指向pair的指針,value()函數(shù)返回的是vec數(shù)組中需要加1的某一單詞的val單元。下面主程序使用上述定義的函數(shù)。constintmax=256;//單詞的最大長(zhǎng)度voidmain(){charbuf[max];while(cin>>buf)value(buf)++;for(inti=0;vec[i].name;i++)cout<<vec[i].name<<':'<<vec[i].val<<'';}輸入aabbbbccaaaabbaaaaCtRL^Z則輸出:aa:5bb:3cc:1#include<string.h>#include<iostream.h>structpair{char*name;intval;};constintlarge=1024;staticpairvec[large];pair*find(char*p){for(inti=0;vec[i].name;i++)if(strcmp(p,vec[i].name)==0)return&vec[i];if(i==large)return&vec[large-1];return&vec[i];}int&value(char*p){pair*res=find(p);if(res->name==0){res->name=newchar[strlen(p)+1];strcpy(res->name,p);res->val=0;}returnres->val;}constintmax=256;//單詞的最大長(zhǎng)度voidmain(){charbuf[max];while(cin>>buf)value(buf)++;for(inti=0;vec[i].name;i++)cout<<vec[i].name<<':'<<vec[i].val<<'';}引用在定義時(shí)要初始化;對(duì)引用的操作就是對(duì)被引用的變量的操作;可以用某個(gè)引用的地址值賦給一個(gè)指針,而指針則指向被引用的變量;可以用某個(gè)引用給一個(gè)變量賦值,該變量的值便是被引用的變量值;引用與指針的比較引用是C++中的概念,初學(xué)者容易把引用和指針混淆一起。引用的一些規(guī)則如下:(1)引用被創(chuàng)建的同時(shí)必須被初始化(指針則可以在任何時(shí)候被初始化)。(2)不能有NULL引用,引用必須與合法的存儲(chǔ)單元關(guān)聯(lián)(指針則可以是NULL)。(3)一旦引用被初始化,就不能改變引用的關(guān)系(指針則可以隨時(shí)改變所指的對(duì)象)。2.6枚舉名,結(jié)構(gòu)名和聯(lián)合名都是類型名C++語言中,枚舉名,結(jié)構(gòu)名和聯(lián)合名都是類型名(及類名)。當(dāng)實(shí)例變化時(shí),不必在一個(gè)枚舉名或結(jié)構(gòu)名之前再加上enum,struct,union(class)。例:enumTraffic{red,green,yellow};structString{char*str;intlength;};當(dāng)實(shí)例化為變量時(shí),可以使用Trafficlight;Stringstr1;不必寫為enumTrafficlight;structStringstr1;在C語言中例2-21其中,salary是結(jié)構(gòu)data_rec的分量,也是匿名聯(lián)合的變量。structdata_rec{char*name;intid_number;union{floatannual_salary;floathourly_wage;}salary;};匿名聯(lián)合是可以在結(jié)構(gòu)內(nèi)定義沒有名字的聯(lián)合。可以使用下面方式訪問匿名聯(lián)合和的成員:data_recmy_record;data_recyour_record;my_record.salary.annual_salary=50000.0;your_record.salary.hourly_wage=120.50;2.7C++語言的類型C語言的類型有:基本類型:BOOL,char,int,double…特殊類型:void。用戶定義類型:數(shù)組,結(jié)構(gòu),聯(lián)合,枚舉。指針類型:type*C++類型完全包括了C的類型。新增了兩個(gè)類型:布爾類型:類型名bool,包括的數(shù)據(jù)true和false,表達(dá)邏輯操作的結(jié)果。bool類型還可以作為函數(shù)的返回類型,表示條件測(cè)試的結(jié)果。true可以對(duì)應(yīng)整數(shù)1,false對(duì)應(yīng)整數(shù)0。不為0的整型數(shù)據(jù)對(duì)應(yīng)ture;等于0的整型數(shù)據(jù)對(duì)應(yīng)false。抽象數(shù)據(jù)類型:類類型。2.8類型轉(zhuǎn)換

類型轉(zhuǎn)換是一種類型的值轉(zhuǎn)換為另一種類型的值。隱式轉(zhuǎn)換隱式轉(zhuǎn)換發(fā)生在下述情況:混合運(yùn)算:級(jí)別低的類型向級(jí)別高的類型轉(zhuǎn)換。將表達(dá)式的值賦給變量:表達(dá)式的值向變量類型的值轉(zhuǎn)換。實(shí)參向行參傳值:實(shí)參的值向形參的值進(jìn)行轉(zhuǎn)換。函數(shù)返回結(jié)果:返回的值向函數(shù)返回類型的值進(jìn)行轉(zhuǎn)換。顯示類型轉(zhuǎn)換C語言的方式為:(類型名)表達(dá)式或者(類型名)(表達(dá)式)C++語言中,還提供了函數(shù)表示法:類型名(表達(dá)式)注意:類型轉(zhuǎn)換要申請(qǐng)一個(gè)臨時(shí)單元,將要轉(zhuǎn)換的值先復(fù)制到臨時(shí)單元,轉(zhuǎn)換發(fā)生在臨時(shí)單元中。例:floatfnum=5.8;intinum=int(fnum);int(fnum)是一個(gè)表達(dá)式,結(jié)果為5;但fnum的值沒有改變,仍是5.8。對(duì)于復(fù)合類型(對(duì)類型有兩個(gè)或兩個(gè)以上限制的類型,如所有的指針類型,unsignedint等)不能用函數(shù)表示法進(jìn)行類型的轉(zhuǎn)換,只能用C語言的強(qiáng)制轉(zhuǎn)換表示法。例如:intnum;int*pnum=#char*pc;pc=(char*)pnum;那么pc和pnum;指向的是同一個(gè)單元;從pnum的角度看,指向的是兩個(gè)字節(jié)的一個(gè)整數(shù),而從pc的角度看,指向的是字符數(shù)組。2.9C++語言的運(yùn)算符一、單目作用域運(yùn)算符的意義和用法要在局部范圍內(nèi)訪問一個(gè)全局(不能是局部)標(biāo)識(shí)符,必須使用單目(unary)作用域運(yùn)算符(scopeoperator)::。當(dāng)在局部范圍內(nèi)沒有定義同名的標(biāo)識(shí)符時(shí),該運(yùn)算符可省略。在C語言中,在局部范圍內(nèi)不可能使用與局部變量同名的全局變量。單目作用域運(yùn)算符的用法為:

::全局標(biāo)識(shí)符該表達(dá)式的類型和值與全局標(biāo)識(shí)符相同。2.9C++語言的運(yùn)算符注意:?jiǎn)文孔饔糜蜻\(yùn)算符的操作數(shù)必須是全局標(biāo)識(shí)符。不可能在一個(gè)塊語句內(nèi)使用到與該塊語句內(nèi)同名的外層非全局的局部標(biāo)識(shí)符。二、使用單目作用域運(yùn)算符的例子2.10C++語言的語句1斷言的表達(dá)形式1.1語法1.2作用1.3診斷信息2斷言的使用方法2.1函數(shù)調(diào)用時(shí)檢查入口參數(shù)的合理性。2.2檢查內(nèi)存分配成功與否2.3防治野指針3注意事項(xiàng)(1)斷言捕捉的是非法操作的情況,而不是錯(cuò)誤。不要試圖用斷言來排錯(cuò)。(2)一旦函數(shù)對(duì)參數(shù)有任何假定,一定要在函數(shù)的入口處使用斷言來確認(rèn)假定是否實(shí)現(xiàn)。(3)給每一個(gè)斷言加上注釋,以便使斷言有目的的防錯(cuò)。assert(表達(dá)式)的意思是當(dāng)表達(dá)式為真時(shí),程序繼續(xù)運(yùn)行,如果表達(dá)市為假,那程序就會(huì)停止運(yùn)行,并提示錯(cuò)誤信息。注意:assert是一個(gè)宏,只在debug版本中起作用,在release版本中,該語句是不起任何作用的。程序一般分為Debug版本和Release版本,Debug版本用于內(nèi)部調(diào)試,Release版本發(fā)行給用戶使用。注意:由于assert宏只在debug版本中起作用,所以不要在assert表達(dá)式中作用有后續(xù)作用的語句。斷言是一個(gè)宏,格式為:

assert(邏輯表達(dá)式booleanExpression)斷言僅僅在Debug過程中產(chǎn)生作用。當(dāng)邏輯表達(dá)式出現(xiàn)了FALSE(0)的時(shí)候,編譯程序?qū)⒆詣?dòng)停止程序的運(yùn)行,并給出相關(guān)的程序診斷信息。對(duì)于Release版本的代碼,ASSERT宏不會(huì)被處理,因而不會(huì)對(duì)程序的正常運(yùn)行其任何阻攔作用。對(duì)于MFC,假如希望在Release版本中依然有類似的功能,可以使用VERIFY宏。該宏作用和斷言類似。assertionfailedinfileinline以上為診斷信息的格式。其中filename代表了出錯(cuò)程序代碼所在的文件,linenumber是該出現(xiàn)問題的斷言所在行。在函數(shù)內(nèi)檢測(cè)參數(shù)的合理性有兩個(gè)好處:1保證函數(shù)本身的健壯性;2使問題容易定位。主調(diào)給出的參數(shù)有時(shí)候可能是莫名其妙的,使用斷言,能夠發(fā)現(xiàn)許多難以發(fā)現(xiàn)的邏輯錯(cuò)誤。pBuf=(char*)malloc(sizeof(char)*100);ASSERT(NULL!=pBuf)ASSERT(NULL==pCount);//ifyou'veforgottendelete,herewilloutputanalart.c++中使用斷言2.3動(dòng)態(tài)存儲(chǔ)分配和釋放存儲(chǔ)空間2.3.1new和delete在C語言是利用malloc和free函數(shù)完成的。函數(shù)原形為:

void*malloc(size_tsize);voidfree(void*p);比如要分配100個(gè)整型數(shù)的存儲(chǔ)空間,將起始地址賦給指針變量pint*p;p=(int*)malloc(sizeof(int)*100);…free(p);C++的運(yùn)算符new和delete提供了動(dòng)態(tài)存儲(chǔ)分配和釋放存儲(chǔ)空間的功能。優(yōu)點(diǎn):new自動(dòng)計(jì)算要分配類型的大小,而不給出要分配的存儲(chǔ)區(qū)的大小,這比較方便,也可以避免偶然地分配錯(cuò)誤存儲(chǔ)量。它自動(dòng)返回正確的指針類型,不必對(duì)返回指針進(jìn)行強(qiáng)制類型轉(zhuǎn)換。可以用new將分配的存儲(chǔ)空間進(jìn)行初始化。運(yùn)算符new用于內(nèi)存分配。使用形式為type*p;p=newtype;其中,type是一個(gè)數(shù)據(jù)類名;p是指向該數(shù)據(jù)類型的指針;new從稱為堆的一塊空閑內(nèi)存區(qū)中為程序分配一塊內(nèi)存,其大小與type類型的數(shù)據(jù)一樣,該地址被存于指針p中。如果分配失敗,new返回一個(gè)空指針。type可以是任何類型,包括函數(shù)指針,但不允許函數(shù)類型。當(dāng)type為數(shù)組類型時(shí),new返回的指針指向數(shù)組的第一個(gè)元素,當(dāng)用new創(chuàng)建多維數(shù)時(shí),必須提供所有維的大小。運(yùn)算符delete釋放new分配的存儲(chǔ)空間,將其交還給堆。它的使用形式一般為deletep;其中p是一個(gè)指針,保存著new分配的內(nèi)存的首地址。動(dòng)態(tài)分配管理的方法要求delete的操作數(shù)必須是一個(gè)new返回的指針,對(duì)不是new得到的任何其它地址類型,使用delete將產(chǎn)生嚴(yán)重錯(cuò)誤。2.3.2new和delete典型用法動(dòng)態(tài)分配和釋放單個(gè)數(shù)據(jù)的存儲(chǔ)區(qū)語法為type*p;p=newtype;…deletep;通過*p的方式訪問new申請(qǐng)的空間??聪旅娴睦永?-2該程序把一存儲(chǔ)區(qū)地址賦給p,該存儲(chǔ)區(qū)足夠容納一個(gè)整數(shù)。然后把值20賦給該存儲(chǔ)區(qū),并把其內(nèi)容顯示在屏幕上。最后,釋放該動(dòng)態(tài)分配的存儲(chǔ)區(qū)。//例2-2#include<iostream.h>intmain(){int*p;p=newint;if(!p){cout<<"allocationfailure\n";return1;}*p=20;cout<<*p;deletep;return0;}用new運(yùn)算符初始化單個(gè)數(shù)據(jù)區(qū)域語法為type*p;p=newtype(…………);………deletep;例2-3用new運(yùn)算符初始化單個(gè)數(shù)據(jù)的存儲(chǔ)區(qū)的例子。#include<iostream.h>intmain(){

int*p;

p=newint(99);//99為初始值,初始值可以為常量、已經(jīng)

//有值的變量或表達(dá)式if(!p)

{

cout<<"allocationfailure\n";

return1;

}

cout<<*p;

deletep;

return0;}動(dòng)態(tài)分配數(shù)組的存儲(chǔ)空間一維數(shù)組語法為type*p;p=newtype[s]; //s為整數(shù)。指定數(shù)組中的元素個(gè)數(shù),可

//以是常量或表達(dá)式,不能省略…delete[]p;通過p[i]的方式訪問數(shù)組元素。例2-4動(dòng)態(tài)分配數(shù)組的存儲(chǔ)空間的例子。分配一個(gè)數(shù)組要記住的重要一點(diǎn)是不能對(duì)之初始化。#include<iostream.h>intmain(){float*p;inti;p=newfloat[10];if(!p){cout<<"allocationfailure\n";return1;}for(i=0;i<10;i++)p[i]=100.0f+i;for(i=0;i<10;i++)cout<<p[i]<<'';delete[]p;return0;}n維數(shù)組。語法為:type(*p)[常量1][常量2]…[常量n-1];p=newtype[s][常量1][常量2]…常量[n-1];//s指定數(shù)組中的第一維元素,可以是整//數(shù)的常量、變量或表達(dá)式,不能省略!…delete[]p;通過p[i1][i2]…[i3]的方式訪問數(shù)組元素。例如:數(shù)組的第一維可能為變量,但所有后繼維必須為常量,每維大小都不能缺省。int(*mat_ptr)[10][12],(*mat_ptr1)[10][12],(*mat_ptr2)[10][12],(*mat_ptr3)[10][12];mat_ptr=newint[3][10][12];intx=3;mat_ptr1=newint[x][10][12];mat_ptr2=newint[3][][12]; //錯(cuò)誤mat_ptr3=newint[][10][12]; //錯(cuò)誤回顧1/3C++語言的輸入和輸出的方法。使用C語言的外部函數(shù)(如printf,scanf等),要包含頭文件“stdio.h”C++語言還提供自己的輸入輸出方式。是通過“>>”和“<<”實(shí)現(xiàn)。包含“iostream.h”輸入格式為:cin>>變量輸出格式為:cout格式控制

回顧2/3運(yùn)算符new使用起來要比函數(shù)malloc簡(jiǎn)單得多:int*p1=(int*)malloc(sizeof(int)*length);int*p2=newint[length];這是因?yàn)閚ew內(nèi)置了sizeof、類型轉(zhuǎn)換和類型安全檢查功能。new在創(chuàng)建動(dòng)態(tài)對(duì)象的同時(shí)可完成初始化工作。在用delete釋放對(duì)象數(shù)組時(shí),留意不要丟了符號(hào)‘[]’。例如delete[]objects;//正確的用法deleteobjects;//錯(cuò)誤的用法,相當(dāng)于deleteobjects[0],漏掉了另外99個(gè)對(duì)象。int*p;p=newint;i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論