C++概述教學(xué)講解課件_第1頁
C++概述教學(xué)講解課件_第2頁
C++概述教學(xué)講解課件_第3頁
C++概述教學(xué)講解課件_第4頁
C++概述教學(xué)講解課件_第5頁
已閱讀5頁,還剩135頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++概述

知識點面向?qū)ο蟪绦蛟O(shè)計的基本概念C++的起源和特點C++源程序的構(gòu)成C++在非面向?qū)ο蠓矫娴囊恍┨匦噪y點面向?qū)ο蟮母拍頒++源程序的構(gòu)成C++在非面向?qū)ο蠓矫娴奶匦訡++概述

要求掌握:面向?qū)ο蟮母拍頒++程序的格式與結(jié)構(gòu)特點了解:類和對象的概念面向?qū)ο蟮奶匦訡++在非面向?qū)ο蠓矫娴囊恍┨匦訡++概述教學(xué)講解課件

或許你已經(jīng)學(xué)過C語言或Pascal語言,能用這些語言編寫簡單程序,解決某些具體問題。但在實際應(yīng)用中,特別是要編制一些比較大型的程序或系統(tǒng)軟件時,就會感到僅有這些是不夠的,需要有新的設(shè)計方法來提高編程能力,以便適應(yīng)軟件開發(fā)規(guī)模日益龐大的趨勢。20世紀(jì)90年代以來,在計算機軟件行業(yè),面向?qū)ο蟪绦蛟O(shè)計思想方法已被越來越多的軟件設(shè)計人員所接受。它是目前最先進的計算機程序設(shè)計思想和理念,這種新的思想更接近人的思維活動,利用這種思想和方法進行程序設(shè)計時,可以極大地提高編程能力,減少軟件維護的開銷。C++能完美地體現(xiàn)面向?qū)ο蟮母鞣N特性?;蛟S你已經(jīng)學(xué)過C語言或Pascal語言,能用1.1面向?qū)ο蟪绦蛟O(shè)計的基本概念

面向?qū)ο蟮脑O(shè)計思想是在原來結(jié)構(gòu)化程序方法基礎(chǔ)上的一個質(zhì)的飛躍,是一種新的程序設(shè)計理念,是軟件開發(fā)的一種方法,其本質(zhì)是把數(shù)據(jù)和處理數(shù)據(jù)的過程當(dāng)成一個整體——對象。面向?qū)ο蟪绦虻闹饕Y(jié)構(gòu)特點是:一,程序一般由類的定義和類的使用兩部分組成,在主程序中定義各對象并規(guī)定它們之間傳遞消息的規(guī)律;二,程序中的一切操作都是通過面向?qū)ο蟀l(fā)送消息來實現(xiàn)的,對象接受到消息后,啟動有關(guān)方法完成相應(yīng)的操作。面向?qū)ο笤O(shè)計的最大優(yōu)點就是軟件具有可重用性。當(dāng)人們對軟件系統(tǒng)的要求有所改變時,并不需要程序員做大量的工作就能使系統(tǒng)做相應(yīng)的變化。1.1面向?qū)ο蟪绦蛟O(shè)計的基本概念

面向?qū)ο蟮脑O(shè)計思想是在原1.1.1類與對象類與對象是面向?qū)ο蟪绦蛟O(shè)計中最重要的概念,如果要掌握面向?qū)ο蟪绦蛟O(shè)計技術(shù),首先必要很好的理解這兩個概念。對象從概念上講,對象代表著正在創(chuàng)建的系統(tǒng)中的一個實體。在日常生活中,對象就是我們認識世界的基本單元,對象是現(xiàn)實世界中的一個實體,整個世界就是由各種各樣的對象構(gòu)成的,例如:一個人,一輛汽車,一個足球等等。類類是對象的模板,是對一組具有共同的屬性特征和行為特征的對象的抽象。例如:由一個個大學(xué)生構(gòu)成的“大學(xué)生”類,而其中的每一個大學(xué)生是“大學(xué)生”類的一個對象。一個類的所有對象都有相同的數(shù)據(jù)結(jié)構(gòu),并且共享相同的實現(xiàn)代碼。類和對象之間的關(guān)系是抽象和具體的關(guān)系。1.1.1類與對象類與對象是面向?qū)ο蟪绦蛟O(shè)計中最重要的概念1.1.2面向?qū)ο蟮奶匦悦嫦驅(qū)ο笙到y(tǒng)中最主要的特性是封裝性、繼承性和多態(tài)性。封裝性在面向?qū)ο蟪绦蛟O(shè)計中,數(shù)據(jù)的抽象是在確定類時強調(diào)對象的共同點而忽略了它們的不同點的結(jié)果。數(shù)據(jù)的封裝則是隱藏了數(shù)據(jù)的內(nèi)部實現(xiàn)細節(jié)的結(jié)果,將數(shù)據(jù)抽象的外部接口與內(nèi)部的實現(xiàn)細節(jié)清楚的分開。1.1.2面向?qū)ο蟮奶匦悦嫦驅(qū)ο笙到y(tǒng)中最主要的特性是封裝性繼承性以面向?qū)ο蟪绦蛟O(shè)計的觀點來看,繼承所表達的是對象與類之間的關(guān)系。這種關(guān)系使得某類對象之間可以繼承另外一類的特征和能力。繼承機制為程序提供了一種組織,構(gòu)造和重用類的手段。繼承使一個類(基類)的數(shù)據(jù)結(jié)構(gòu)和操作被另一個類即派生類重用,在派生類中只需描述其基類中沒有的數(shù)據(jù)和操作。這樣一來,就避免了公用代碼的重復(fù)開發(fā),減少了代碼和數(shù)據(jù)冗余。繼承性多態(tài)性面向?qū)ο蟪绦蛟O(shè)計中的多態(tài)性是指不同的對象收到相同的消息時所產(chǎn)生多種不同的行為方式。C++語言支持兩種多態(tài)性,即編譯時的多態(tài)性和運行時的多態(tài)性。編譯時的多態(tài)性通過重載來實現(xiàn)。運行時的多態(tài)性是通過虛函數(shù)來實現(xiàn)的,程序運行的到底是函數(shù)的那個版本,需要在運行時通過對象發(fā)送的消息來確定。多態(tài)性1.1.3面向?qū)ο蟪绦蛟O(shè)計語言我們要進行面向?qū)ο蟪绦蛟O(shè)計,必須使用面向?qū)ο蟪绦蛟O(shè)計語言。面向?qū)ο蟪绦蛟O(shè)計語言應(yīng)該具備以下特征:(1)它支持對象的概念(包括對象的所有特性,如封裝)(2)它要求對象屬于類(3)它提供繼承機制1.1.3面向?qū)ο蟪绦蛟O(shè)計語言我們要進行面向?qū)ο蟪绦蛟O(shè)計,1.2C++的起源和特點

1.2.1C++的起源1980年,美國貝爾實驗室的BjarneStroustrup博士在C語言的基礎(chǔ)上,開發(fā)出一種過程性與對象性相結(jié)合的程序設(shè)計語言。這種語言彌補了C語言存在的一些缺陷,并增加了面向?qū)ο蟮奶卣鳎?983年,這種語言正式定名為“C++”。1.2C++的起源和特點

“C”語言是C++語言的基礎(chǔ),最初用作UNIX操作系統(tǒng)的描述語言。C語言功能強、性能好,支持結(jié)構(gòu)化程序設(shè)計,又能像匯編語言那樣高效,伴隨著UNIX的成功和廣泛使用,誕生后立即獲得了廣泛的好評和支持。到了上個世紀(jì)80年代,C語言己經(jīng)廣為流行,成為一種應(yīng)用最廣泛的程序設(shè)計語言。但是C語言也存在著一些局限:(1)C的類型檢查機制相對較弱,使得程序中的一些錯誤不能在編譯時由編譯器檢查出來。(2)C缺乏支持代碼重用的語言結(jié)構(gòu)。(3)C不適合開發(fā)大型程序,當(dāng)程序的規(guī)模達到一定的程度時,程序員很難控制程序的復(fù)雜性?!癈”語言是C++語言的基礎(chǔ),最初用作UNIX操作系統(tǒng)的描述C++正是為了解決上述問題而設(shè)計的。C++繼承了C的精髓,如高效率、靈活性等,并增加了面向?qū)ο髾C制,彌補了C語言不支持代碼重用的不足,這對于開發(fā)大型的程序非常有效。C++成為一種既可用于表現(xiàn)過程模型,又可用于表現(xiàn)對象模型的優(yōu)秀的程序設(shè)計語言。C++正是為了解決上述問題而設(shè)計的。C++繼承了C的精髓,如1.2.2C++的特點C++語言現(xiàn)在得到了越來越廣泛的應(yīng)用,它除了繼承C語言的優(yōu)點之外,還擁有自己獨到的特點,最主要的有:(l)C++保持與C兼容,這就使許多C程序代碼不用修改就可以為C++所用,特別是一些用C編寫的庫函數(shù)和實用軟件可以用于C++中。(2)用C++語言編寫的程序可讀性更好,代碼結(jié)構(gòu)更為合理。(3)C++生成代碼的質(zhì)量高,運行效率僅比匯編代碼慢10%到20%。。1.2.2C++的特點(4)從開發(fā)時間、費用到形成的軟件的可重用性、可擴充性、可維護性和可靠性等方面有了很大的提高,使得大型的程序開發(fā)變得更加容易。(5)支持面向?qū)ο蟮臋C制。總之,目前C++的優(yōu)點正越來越得到人們的認可和推崇,它已經(jīng)成為被廣泛使用的通用程序設(shè)計語言。在國內(nèi)外使用和研究C++的人數(shù)正迅猛增加,優(yōu)秀的C++版本和配套的工具軟件也不斷涌現(xiàn)(4)從開發(fā)時間、費用到形成的軟件的可重用性、可擴充性、可1.3

C++源程序的構(gòu)成1.3.1C++程序的一般格式C++是C的一個超集,它幾乎保留了C的所有特性。下面通過一個求兩個數(shù)較大值的簡單的C++程序,來對C++程序的格式有一個初步的了解。1.3C++源程序的構(gòu)成1.3.1C++程序的一般格例1-1//max.cpp#include<iostream.h>intmax(inta,intb);//函數(shù)原型的說明voidmain()//主函數(shù){intx,y,temp;//定義二個整型變量cout<<"Entertwonumbers:"<<"\n";//提示用戶輸入兩個數(shù)cin>>x;//從鍵盤輸入變量x的值cin>>y;//從鍵盤輸入變量y的值temp=max(x,y);//調(diào)用max函數(shù),將得到的值給變量tempcout<<"Themaxis:"<<temp<<"\n";//輸出兩個數(shù)中較大的值}intmax(inta,intb)//定義max函數(shù),函數(shù)值為整型{intc;//定義一個整型變量if(a>b)c=a;elsec=b;//判斷兩個數(shù)的大小,將較大值賦給creturnc;//將c的值返回}例1-1本程序用來計算兩個整數(shù)中較大的值。它由兩個函數(shù)組成:主函數(shù)main()和被調(diào)用函數(shù)max()。函數(shù)max()的作用是判斷a與b的大小,把其中較大的值賦給變量c。return語句把c的值返回給主函數(shù)main()。返回值通過函數(shù)名max帶回到main()函數(shù)的調(diào)用處。程序的第1行是注釋語句,由"http://"開始,到行尾結(jié)束,這條注釋語句注明了本程序的文件名為max.cpp。本程序用來計算兩個整數(shù)中較大的值。它由兩個函數(shù)組成:主函數(shù)m程序的第2行是預(yù)編譯命令#include<iostream.h>,它的作用是,指示編譯程序把頭文件iostream.h包含進#include命令所在的源程序中。iostream.h是C++系統(tǒng)定義的一個頭文件,用于定義程序的輸入和輸出。第7行中出現(xiàn)的“cout”語句的作用是,在屏幕上顯示出字符串"Entertwonumbers:","\n"是換行符,即輸出上述信息后回車換行。程序的第2行是預(yù)編譯命令#include<iostream第8行和第9行中的“cin”的作用是分別輸入變量x和y的值,即執(zhí)行cin后,把從鍵盤輸入的兩個數(shù)值分別賦給變量x和y。第10行用來調(diào)用max函數(shù),調(diào)用時把實際參數(shù)x和y的值傳給函數(shù)add()中的形式參數(shù)a和b,執(zhí)行max函數(shù)后得到一個返回值(即max函數(shù)中的c),把這個值賦給temp,然后第11行輸出temp的值。程序運行情況如下:Entertwonumbers:3↙5↙Themaxis:5第8行和第9行中的“cin”的作用是分別輸入變量x和y的值,1.3.2C++程序的結(jié)構(gòu)特點通過上面的例子,我們可以看出C++程序的結(jié)構(gòu)有以下特點:(1)C++程序由一組函數(shù)組成,函數(shù)是構(gòu)成C++程序的基本單位。其中有且僅有一個名為main的函數(shù),稱為主函數(shù)。程序運行時第一個被執(zhí)行的函數(shù)必定是主函數(shù),不論它在程序的什么部位。被調(diào)用的函數(shù)可以是系統(tǒng)提供的庫函數(shù),也可以是用戶自己編寫的函數(shù)(例如上面例子中的函數(shù)max())。對于用戶自己定義的函數(shù),使用前應(yīng)提供“聲明”,如上面例子中的“intmax(inta,intb);”。1.3.2C++程序的結(jié)構(gòu)特點(2)C++函數(shù)由函數(shù)的說明部分和函數(shù)體兩部分組成。

函數(shù)的說明部分這部分包括函數(shù)名、函數(shù)類型、函數(shù)參數(shù)(形式參數(shù))及其類型。例如在例2-l中的max()函數(shù)的說明部分為:intmax(inta,intb)↑↑↑↑↑↑函數(shù)類型函數(shù)名形參類型形式參數(shù)形參類型形式參數(shù)

(2)C++函數(shù)由函數(shù)的說明部分和函數(shù)體兩部分組成。函數(shù)類型規(guī)定為函數(shù)返回值的類型,如int,float等。無返回值的函數(shù)是void類型。函數(shù)可以沒有參數(shù),但對于無參函數(shù),函數(shù)名后面的圓括號不能省略。函數(shù)體函數(shù)說明部分下面的花括號內(nèi)的部分稱為函數(shù)體。函數(shù)體中的內(nèi)容也就是函數(shù)的定義部分,主要是給出該函數(shù)的功能和執(zhí)行流程。函數(shù)類型規(guī)定為函數(shù)返回值的類型,如int,float等。無返(3)C++中每一個語句和數(shù)據(jù)定義必須以分號結(jié)束。一行程序內(nèi)可以寫多個語句,一個語句也可以分寫在多行上。說明:(l)C源程序文件擴展名為.c,而C++源程序文件擴展名為.cpp。(2)常用的C++版本,如VisualC++或borlandC++都帶有C和C++兩種編譯器,當(dāng)源程序文件擴展名為.c時,啟動C編譯器,當(dāng)源程序文件擴展名為.cpp時,啟動C++編譯器。(3)C++中每一個語句和數(shù)據(jù)定義必須以分號結(jié)束。一行程序內(nèi)1.4

C++在非面向?qū)ο蠓矫娴囊恍┨匦訡++是從C發(fā)展而來,因此C程序中大部分的特點和功能,在C++中仍可以使用。但C++語言還增加了很多C語言不具備的新特性,這些特性中除了“面向?qū)ο蟆钡母拍钔?,同時也包括一些非面向?qū)ο蟮男绿匦?。我們下面就來介紹這些非面向?qū)ο蟮男绿匦?,它們使得C++程序比C程序更簡潔,安全,強大。1.4C++在非面向?qū)ο蠓矫娴囊恍┨匦?.4.1注釋在C語言中,我們用"/*"及"*/"作為注釋分界符號,例如:/*Thisisjustatestforprogram*/C++語言保留了這種注釋方式,同時還增加了另一種注釋方式,該注釋以"http://"開始,到行末結(jié)束。例如:Temp=a+b;//Thisisjustacomment"http://…"注釋方式適合于注釋內(nèi)容不超過一行的注釋,使用很簡潔方便。1.4.1注釋1.4.2I/O流

C語言中進行輸入輸出,是依靠系統(tǒng)提供的函數(shù)來完成,如標(biāo)準(zhǔn)輸入和輸出函數(shù)scanf和printf。相比C語言,C++使用了更安全和強大的方法來進行輸入/輸出操作,也就是“流”的概念。例如:intI;doublef=8.5;cin>>i;cout<<f;這里的cin是標(biāo)準(zhǔn)輸入流,在程序中用于代表標(biāo)準(zhǔn)輸入設(shè)備,即鍵盤。運算符“>>”稱為“提取運算符”,表示將從標(biāo)準(zhǔn)輸入流(即鍵盤)讀取的數(shù)值傳送給右方指定的變量。也就是說,對于語句“cin>>i;”,用戶從鍵盤輸入的數(shù)值會自動地轉(zhuǎn)換為變量i的數(shù)據(jù)類型,并存入變量i內(nèi)。類似于C語言中的scanf(“%d”,&i);。運算符“>>”允許用戶連續(xù)輸入一連串?dāng)?shù)據(jù),例如:cin>>a>>b>>c;它將按順序從鍵盤上接收所要求的數(shù)據(jù),并存入對應(yīng)的變量中。兩個數(shù)據(jù)間用空白符(空格、回車或Tab鍵)分隔。1.4.2I/O流

C語言中進行輸入輸出,是依靠系統(tǒng)提供cout是標(biāo)準(zhǔn)輸出流,在程序中用于代表標(biāo)準(zhǔn)輸出設(shè)備,通常指屏幕。運算符“<<”稱為“插入運算符”,表示將右方變量的值顯示在屏幕上。例如,執(zhí)行下面的語句后:cout<<f;變量f的值將顯示在屏幕上。類似于C語言中的printf(“%f”,f);。f必須是基本數(shù)據(jù)類型,而不能是void類型。運算符“<<”允許用戶連續(xù)輸出一連串?dāng)?shù)據(jù),也可以輸出表達式的值,例如:cout<<a+b<<c;它將按照順序?qū)?shù)據(jù)依次輸出到屏幕上。cout是標(biāo)準(zhǔn)輸出流,在程序中用于代表標(biāo)準(zhǔn)輸出設(shè)備,通常指屏說明:(1)程序中如果需要使用cin或cout進行輸入/輸出操作時,則程序中必須嵌入頭文件iostream.h,否則編譯時要產(chǎn)生錯誤。下面是一個輸入輸出流的例子:例1-2#include<iostream.h>voidmain(){charname[20];cout<<"pleaseinputyourname:";cin>>name;cout<<name<<endl;}說明:(2)在C++程序中,我們?nèi)匀豢梢杂肅語言的傳統(tǒng)方式進行輸入輸出操作,即沿用stdio函數(shù)庫中的I/O函數(shù),如printf()函數(shù)、scanf()函數(shù)或其它的C輸入輸出函數(shù)。(3)在C中,常用"\n"實現(xiàn)換行,C++中增加了換行控制符endl,其作用與"\n"一樣。它的使用很方便,只要插入在輸出語句中需要換行的相應(yīng)位置即可。例如以下兩個語句的操作是等價的:cout<<"x="<<x<<endl;cout<<"x="<<x<<"\n";(2)在C++程序中,我們?nèi)匀豢梢杂肅語言的傳統(tǒng)方式進行輸入1.4.3靈活的局部變量說明在C語言中,所有的局部變量說明必須置于可執(zhí)行代碼段前面,而不允許局部變量的說明出現(xiàn)在可執(zhí)行代碼的中間或后面。如在C中,下面的程序段是不正確的:voidfunc(){intm;m=8;intn;n=4;}1.4.3靈活的局部變量說明C語言的編譯器在編譯時會指示有錯,因為其中變量定義語句“intn;”插在“m=8;”這句可執(zhí)行語句之后了。但在C++語言中,這是允許的,也就是說上面的程序編譯時不會出錯。C++允許在代碼塊中的任何地方對局部變量進行說明,該變量從說明點到該變量所在的最小分程序末的范圍內(nèi)有效。允許這種靈活的局部變量定義,對于程序員編寫較大型復(fù)雜的函數(shù)時非常有效。C語言的編譯器在編譯時會指示有錯,因為其中變量定義語句“in1.4.4const運算符

在C語言中,經(jīng)常使用宏定義,也就是#define來定義常量,例如:#definetimelO0;而C++語言提供了一種更靈活、更安全的方式來定義常量,即用const修飾符來定義常量。const型的常量相比#define的宏定義要靈活的多,同時提供了更強大的安全性。const可以創(chuàng)建有類型的常量,例如:constinttime=l00;這樣定義后的time的值將不能修改。這里要注意的是,用const定義的常量必須在聲明的時候初始化它的值,并且一旦初始化完成后,該值將不能再修改。1.4.4const運算符

在C語言中,經(jīng)常使用宏定義const也可以與指針一起使用,根據(jù)const出現(xiàn)的位置不同,分為幾種情況:(1)指向常量的指針,例如:constchar*name="stone",//聲明指向常量的指針這個語句的含義為:聲明一個名為name的指針變量,它指向一個字符型常量,初始化name指向字符串"stone"。使用const定義之后,不允許改變name指針?biāo)傅某A康闹?,因此以下語句是錯誤的:name[3]=’a’;但是可以改變name指針本身的值。例如下列語句是允許的:name="John";該語句賦給了指針另一個常量,即改變了name的值。const也可以與指針一起使用,根據(jù)const出現(xiàn)的位置不同(2)常指針常指針是指把指針本身,而不是它指向的對象聲明為常量,例如:char*constname="stone";//常指針(注意:const在語句中出現(xiàn)的位置與(1)中不同)這個語句的含義為:聲明一個名為name的指針變量,該指針是指向字符型數(shù)據(jù)的常指針,用"stone"的地址初始化該常指針。一個常指針一旦創(chuàng)建,則它指向的地址是固定的,也就是說指針本身將不能移動了。但是該地址的存儲內(nèi)容,也就是常指針?biāo)傅臄?shù)據(jù)可以改變,例如:name[3]=‘a(chǎn)';//合法

name="John";//出錯第一個語句改變了常指針?biāo)傅臄?shù)據(jù),這是允許的;但第二個語句要改變指針本身,這是不允許的。(2)常指針(3)指向常量的常指針這樣的指針本身不能改變,它所指向的值也不能改變。要聲明一個指向常量的常指針,二者都要聲明為const,例如:constchar*constname="stone";//指向常量的常指針這個語句的含義是:聲明了一個名為name的指針變量,它是一個指向字符型常量的常指針,用"stone"的地址初始化該指針。根據(jù)這個指針的定義,可以判斷出下面二個語句都是錯誤的:name[3]=‘a(chǎn)';//出錯,不能改變指針?biāo)傅闹祅ame="John";//出錯,不能改變指針本身(3)指向常量的常指針說明:(1)如果用const定義一個整型常量,關(guān)鍵字int可以省略。所以下面的兩行定義是等價的:constinttime=l00;consttime=l00;(2)與#define定義的常量有所不同,const定義的常量可以有自己的數(shù)據(jù)類型,這樣C++的編譯程序可以進行更加嚴(yán)格的類型檢查,也使得程序的安全性得到提高。因此建議用const取代#define定義常量。(3)函數(shù)參數(shù)也可以用const說明,用于保證實參在該函數(shù)內(nèi)部不被改動。說明:1.4.5內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)是C++新增加的機制,只要在函數(shù)說明前加上關(guān)鍵字"inline",則該函數(shù)就被聲明為內(nèi)聯(lián)函數(shù)。當(dāng)程序中出現(xiàn)對內(nèi)聯(lián)函數(shù)的調(diào)用時,C++編譯器將使用函數(shù)體中的代碼替代函數(shù)調(diào)用表達式,這樣可以加快代碼的執(zhí)行,減少調(diào)用開銷。下面的程序定義了一個內(nèi)聯(lián)函數(shù)。1.4.5內(nèi)聯(lián)函數(shù)例1-3#include<iostream.h>inlineintrect(intm)//定義函數(shù)rect為內(nèi)聯(lián)函數(shù){returnm*m;}voidmain(){for(inti=1;i<=3;i++)cout<<"i="<<i<<"area="<<rect(i)<<endl;}程序運行結(jié)果如下:i=1area=1i=2area=4i=3area=9例1-3說明:(1)內(nèi)聯(lián)函數(shù)在被調(diào)用之前必須進行函數(shù)定義,否則編譯器不知道應(yīng)該插入什么代碼。內(nèi)聯(lián)函數(shù)通常在main函數(shù)前面定義。(2)通常只有較短的函數(shù)才定義為內(nèi)聯(lián)函數(shù),對于較長的函數(shù),最好作為一般函數(shù)處理。因為若內(nèi)聯(lián)函數(shù)較長且調(diào)用太頻繁時,程序會加長很多。(3)使用內(nèi)聯(lián)函數(shù)也可以替代宏定義,內(nèi)聯(lián)函數(shù)具有宏定義的所有優(yōu)點而避免了宏定義的不安全性。(4)內(nèi)聯(lián)函數(shù)的定義中不允許使用循環(huán)語句和switch語句。注:后面將學(xué)習(xí)到,在C++的類體內(nèi)定義的成員函數(shù)都是內(nèi)聯(lián)函數(shù)。說明:1.4.6作用域運算::C++語言中,提供了一個作用域運算符“∷”,用來標(biāo)識某個變量的作用域。通常情況下如果程序中存在兩個同名變量,一個是全局的,另一個是局部的,那么局部變量在其作用域內(nèi)具有較高的優(yōu)先權(quán)。1.4.6作用域運算::例1-4#include<iostream.h>inttemp=5;//全局變量tempvoidmain(){inttemp;//局部變量temp…temp=50;cout<<"tempis"<<temp<<endl;//輸出的是局部變量temp的值}程序執(zhí)行結(jié)果如下:tempis50

例1-4在main()函數(shù)的輸出語句中的變量temp是main()函數(shù)內(nèi)定義的局部變量,因此打印的是局部變量temp的值50。如果希望在局部變量的作用域內(nèi)使用同名的全局變量,可以在該變量前加上作用域運算符“∷”,此時∷temp代表全局變量temp。在main()函數(shù)的輸出語句中的變量temp是main(請看下面的例子。

例1-5#include<iostream.h>intexam;voidmain(){intexam;exam=40;//局部變量exam::exam=10;//全局變量examcout<<"localexam="<<exam<<endl;cout<<"globalexam="<<::exam<<endl;}程序運行結(jié)果為:localexam=40globalexam=l0注:在后面會學(xué)習(xí)到,作用域運算符::在類的定義中,還可以用來標(biāo)識某個成員屬于哪個類。請看下面的例子。1.4.7函數(shù)的缺省參數(shù)函數(shù)的缺省參數(shù),也稱為默認參數(shù)。在C++中,對函數(shù)進行說明時,可以為一個或多個參數(shù)指定缺省的參數(shù)值,當(dāng)調(diào)用此函數(shù)時,如果沒有提供某個參數(shù)的實參值,C++會自動地以缺省值作為其相應(yīng)參數(shù)的值。1.4.7函數(shù)的缺省參數(shù)例如函數(shù)原型說明為:intfunc(intx=3,floaty=4.5);則x與y的缺省參數(shù)值分別為3與4.5。當(dāng)進行函數(shù)調(diào)用時,編譯器按從左向右的順序匹配實參和形參,若程序中沒有指定足夠的實參,則編譯器按順序用函數(shù)原型中的缺省參數(shù)值來補足所缺少的實參。例如以下的函數(shù)調(diào)用都是允許的:func(100,79.8);//x=100,y=79.8func(25);//x=25,y=4.5func();//x=3,y=4.5例如函數(shù)原型說明為:說明:(1)所有有缺省值的參數(shù),都必須出現(xiàn)在無缺省值的參數(shù)的右邊,否則會在函數(shù)調(diào)用時產(chǎn)生錯誤。例如下列函數(shù)說明是錯誤的:intfun(inti,intj=5,intk);因為在取缺省參數(shù)的intj=5后,不應(yīng)再說明非缺省參數(shù)intk。若改為:intfun(inti,intk,intj=5);則是正確的。

(2)在函數(shù)調(diào)用時,若某個參數(shù)省略,則其后的參數(shù)皆應(yīng)省略而采用缺省值。不允許某個參數(shù)省略后,再給其后的參數(shù)指定參數(shù)值。例如不允許出現(xiàn)以下調(diào)用func()函數(shù)的語句:func(,30.5);說明:1.4.8強制類型轉(zhuǎn)換在C語言中,如果要把一個整數(shù)(int)轉(zhuǎn)換為浮點數(shù)(float),要求使用如下的格式:inti=8;floatx=(float)i;在C++語言中,也支持這樣的語法格式,但提供了一種更為方便的方式,即將數(shù)據(jù)類型名稱作為函數(shù)名使用,使得類型轉(zhuǎn)換的執(zhí)行看起來好像調(diào)用了一個函數(shù)。如上面的語句可改寫成:inti=8;floatx=float(i);以上兩種方法在C++中都可以,但第2種方式更明晰和直觀。1.4.8強制類型轉(zhuǎn)換1.4.9函數(shù)重載

在C語言中,函數(shù)名必須是惟一的,也就是說不允許出現(xiàn)同名的函數(shù)。這種要求有時顯得比較麻煩,比如當(dāng)要求編寫求整數(shù)、浮點數(shù)和雙精度數(shù)的絕對值函數(shù)時,若用C語言來處理,必須編寫三個不同名的函數(shù),例如:abs(inti);//求整數(shù)的絕對值

fabs(floati);//求浮點數(shù)的絕對值

dabs(doublei);//求雙精度數(shù)的絕對值1.4.9函數(shù)重載

在C語言中,函數(shù)名必須是惟一的,也就當(dāng)使用這些函數(shù)求某個數(shù)的絕對值時,必須根據(jù)待求數(shù)的不同數(shù)據(jù)類型,調(diào)用合適的函數(shù),這樣,雖然這三個函數(shù)的功能是相同的,但用戶必須記住三個函數(shù)名。增加了用戶記憶的負擔(dān),并影響程序的可讀性。而在C++中,提供了函數(shù)重載的機制。重載的含義是允許兩個或者兩個以上的函數(shù)可以使用相同的函數(shù)名,只要保證函數(shù)參數(shù)的類型或個數(shù)不同。當(dāng)兩個或者兩個以上的函數(shù)共用一個函數(shù)名時,稱為函數(shù)重載。被重載的函數(shù)稱為重載函數(shù)。當(dāng)使用這些函數(shù)求某個數(shù)的絕對值時,必須根據(jù)待求數(shù)的不同數(shù)據(jù)類由于C++支持函數(shù)重載,上面三個求絕對值的函數(shù)可以起一個共同的名字abs,但它們的參數(shù)類型必須保持不同。當(dāng)用戶調(diào)用這些函數(shù)時,編譯器會自動根據(jù)實參的類型,來確定到底調(diào)用哪個重載函數(shù)。因此用戶使用求絕對值的函數(shù)時,只需記住一個abs函數(shù)即可,其余的就不需要操心了。上述例子我們可以用下面的程序來實現(xiàn)。由于C++支持函數(shù)重載,上面三個求絕對值的函數(shù)可以起一個共同例1-6#include<iostream.h>intabs(inti){if(i>0)returni;elsereturn–i;}floatabs(floati){if(i>0)returni;elsereturn–i;}doubleabs(doublei){if(i>0)returni;elsereturn–i;}

voidmain(){inti=-8;floatf=-9.5;doubled=12.54;cout<<i<<abs(i)<<endl;cout<<f<<abs(f)<<endl;cout<<d<<abs(d)<<endl;}程序運行結(jié)果如下:-88-9.59.512.5412.54例1-6在main()中三次調(diào)用了abs()函數(shù),實際上是調(diào)用了三個不同的重載版本。系統(tǒng)根據(jù)傳送的不同實參的類型來決定調(diào)用哪個重載函數(shù)。例如當(dāng)調(diào)用abs(i)時,因為i為整型變量,所以系統(tǒng)將調(diào)用求整數(shù)絕對值的重載版本intabs(inti)??梢?,利用重載概念,用戶在調(diào)用函數(shù)時,書寫非常方便。在main()中三次調(diào)用了abs()函數(shù),實際上是調(diào)用了我們再通過一個求多邊形周長的函數(shù)定義,來看一個參數(shù)個數(shù)不同的重載函數(shù)例子:

例1-7#include<iostream.h>intlength(intx,inty,intz)//求三角形的周長

{returnx+y+z;}intlength(intx,inty,intz,intm)//求四邊形的周長{returnx+y+z+m;}voidmain(){inta=3,b=5,c=7,d=8;cout<<”Thelengthoftrigleis:”<<length(a,b,c)<<endl;cout<<”Thelengthoffouris:”<<length(a,b,c,d)<<endl;}程序運行結(jié)果如下:Thelengthoftrigleis:15Thelengthoffouris:23我們再通過一個求多邊形周長的函數(shù)定義,來看一個參數(shù)個數(shù)不同的

函數(shù)length()被重載,兩個重載函數(shù)的參數(shù)個數(shù)不同。編譯程序根據(jù)實參的個數(shù)目決定調(diào)用哪一個函數(shù)。

說明:(1)函數(shù)的返回類型不同不能作為函數(shù)重載的條件,重載函數(shù)必須保證參數(shù)個數(shù)或參數(shù)類型不同,否則編譯程序?qū)o法確定調(diào)用哪一個重載版本。例如:intlength(intx,inty);doublelength(intx,inty);雖然這兩個函數(shù)的返回類型不同,但參數(shù)個數(shù)和類型完全相同,因此編譯程序?qū)o法區(qū)分這兩個函數(shù)。

函數(shù)length()被重載,兩個重載函數(shù)的參數(shù)個數(shù)不同。(2)一般而言,重載函數(shù)應(yīng)執(zhí)行相同或類似的功能,例如abs()函數(shù)一般用來返回一個數(shù)的絕對值,如果重載abs()函數(shù)而改變它的功能,比如讓它計算一個數(shù)的開方,則雖然語法上沒錯,但是不恰當(dāng),也容易讓讀程序的人產(chǎn)生誤解,我們應(yīng)該在編程中注意避免。(2)一般而言,重載函數(shù)應(yīng)執(zhí)行相同或類似的功能,例如abs(1.4.10用new和delete分配動態(tài)內(nèi)存動態(tài)內(nèi)存是在程序運行時(而非編譯時)分配的內(nèi)存空間,C語言提供了兩個函數(shù)malloc()和free()分別用于申請和釋放動態(tài)內(nèi)存。而C++提供了一對運算符new和delete,分別用來進行動態(tài)內(nèi)存的申請和釋放。相比malloc()和free()函數(shù),new和delete的功能要更為強大和安全,使用也更加方便。1.4.10用new和delete分配動態(tài)內(nèi)存new用于內(nèi)存分配,它其的使用形式為:P=newtype;其中,type是一個數(shù)據(jù)類型名,P是指向該數(shù)據(jù)類型的指針。new從動態(tài)內(nèi)存中為程序分配一塊sizeof(type)字節(jié)大小的內(nèi)存,然后返回一個指向該內(nèi)存首地址的指針,并將該指針的值賦值給指針P。運算符delete用于釋放new分配的存儲空間。它的使用形式一般為:deleteP;該語句執(zhí)行后,P指針指向的動態(tài)內(nèi)存將會得到釋放。new用于內(nèi)存分配,它其的使用形式為:下面是new和delete操作的一個簡例:

例1-8#include<iostream.h>voidmain(){int*p;//聲明一個整型指針變量pp=newint;//申請一塊存儲整數(shù)的動態(tài)內(nèi)存,并將該內(nèi)存//首地址賦給p*p=10;cout<<*p<<endl;deletep;//釋放p指向的動態(tài)內(nèi)存間}程序執(zhí)行結(jié)果如下:10下面是new和delete操作的一個簡例:該程序定義了一個整型指針變量p,然后用new為其分配了一塊動態(tài)內(nèi)存,p指向這個內(nèi)存塊。然后在這內(nèi)存塊中賦予初值10,并將其值輸出。最后通過delete釋放p指向的存儲空間。使用new可以為數(shù)組動態(tài)分配內(nèi)存空間,例如:int*p=newint[10];這時new為具有10個元素的整型數(shù)組分配動態(tài)內(nèi)存空間,并將首地址賦給了指針p。釋放動態(tài)分配的數(shù)組存儲區(qū)時,必須在指針名前加上“[]”表示釋放的是數(shù)組空間,如:delete[]p;注:在[]內(nèi)不需要標(biāo)明數(shù)組的大小。該程序定義了一個整型指針變量p,然后用new為其分配了一塊動new和delete相比malloc()和free(),有以下幾個優(yōu)點:(1)new可以自動計算所要分配內(nèi)存的類型的大小,而不必使用sizeof()來計算所需要的字節(jié)數(shù),減少了發(fā)生錯誤的可能性,也為程序員提供了便利。(2)new能夠自動返回正確的指針類型,不必對返回指針進行類型轉(zhuǎn)換。(3)new和delete可以被重載,由用戶自定義內(nèi)存分配方式。(4)使用new申請動態(tài)內(nèi)存時,如果當(dāng)前沒有足夠的內(nèi)存滿足申請要求,new將返回空指針(NULL)。為了防止程序出錯,提高程序的健壯性,通常要對內(nèi)存的動態(tài)分配是否成功進行檢查。請看以下例子。new和delete相比malloc()和free(),例1-9#include<iostream.h>voidmain(){int*q;q=newint;if(q==NULL)cout<<"memorynotenough"<<endl;*q=20;cout<<*q<<endl;deleteq;}若動態(tài)分配內(nèi)存失敗,程序?qū)⒃谄聊簧巷@示"memorynotenough"。例1-91.4.11引用

引用是C++語言中的新概念,其功能類似于為變量起一個別名,主要應(yīng)用于函數(shù)參數(shù)及函數(shù)的返回類型。

1.引用的定義用“&”來定義引用,例如:inti=5;int&j=i;//聲明j是i的引用上面的程序,創(chuàng)建了一個整型變量i的引用j,j實際上就相當(dāng)于i的別名,一旦被聲明,就和i占用相同的內(nèi)存。當(dāng)i變化時,j也隨之變化,反之亦然。換句話說,一旦定義目標(biāo)的一個引用,則引用和目標(biāo)就成為了同一個東西,對其中任何一個進行修改,都等于對另一個進行修改。1.4.11引用

引用是C++語言中的新概念,其功能類似例1-10#include<iostream.h>voidmain(){inti;int&j=i;i=15;cout<<"i="<<i<<"j="<<j<<"\n";j=40;cout<<"i="<<i<<"j="<<j<<"\n";cout<<"Addressofi"<<&i<<"\n";cout<<"Addressofj"<<&j<<"\n";}執(zhí)行結(jié)果:i=15j=15i=40j=40Addressofii0x0012FF7CAddressofji0x0012FF7C我們由程序的運行結(jié)果可以看出,i和j的值始終是一樣的,保持同步更新,且占用內(nèi)存中的同一地址。例1-10說明:(1)定義引用時,必須立即對它進行初始化。例如下述定義是錯誤的:inti;int&j;//錯誤

j=i;為引用提供的初始值,可以是一個變量或另一個引用。例如:inti=5;int&j1=i;int&j2=j1;這樣定義后,變量i將有兩個別名:j1和j2。

(2)引用一旦建立,就不可重新賦值,不能讓一個引用再作為另一個變量的別名,例如:inti,k;int&j=i;j=&k;//錯誤C++概述教學(xué)講解課件

(3)不能建立引用的數(shù)組,例如:intb[5];int&b1[5]=b;//錯誤(4)不能建立空引用int&i=NULL;//錯誤(5)不能建立“指向引用的指針”或“引用的引用”

int&*p;//錯誤

int&&r;//錯誤(3)不能建立引用的數(shù)組,例如:2.引用作為函數(shù)參數(shù)引用的一個主要用途,是用作函數(shù)的參數(shù)。通常函數(shù)參數(shù)的傳遞有三種方式“值傳遞”,“指針傳遞”,“引用傳遞”。引用傳遞參數(shù)的功能和指針傳遞很像,而形式類似于值傳遞,可讀性更好。下面我們通過一個例子看看引用傳遞和指針傳遞的區(qū)別:2.引用作為函數(shù)參數(shù)例1-11#include<iostream.h>voidswap(int*m,int*n)//用于交換兩個參數(shù)的值{inttemp;temp=*m;*m=*n;*n=temp;}voidmain(){inta=5,b=10;cout<<"a="<<a<<"b="<<b<<endl;swap(&a,&b);cout<<"a="<<a<<"b="<<b<<endl;}程序運行的結(jié)果為:a=5b=l0a=l0b=5采用指針傳遞參數(shù)的方法,調(diào)用函數(shù)swap()后,a和b的值被交換了。例1-11swap(&a,&b);再來看看用引用傳遞參數(shù)的例子:

例1-12#include<iostream.h>voidswap(int&m,int&n){inttemp;temp=m;m=n;n=temp;}voidmain(){inta=5,b=10;cout<<"a="<<a<<"b="<<b<<endl;swap(a,b);cout<<"a="<<a<<"b="<<b<<endl;}程序運行結(jié)果為:a=5b=10a=l0b=5當(dāng)程序中調(diào)用函數(shù)swap()時,實參a和b分別對引用m和n進行初始化。根據(jù)引用的定義,在swap()中,對m和n的訪問就是對a和b的訪問,所以函數(shù)swap()的定義中修改了m和n的值,也就改變了main()中變量a和b的值。由此例可以看出,引用傳遞和指針傳遞實現(xiàn)的功能一樣,但其語法更清楚簡單。再來看看用引用傳遞參數(shù)的例子:程序運行結(jié)果為:3.引用返回值通常情況下,一個函數(shù)調(diào)用是不能出現(xiàn)在賦值運算符左邊的。引用可以作為函數(shù)的返回值,如果一個函數(shù)的返回類型是一個引用的話,則該函數(shù)的調(diào)用可以出現(xiàn)在賦值運算符的左邊。例1-13#include<iostream.h>inta[]={1,3,5,7,9};int&func(inti)//定義返回引用的函數(shù){returna[i];}voidmain(){func(2)=6;//將a[2]重新賦值為6cout<<func(2)<<endl;}程序運行結(jié)果為:63.引用返回值70Thankyou!70Thankyou!C++概述

知識點面向?qū)ο蟪绦蛟O(shè)計的基本概念C++的起源和特點C++源程序的構(gòu)成C++在非面向?qū)ο蠓矫娴囊恍┨匦噪y點面向?qū)ο蟮母拍頒++源程序的構(gòu)成C++在非面向?qū)ο蠓矫娴奶匦訡++概述

要求掌握:面向?qū)ο蟮母拍頒++程序的格式與結(jié)構(gòu)特點了解:類和對象的概念面向?qū)ο蟮奶匦訡++在非面向?qū)ο蠓矫娴囊恍┨匦訡++概述教學(xué)講解課件

或許你已經(jīng)學(xué)過C語言或Pascal語言,能用這些語言編寫簡單程序,解決某些具體問題。但在實際應(yīng)用中,特別是要編制一些比較大型的程序或系統(tǒng)軟件時,就會感到僅有這些是不夠的,需要有新的設(shè)計方法來提高編程能力,以便適應(yīng)軟件開發(fā)規(guī)模日益龐大的趨勢。20世紀(jì)90年代以來,在計算機軟件行業(yè),面向?qū)ο蟪绦蛟O(shè)計思想方法已被越來越多的軟件設(shè)計人員所接受。它是目前最先進的計算機程序設(shè)計思想和理念,這種新的思想更接近人的思維活動,利用這種思想和方法進行程序設(shè)計時,可以極大地提高編程能力,減少軟件維護的開銷。C++能完美地體現(xiàn)面向?qū)ο蟮母鞣N特性?;蛟S你已經(jīng)學(xué)過C語言或Pascal語言,能用1.1面向?qū)ο蟪绦蛟O(shè)計的基本概念

面向?qū)ο蟮脑O(shè)計思想是在原來結(jié)構(gòu)化程序方法基礎(chǔ)上的一個質(zhì)的飛躍,是一種新的程序設(shè)計理念,是軟件開發(fā)的一種方法,其本質(zhì)是把數(shù)據(jù)和處理數(shù)據(jù)的過程當(dāng)成一個整體——對象。面向?qū)ο蟪绦虻闹饕Y(jié)構(gòu)特點是:一,程序一般由類的定義和類的使用兩部分組成,在主程序中定義各對象并規(guī)定它們之間傳遞消息的規(guī)律;二,程序中的一切操作都是通過面向?qū)ο蟀l(fā)送消息來實現(xiàn)的,對象接受到消息后,啟動有關(guān)方法完成相應(yīng)的操作。面向?qū)ο笤O(shè)計的最大優(yōu)點就是軟件具有可重用性。當(dāng)人們對軟件系統(tǒng)的要求有所改變時,并不需要程序員做大量的工作就能使系統(tǒng)做相應(yīng)的變化。1.1面向?qū)ο蟪绦蛟O(shè)計的基本概念

面向?qū)ο蟮脑O(shè)計思想是在原1.1.1類與對象類與對象是面向?qū)ο蟪绦蛟O(shè)計中最重要的概念,如果要掌握面向?qū)ο蟪绦蛟O(shè)計技術(shù),首先必要很好的理解這兩個概念。對象從概念上講,對象代表著正在創(chuàng)建的系統(tǒng)中的一個實體。在日常生活中,對象就是我們認識世界的基本單元,對象是現(xiàn)實世界中的一個實體,整個世界就是由各種各樣的對象構(gòu)成的,例如:一個人,一輛汽車,一個足球等等。類類是對象的模板,是對一組具有共同的屬性特征和行為特征的對象的抽象。例如:由一個個大學(xué)生構(gòu)成的“大學(xué)生”類,而其中的每一個大學(xué)生是“大學(xué)生”類的一個對象。一個類的所有對象都有相同的數(shù)據(jù)結(jié)構(gòu),并且共享相同的實現(xiàn)代碼。類和對象之間的關(guān)系是抽象和具體的關(guān)系。1.1.1類與對象類與對象是面向?qū)ο蟪绦蛟O(shè)計中最重要的概念1.1.2面向?qū)ο蟮奶匦悦嫦驅(qū)ο笙到y(tǒng)中最主要的特性是封裝性、繼承性和多態(tài)性。封裝性在面向?qū)ο蟪绦蛟O(shè)計中,數(shù)據(jù)的抽象是在確定類時強調(diào)對象的共同點而忽略了它們的不同點的結(jié)果。數(shù)據(jù)的封裝則是隱藏了數(shù)據(jù)的內(nèi)部實現(xiàn)細節(jié)的結(jié)果,將數(shù)據(jù)抽象的外部接口與內(nèi)部的實現(xiàn)細節(jié)清楚的分開。1.1.2面向?qū)ο蟮奶匦悦嫦驅(qū)ο笙到y(tǒng)中最主要的特性是封裝性繼承性以面向?qū)ο蟪绦蛟O(shè)計的觀點來看,繼承所表達的是對象與類之間的關(guān)系。這種關(guān)系使得某類對象之間可以繼承另外一類的特征和能力。繼承機制為程序提供了一種組織,構(gòu)造和重用類的手段。繼承使一個類(基類)的數(shù)據(jù)結(jié)構(gòu)和操作被另一個類即派生類重用,在派生類中只需描述其基類中沒有的數(shù)據(jù)和操作。這樣一來,就避免了公用代碼的重復(fù)開發(fā),減少了代碼和數(shù)據(jù)冗余。繼承性多態(tài)性面向?qū)ο蟪绦蛟O(shè)計中的多態(tài)性是指不同的對象收到相同的消息時所產(chǎn)生多種不同的行為方式。C++語言支持兩種多態(tài)性,即編譯時的多態(tài)性和運行時的多態(tài)性。編譯時的多態(tài)性通過重載來實現(xiàn)。運行時的多態(tài)性是通過虛函數(shù)來實現(xiàn)的,程序運行的到底是函數(shù)的那個版本,需要在運行時通過對象發(fā)送的消息來確定。多態(tài)性1.1.3面向?qū)ο蟪绦蛟O(shè)計語言我們要進行面向?qū)ο蟪绦蛟O(shè)計,必須使用面向?qū)ο蟪绦蛟O(shè)計語言。面向?qū)ο蟪绦蛟O(shè)計語言應(yīng)該具備以下特征:(1)它支持對象的概念(包括對象的所有特性,如封裝)(2)它要求對象屬于類(3)它提供繼承機制1.1.3面向?qū)ο蟪绦蛟O(shè)計語言我們要進行面向?qū)ο蟪绦蛟O(shè)計,1.2C++的起源和特點

1.2.1C++的起源1980年,美國貝爾實驗室的BjarneStroustrup博士在C語言的基礎(chǔ)上,開發(fā)出一種過程性與對象性相結(jié)合的程序設(shè)計語言。這種語言彌補了C語言存在的一些缺陷,并增加了面向?qū)ο蟮奶卣鳎?983年,這種語言正式定名為“C++”。1.2C++的起源和特點

“C”語言是C++語言的基礎(chǔ),最初用作UNIX操作系統(tǒng)的描述語言。C語言功能強、性能好,支持結(jié)構(gòu)化程序設(shè)計,又能像匯編語言那樣高效,伴隨著UNIX的成功和廣泛使用,誕生后立即獲得了廣泛的好評和支持。到了上個世紀(jì)80年代,C語言己經(jīng)廣為流行,成為一種應(yīng)用最廣泛的程序設(shè)計語言。但是C語言也存在著一些局限:(1)C的類型檢查機制相對較弱,使得程序中的一些錯誤不能在編譯時由編譯器檢查出來。(2)C缺乏支持代碼重用的語言結(jié)構(gòu)。(3)C不適合開發(fā)大型程序,當(dāng)程序的規(guī)模達到一定的程度時,程序員很難控制程序的復(fù)雜性。“C”語言是C++語言的基礎(chǔ),最初用作UNIX操作系統(tǒng)的描述C++正是為了解決上述問題而設(shè)計的。C++繼承了C的精髓,如高效率、靈活性等,并增加了面向?qū)ο髾C制,彌補了C語言不支持代碼重用的不足,這對于開發(fā)大型的程序非常有效。C++成為一種既可用于表現(xiàn)過程模型,又可用于表現(xiàn)對象模型的優(yōu)秀的程序設(shè)計語言。C++正是為了解決上述問題而設(shè)計的。C++繼承了C的精髓,如1.2.2C++的特點C++語言現(xiàn)在得到了越來越廣泛的應(yīng)用,它除了繼承C語言的優(yōu)點之外,還擁有自己獨到的特點,最主要的有:(l)C++保持與C兼容,這就使許多C程序代碼不用修改就可以為C++所用,特別是一些用C編寫的庫函數(shù)和實用軟件可以用于C++中。(2)用C++語言編寫的程序可讀性更好,代碼結(jié)構(gòu)更為合理。(3)C++生成代碼的質(zhì)量高,運行效率僅比匯編代碼慢10%到20%。。1.2.2C++的特點(4)從開發(fā)時間、費用到形成的軟件的可重用性、可擴充性、可維護性和可靠性等方面有了很大的提高,使得大型的程序開發(fā)變得更加容易。(5)支持面向?qū)ο蟮臋C制??傊壳癈++的優(yōu)點正越來越得到人們的認可和推崇,它已經(jīng)成為被廣泛使用的通用程序設(shè)計語言。在國內(nèi)外使用和研究C++的人數(shù)正迅猛增加,優(yōu)秀的C++版本和配套的工具軟件也不斷涌現(xiàn)(4)從開發(fā)時間、費用到形成的軟件的可重用性、可擴充性、可1.3

C++源程序的構(gòu)成1.3.1C++程序的一般格式C++是C的一個超集,它幾乎保留了C的所有特性。下面通過一個求兩個數(shù)較大值的簡單的C++程序,來對C++程序的格式有一個初步的了解。1.3C++源程序的構(gòu)成1.3.1C++程序的一般格例1-1//max.cpp#include<iostream.h>intmax(inta,intb);//函數(shù)原型的說明voidmain()//主函數(shù){intx,y,temp;//定義二個整型變量cout<<"Entertwonumbers:"<<"\n";//提示用戶輸入兩個數(shù)cin>>x;//從鍵盤輸入變量x的值cin>>y;//從鍵盤輸入變量y的值temp=max(x,y);//調(diào)用max函數(shù),將得到的值給變量tempcout<<"Themaxis:"<<temp<<"\n";//輸出兩個數(shù)中較大的值}intmax(inta,intb)//定義max函數(shù),函數(shù)值為整型{intc;//定義一個整型變量if(a>b)c=a;elsec=b;//判斷兩個數(shù)的大小,將較大值賦給creturnc;//將c的值返回}例1-1本程序用來計算兩個整數(shù)中較大的值。它由兩個函數(shù)組成:主函數(shù)main()和被調(diào)用函數(shù)max()。函數(shù)max()的作用是判斷a與b的大小,把其中較大的值賦給變量c。return語句把c的值返回給主函數(shù)main()。返回值通過函數(shù)名max帶回到main()函數(shù)的調(diào)用處。程序的第1行是注釋語句,由"http://"開始,到行尾結(jié)束,這條注釋語句注明了本程序的文件名為max.cpp。本程序用來計算兩個整數(shù)中較大的值。它由兩個函數(shù)組成:主函數(shù)m程序的第2行是預(yù)編譯命令#include<iostream.h>,它的作用是,指示編譯程序把頭文件iostream.h包含進#include命令所在的源程序中。iostream.h是C++系統(tǒng)定義的一個頭文件,用于定義程序的輸入和輸出。第7行中出現(xiàn)的“cout”語句的作用是,在屏幕上顯示出字符串"Entertwonumbers:","\n"是換行符,即輸出上述信息后回車換行。程序的第2行是預(yù)編譯命令#include<iostream第8行和第9行中的“cin”的作用是分別輸入變量x和y的值,即執(zhí)行cin后,把從鍵盤輸入的兩個數(shù)值分別賦給變量x和y。第10行用來調(diào)用max函數(shù),調(diào)用時把實際參數(shù)x和y的值傳給函數(shù)add()中的形式參數(shù)a和b,執(zhí)行max函數(shù)后得到一個返回值(即max函數(shù)中的c),把這個值賦給temp,然后第11行輸出temp的值。程序運行情況如下:Entertwonumbers:3↙5↙Themaxis:5第8行和第9行中的“cin”的作用是分別輸入變量x和y的值,1.3.2C++程序的結(jié)構(gòu)特點通過上面的例子,我們可以看出C++程序的結(jié)構(gòu)有以下特點:(1)C++程序由一組函數(shù)組成,函數(shù)是構(gòu)成C++程序的基本單位。其中有且僅有一個名為main的函數(shù),稱為主函數(shù)。程序運行時第一個被執(zhí)行的函數(shù)必定是主函數(shù),不論它在程序的什么部位。被調(diào)用的函數(shù)可以是系統(tǒng)提供的庫函數(shù),也可以是用戶自己編寫的函數(shù)(例如上面例子中的函數(shù)max())。對于用戶自己定義的函數(shù),使用前應(yīng)提供“聲明”,如上面例子中的“intmax(inta,intb);”。1.3.2C++程序的結(jié)構(gòu)特點(2)C++函數(shù)由函數(shù)的說明部分和函數(shù)體兩部分組成。

函數(shù)的說明部分這部分包括函數(shù)名、函數(shù)類型、函數(shù)參數(shù)(形式參數(shù))及其類型。例如在例2-l中的max()函數(shù)的說明部分為:intmax(inta,intb)↑↑↑↑↑↑函數(shù)類型函數(shù)名形參類型形式參數(shù)形參類型形式參數(shù)

(2)C++函數(shù)由函數(shù)的說明部分和函數(shù)體兩部分組成。函數(shù)類型規(guī)定為函數(shù)返回值的類型,如int,float等。無返回值的函數(shù)是void類型。函數(shù)可以沒有參數(shù),但對于無參函數(shù),函數(shù)名后面的圓括號不能省略。函數(shù)體函數(shù)說明部分下面的花括號內(nèi)的部分稱為函數(shù)體。函數(shù)體中的內(nèi)容也就是函數(shù)的定義部分,主要是給出該函數(shù)的功能和執(zhí)行流程。函數(shù)類型規(guī)定為函數(shù)返回值的類型,如int,float等。無返(3)C++中每一個語句和數(shù)據(jù)定義必須以分號結(jié)束。一行程序內(nèi)可以寫多個語句,一個語句也可以分寫在多行上。說明:(l)C源程序文件擴展名為.c,而C++源程序文件擴展名為.cpp。(2)常用的C++版本,如VisualC++或borlandC++都帶有C和C++兩種編譯器,當(dāng)源程序文件擴展名為.c時,啟動C編譯器,當(dāng)源程序文件擴展名為.cpp時,啟動C++編譯器。(3)C++中每一個語句和數(shù)據(jù)定義必須以分號結(jié)束。一行程序內(nèi)1.4

C++在非面向?qū)ο蠓矫娴囊恍┨匦訡++是從C發(fā)展而來,因此C程序中大部分的特點和功能,在C++中仍可以使用。但C++語言還增加了很多C語言不具備的新特性,這些特性中除了“面向?qū)ο蟆钡母拍钔?,同時也包括一些非面向?qū)ο蟮男绿匦?。我們下面就來介紹這些非面向?qū)ο蟮男绿匦?,它們使得C++程序比C程序更簡潔,安全,強大。1.4C++在非面向?qū)ο蠓矫娴囊恍┨匦?.4.1注釋在C語言中,我們用"/*"及"*/"作為注釋分界符號,例如:/*Thisisjustatestforprogram*/C++語言保留了這種注釋方式,同時還增加了另一種注釋方式,該注釋以"http://"開始,到行末結(jié)束。例如:Temp=a+b;//Thisisjustacomment"http://…"注釋方式適合于注釋內(nèi)容不超過一行的注釋,使用很簡潔方便。1.4.1注釋1.4.2I/O流

C語言中進行輸入輸出,是依靠系統(tǒng)提供的函數(shù)來完成,如標(biāo)準(zhǔn)輸入和輸出函數(shù)scanf和printf。相比C語言,C++使用了更安全和強大的方法來進行輸入/輸出操作,也就是“流”的概念。例如:intI;doublef=8.5;cin>>i;cout<<f;這里的cin是標(biāo)準(zhǔn)輸入流,在程序中用于代表標(biāo)準(zhǔn)輸入設(shè)備,即鍵盤。運算符“>>”稱為“提取運算符”,表示將從標(biāo)準(zhǔn)輸入流(即鍵盤)讀取的數(shù)值傳送給右方指定的變量。也就是說,對于語句“cin>>i;”,用戶從鍵盤輸入的數(shù)值會自動地轉(zhuǎn)換為變量i的數(shù)據(jù)類型,并存入變量i內(nèi)。類似于C語言中的scanf(“%d”,&i);。運算符“>>”允許用戶連續(xù)輸入一連串?dāng)?shù)據(jù),例如:cin>>a>>b>>c;它將按順序從鍵盤上接收所要求的數(shù)據(jù),并存入對應(yīng)的變量中。兩個數(shù)據(jù)間用空白符(空格、回車或Tab鍵)分隔。1.4.2I/O流

C語言中進行輸入輸出,是依靠系統(tǒng)提供cout是標(biāo)準(zhǔn)輸出流,在程序中用于代表標(biāo)準(zhǔn)輸出設(shè)備,通常指屏幕。運算符“<<”稱為“插入運算符”,表示將右方變量的值顯示在屏幕上。例如,執(zhí)行下面的語句后:cout<<f;變量f的值將顯示在屏幕上。類似于C語言中的printf(“%f”,f);。f必須是基本數(shù)據(jù)類型,而不能是void類型。運算符“<<”允許用戶連續(xù)輸出一連串?dāng)?shù)據(jù),也可以輸出表達式的值,例如:cout<<a+b<<c;它將按照順序?qū)?shù)據(jù)依次輸出到屏幕上。cout是標(biāo)準(zhǔn)輸出流,在程序中用于代表標(biāo)準(zhǔn)輸出設(shè)備,通常指屏說明:(1)程序中如果需要使用cin或cout進行輸入/輸出操作時,則程序中必須嵌入頭文件iostream.h,否則編譯時要產(chǎn)生錯誤。下面是一個輸入輸出流的例子:例1-2#include<iostream.h>voidmain(){charname[20];cout<<"pleaseinputyourname:";cin>>name;cout<<name<<endl;}說明:(2)在C++程序中,我們?nèi)匀豢梢杂肅語言的傳統(tǒng)方式進行輸入輸出操作,即沿用stdio函數(shù)庫中的I/O函數(shù),如printf()函數(shù)、scanf()函數(shù)或其它的C輸入輸出函數(shù)。(3)在C中,常用"\n"實現(xiàn)換行,C++中增加了換行控制符endl,其作用與"\n"一樣。它的使用很方便,只要插入在輸出語句中需要換行的相應(yīng)位置即可。例如以下兩個語句的操作是等價的:cout<<"x="<<x<<endl;cout<<"x="<<x<<"\n";(2)在C++程序中,我們?nèi)匀豢梢杂肅語言的傳統(tǒng)方式進行輸入1.4.3靈活的局部變量說明在C語言中,所有的局部變量說明必須置于可執(zhí)行代碼段前面,而不允許局部變量的說明出現(xiàn)在可執(zhí)行代碼的中間或后面。如在C中,下面的程序段是不正確的:voidfunc(){intm;m=8;intn;n=4;}1.4.3靈活的局部變量說明C語言的編譯器在編譯時會指示有錯,因為其中變量定義語句“intn;”插在“m=8;”這句可執(zhí)行語句之后了。但在C++語言中,這是允許的,也就是說上面的程序編譯時不會出錯。C++允許在代碼塊中的任何地方對局部變量進行說明,該變量從說明點到該變量所在的最小分程序末的范圍內(nèi)有效。允許這種靈活的局部變量定義,對于程序員編寫較大型復(fù)雜的函數(shù)時非常有效。C語言的編譯器在編譯時會指示有錯,因為其中變量定義語句“in1.4.4const運算符

在C語言中,經(jīng)常使用宏定義,也就是#define來定義常量,例如:#definetimelO0;而C++語言提供了一種更靈活、更安全的方式來定義常量,即用const修飾符來定義常量。const型的常量相比#define的宏定義要靈活的多,同時提供了更強大的安全性。const可以創(chuàng)建有類型的常量,例如:constinttime=l00;這樣定義后的time的值將不能修改。這里要注意的是,用const定義的常量必須在聲明的時候初始化它的值,并且一旦初始化完成后,該值將不能再修改。1.4.4const運算符

在C語言中,經(jīng)常使用宏定義const也可以與指針一起使用,根據(jù)const出現(xiàn)的位置不同,分為幾種情況:(1)指向常量的指針,例如:constchar*name="stone",//聲明指向常量的指針這個語句的含義為:聲明一個名為name的指針變量,它指向一個字符型常量,初始化name指向字符串"stone"。使用const定義之后,不允許改變name指針?biāo)傅某A康闹担虼艘韵抡Z句是錯誤的:name[3]=’a’;但是可以改變name指針本身的值。例如下列語句是允許的:name="John";該語句賦給了指針另一個常量,即改變了name的值。const也可以與指針一起使用,根據(jù)const出現(xiàn)的位置不同(2)常指針常指針是指把指針本身,而不是它指向的對象聲明為常量,例如:char*constname="stone";//常指針(注意:const在語句中出現(xiàn)的位置與(1)中不同)這個語句的含義為:聲明一個名為name的指針變量,該指針是指向字符型數(shù)據(jù)的常指針,用"stone"的地址初始化該常指針。一個常指針一旦創(chuàng)建,則它指向的地址是固定的,也就是說指針本身將不能移動了。但是該地址的存儲內(nèi)容,也就是常指針?biāo)傅臄?shù)據(jù)可以改變,例如:name[3]=‘a(chǎn)';//合法

name="John";//出錯第一個語句改變了常指針?biāo)傅臄?shù)據(jù),這是允許的;但第二個語句要改變指針本身,這是不允許的。(2)常指針(3)指向常量的常指針這樣的指針本身不能改變,它所指向的值也不能改變。要聲明一個指向常量的常指針,二者都要聲明為const,例如:constchar*constname="stone";//指向常量的常指針這個語句的含義是:聲明了一個名為name的指針變量,它是一個指向字符型常量的常指針,用"stone"的地址初始化該指針。根據(jù)這個指針的定義,可以判斷出下面二個語句都是錯誤的:name[3]=‘a(chǎn)';//出錯,不能改變指針?biāo)傅闹祅ame="John";//出錯,不能改變指針本身(3)指向常量的常指針說明:(1)如果用const定義一個整型常量,關(guān)鍵字int可以省略。所以下面的兩行定義是等價的:constinttime=l00;consttime=l00;(2)與#define定義的常量有所不同,const定義的常量可以有自己的數(shù)據(jù)類型,這樣C++的編譯程序可以進行更加嚴(yán)格的類型檢查,也使得程序的安全性得到提高。因此建議用const取代

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論