版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向對象程式設計第1章面向對象與C++語言概述基本要求 掌握:面向對象程式設計的基本思想及基本概念;c++中支持面向對象的特點;面向對象的軟體開發環境;visualc++開發工作臺的主要功能。第1章C++語言概述1.1
C++語言及特點1.2面向對象的方法1.3
C語言與C++語言的關係1.4
C++的詞法和詞法規則1.5
C++程式的結構1.6
C++程式的編輯、編譯和運行編程語言的發展
C++的起源和特點1.1
C++語言及特點1.1.1編程語言的發展機器語言(二進位碼)組合語言20世紀50年代中期,FORTRAN語言20世紀50年代中期,Algol語言
在電腦語言發展史上具有劃時代的意義,引入了許多程式設計概念。如變數、數組、迴圈、分支等。
提出塊(Begin…End)思想,對數據进行保护,是一种初級封裝。1.1.1
編程語言的發展(續)20世紀60年代中期,Simula67語言
面向對象語言的鼻祖,提出了對象、類的概念,並支持類的繼承。20世紀70年代中期,Ada語言
支持數據抽象類型的最重要的語言之一,但不完全支持繼承。20世紀70年代中期,Smalltalk語言
最有影響的面向對象語言之一,豐富了面向對象的概念。20世紀80年代中期後出現C++等多種面向對象語言1.1.2
C++的起源和特點一、C++的起源在C語言基礎上為支持面向对象的程式設計研製的一個通用目的的程式設計語言;由AT&T貝爾實驗室BjarneStroustrup博士開發;二、C++的特點與C相容,既保持了C的簡潔、高效和接近彙編的特點,又比C更安全,結構化程度更高;既支持面向過程的程式設計,又支持面向對象的程式設計;注意其兩面性1.2面向對象的方法面向過程與面向對象程式設計抽象在面向對象中的作用面向對象的概念1.2.1面向過程與面向對象程式設計例1.1:輸入任意短語或句子,計算該短語包含多少個字(word)和字元(character)。注意:輸入短語時,必須在字和字之間只空一格。#include<stdio.h>#include<conio.h>voidmain(){charch;intwdcount,chcount;wdcount=1;chcount=0;printf("***:Pleaseinputanyphrase…\n");1.2.1面向過程與面向對象程式設計(續)面向過程的方法1.2.1面向過程與面向對象程式設計(續)while((ch=getche())!='\r'){chcount++; if(ch=='')wdcount++;}printf("\n***:Thenumberofwordis%d\n", wdcount);printf("\n***:Thenumberofcharis%d\n", chcount);}1.2.1面向過程與面向對象程式設計(續)#include<iostream.h>#include<conio.h>classcount{public:count();voidprocess();voiddisplay();private:intwdcount,chcount;};私有成員構造函數成員函數數據成員成員函數定義類公有成員面向對象的方法1.2.1面向過程與面向對象程式設計(續)count::count(){wdcount=1;chcount=0;}voidcount::display(){printf("\n***:Thenumberofwordis%d\n", wdcount);
printf("\n***:Thenumberofcharis%d\n", chcount);}1.2.1面向過程與面向對象程式設計(續)voidcount::process(){charch;cout<<"***:Pleaseinputanyphrase…"<<endl;while((ch=getche())!='\r'){chcount++;if(ch=='')wdcount++;}cout<<endl;}1.2.1面向過程與面向對象程式設計(續)voidmain(){countA;A.process();A.display();}運行結果***Pleaseinputanyphrase...Iamateacher***:Thenumberofwordis4***:Thenumberofcharis15定義對象調用公有成員函數調用公有成員函數1.2.1面向過程與面向對象程式設計(續)是一種數學思維或電腦思維方法,與人們認識世界的方法不同以不穩定的、多變的“過程”和“操作”為中心來構造系統可重用性較差是建立在認識方法學基礎上的一項技術科學,比較自然地模擬了人類認識客觀世界的方式;以相對穩定的“對象”和“数据结构”為中心來構造系統可重用性較好面向過程程式設計面向對象程式設計1.2.1面向過程與面向對象程式設計(續)面向過程程式設計面向對象程式設計P1P2P3P4P5O1O2O3O4O5Changing?P61.2.1面向過程與面向對象程式設計(續)面向過程程式設計面向對象程式設計P1P2P3P5O1O2O3O4O5Changing?P6O41.2.2抽象在面向對象中的作用一、抽象的概念抽象代表著一個對象的本質特徵,這個特徵將這個對象與所有其他種類的對象區別開來;抽象是通過從特定的實例中抽取共同的性質以形成一般化的概念的過程;抽象具有層次;汽車輪船飛機交通工具1.2.2抽象在面向對象中的作用(續)二、面向對象抽象的原理數據抽象、行為共用、進化、確定性1、數據抽象為程式員提供了一種對數據和為操作這些數據所需要的演算法的抽象;是面向對象方法的核心,包括:模組化:構成了面向對象計算的本質;封裝(資訊隱藏):將一個模組的細節部分對用戶隱藏起來,用戶只能通過受保護的介面來訪問某個模組,而不能直接訪問一個模組內部的細節;類公有成員1.2.2抽象在面向對象中的作用(續)2、行為共用行為是由實體的外部介面定義的行為共用指許多實體具有相同的介面,可增加系統的靈活性;支持行為共用的方式分類與層次分類多態與繼承對象公有成員函數名1.2.2抽象在面向對象中的作用(續)3、進化需求進化(虛函數)進化式的問題求解(繼承的構造函數)4、確定性確保每個行為項都有一個正確的解釋,系統不會因不能回應某一行為而失敗;確定性與類型的正確性有關;1.2.3
面向對象的概念
面向對象是運用對象、類、繼承、封裝、包含、消息傳遞、多態性等概念來構造系統的軟體開發方法;一、對象1、概念上對象是代表著正在創建的系統中的一個實體;2、實現形式上對象是一個狀態和操作(或行為)的封裝體;3、對象的定義狀態:對象的狀態由這個對象的屬性和這些屬性的當前值決定。屬性是靜態的,當前值是動態的一個對象具有狀態、行為和標識。1.2.3面向對象的概念(續)行為:一個對象如何以狀態變化和消息傳遞的形式進行作用和對外界進行反應。
一個對象的行為代表了這個對象的外部可見的和可測試的活動;
一個對象的狀態代表著它的行為的累積結果;標識:標識是一個對象固有的一種特性,該特性將這個對象與其他對象區別開來;屬性1屬性2...屬性n值11值21...值n1值12值22...值n2對象1行為值11值21...值n1值12值22...值n2對象2行為1.2.3面向對象的概念(續)4、對象的分類實體對象介面對象控制對象按作用分類存儲資訊的對象支持系統的主要功能二、類1、什麼是類類是具有相同屬性和行為特徵的若干對象的集合;1.2.3面向對象的概念(續)
類是創建對象的樣板,它包含著所創建對象的狀態描述和方法的定義。類的完整描述包含了外部介面和內部演算法以及數據結構的形式;2、類是對象的抽象描述
類中包含生成對象的具體方法,由一個類所創建的對象稱為該類的實例;3、類是抽象數據類型的實現
類是所有對象的共同的行為和不同的狀態的集合體;屬性1屬性2……屬性n行為1行為2……行為m值11值21……值n1值12值22……值n2行為1值11值21……值n1行為m值12值22……值n2對象1對象2對象k對象p類類與對象的關係1.2.3面向對象的概念(續)1.2.3面向對象的概念(續)四、多態性多態性指向不同對象發送同一條消息,根據對象的類的不同完成不同的行為。
由函數和運算符的重載及虛函數實現類的多態性。
綜上,面向對象具有三大特性:封裝性、繼承性、多態性。三、繼承繼承提供了創建新類的一種方法,它的本質特徵是行為共用;C++對C語言的改進C++對面向對象方法的支持1.3
C語言與C++語言的關係1.3.1
C++對C語言的改進增加了新的運算符:::,new,delete等;改進了類型系統,增加了安全性;引進了引用概念;允許函數重載,允許設置缺省參數,提高了編程的靈活性;引進了內聯函數,提高了程式的效率;可以根據需要隨時對變數進行說明;1.3.2
C++對面向對象方法的支持C++支持數據封裝(數據抽象)
C++中,類是支持數據封裝的工具,對象則是數據封裝的實現;C++中包含有私有、公有和保護成員
每個可能的消息對應一個相應的方法,方法通過函數來定義;C++中通過發送消息來處理對象C++中允許友元破壞封裝性C++中允許函數名和運算符重載C++支持繼承性C++支持動態聯編C++語言的字元集單詞及詞法規則空白1.4
C++語言的詞法和詞法規則1.4.1
C++的字元集大小寫的英文字母:a~z,A~Z數字字元:0~9特殊字元1.4.2單詞及詞法規則1、識別字組成規則:以字母或下劃線開始,其後跟零個或多個字母、數字或下劃線;不能以數字開始正確識別字:Result,DoubleList,
_first,first_錯誤識別字:1first識別字的長度任意(受編譯器限制);區分字母的大小寫;不能使用系統的保留字;例如:ADD,Add,add1.4.2單詞及詞法規則(續)2、關鍵字(保留字)表1-1
C++的關鍵字1.4.2單詞及詞法規則(續)3、運算符單目雙目三目運算符5、分隔符號(){},分隔符號:4、各種文字數字字元文字串文字文字布爾文字;1.4.3空白一、空白包括:空格、跳位字元、換行符功能:指示詞法記號的開始和結束位置;二、注釋/*……*///1.5
C++程式的結構一、C++示範程式#include<iostream.h>voidmain(){cout<<"Helloworld!"<<endl;}二、C++程式的組成由若干檔組成,每個檔有:類函數(其中main為主函數)I/O流庫,提供所有的輸入輸出操作cout:流類對象<<:插入符提供螢幕輸出;cin:流類對象>>:提取符提供鍵盤輸入;例如:cin>>"Pleaseinputtwointegers:";cin>>a>>b;endl:換行;1.6
C++程式的編輯、編譯和運行一、編輯:原始檔案的擴展名為.cpp二、編譯1、預處理過程詞法分析:單詞語法分析:構造程式的格式符號表:程式中的各種符號及其屬性錯誤處理程式:生成目標代碼:目標檔擴展名.obj2、編譯过程3、連接過程:可執行檔擴展名.exe三、運行1.6
C++程式的編輯、編譯和運行(續)根源程式.cpp目標檔.obj可執行檔.exe編譯器連接器磁片中的#include檔C++庫檔.LIB第2章數據類型和運算式2.1基本數據類型2.2常量和變數2.3枚舉類型2.4數組類型2.5鍵盤輸入和螢幕輸出2.6指針和引用2.7運算符2.8運算式2.9類型定義2.1基本數據類型一、基本數據類型整型int浮點型(實型)字元型char基本數據類型邏輯型bool空值型void單精確度浮點數float雙精度浮點數double用於函數和指針2.1基本數據類型(續)二、數據類型修飾符signed:有符號unsigned:無符號short:短型long:長型說明:3)
long修飾符還適用於雙精度浮點數;2)
上述修飾符均可用於整型和字元型;1)
類型修飾符可以修飾除void、bool類型以外的其他類型;2.1基本數據類型(續)三、基本數據類型列表(P21)表2-1
C++的基本數據類型2.1基本數據類型(續)說明:1)表中的[int]可以省略,即在int之前有修飾符出現時,可以省略關鍵字int;2)單精確度類型float、雙精度類型double、長精度類型longdouble統稱浮點類型;3)char類型和各種int類型統稱整型類型;char類型變數在內存中以其ASCII碼值的形式存儲;4)字寬(位元組)取決於操作系統和編譯器的實現,可用sizeof驗證;變數常量2.2常量和變數2.2.1變數一、變數的三個基本要素名字類型值三要素數據值地址值intc;c=5;記憶體5......c地址值1000H二、變數的定義可以在程式中隨時定義變數,只要在該變數被使用前定義即可;定義格式:<類型>
<變數名表>;例如:inta,b,c;
doublex,y,z;變數類型變數名數據值地址值2.2.1變數(續)同一程式塊內不可以定義同名變數;初始值變數定義時可賦初始值;聲明格式:數據類型識別字1=初始值1,…,識別字n=初始值n;數據類型識別字1(初始值1),…,識別字n(初始值n);例如:doubleprice=15.5;
intsize(100);未被初始化的變數的值或者是默認值,或者是無效值,由變數類型決定;變數可被賦值,由變數名標識;2.2.2常量一、整型常量(無小數部分)1、表示方法十進位八進制十六進制2、十進位表示由0~9的數字組成不能以0開始無首碼例:132,-3453、八進製錶示由0~
7的數字組成以0為首碼例:010,-05364、十六進製錶示由0~9的數字及A~
F的字母(大小寫均可)組成以0x或0X為首碼例:0x7A,-0X3de2.2.2常量(續)5、說明:1)長整型用L(或l)做後綴表示。例如:32765L,793l;2)無符號型用U(或u)做後綴表示。例如:4352U,3100u;3)unsignedlong型用尾碼U(或u)和L(或l)一起表示,L與U的先後順序無關。例如:49321ul,37825LU,41152Lu;2.2.2常量(續)二、浮點型常量由整數部分和小數部分構成;只有十進位表示;一般表示形式(小數表示形式):整數部分與小數部分可以省去一部分,但不能全部省去;例如:5.,.25,4.072.2.2常量(續)科學表示形式:在小數表示法後面加E(或e)表示指數;例如:23.5E6,.032E-5,.3e10指數部分可正可負,但必須為整數;浮點常量的缺省數據類型為double型;尾碼F(或f)表示float類型;尾碼l(或l)表示longdouble類型;2.2.2常量(續)三、字元常量由一對單引號括起的一個字元表示;其值為所括起字元在ASCII表中的編碼;所括起字元的表示方法:1、圖形表示法
該方法適用於有圖形符號的可列印字元;例如:'A','a','*'2、轉義序列表示法
該方法適用於所有字元,尤其是無圖形符號的不可列印字元;2.2.2常量(續)(1)轉義序列表示方法:以反斜線(\)開頭,後跟字符的ASCII碼值;(2)八進製錶示:\ddd;例如:\101(3)十六進製錶示:\xhh;例如:\x41表2-2
C++中常用轉義序列符2.2.2常量(續)四、布爾常量有兩個值:true和false;五、字串常量(串常量,字串)一對雙引號括起的字元序列,字元序列可以包含空格、轉義序列或任何其他字元,這些字元不一定是C++字元集中的字元,只要C++編譯器支持即可;例如:"Thisisastring;"字串常量與字元常量的區別:2.2.2常量(續)由一個字元型變數存放由一維數組存放字元常量字串常量用單引號括起用雙引號括起字串有一個結束符,結束符用'\0'表示字元常量'a'在內存中佔用一個位元組字串常量"a"在內存中佔用兩個位元組可進行加、減法運算可進行連接、拷貝運算2.2.2常量(續)六、符號常量用來表示C++中的常量,即用一个与常量相关的标识符来替代常量;優點:增加可讀性,增強可維護性;例如:PI表示3.1415926定義方法:使用類型說明符const;例如:constintsize=80;定義的符號常量必須初始化;一個符號常量可看作是一個只讀變數,由const定義的常量的值不可以改变;Line1: #include<iostream.h>Line2: constdoublepi=3.1415;Line3: constdoubler;Line4: voidmain()Line5: {Line6: doubleperimeter,area;Line7: perimeter=2*pi*r;Line8: pi=3.14;Line9: area=pi*r*r;Line10: cout<<perimeter<<","<<area<<endl;Line11: }
constdoubler=3.2;錯誤錯誤,不能修改pi的值2.2.2常量(續)2.3枚舉類型枚舉類型是若干個有名字的整型常量的集合;2.3.1枚舉聲明和枚舉變數一、枚舉聲明enum<枚舉名>{<枚舉表>};<枚舉表>由若干個枚舉符組成,多個枚舉符之間用逗號分隔;枚舉符是用識別字表示的整型常量,又稱枚舉常量;枚舉常量的值默認為最前邊的一個為0,其後的值依次加1;枚舉常量的值也可顯式定義,未顯式定義的則在前一個值的基礎上加1;2.3.1枚舉聲明和枚舉變數(續)二、枚舉變數例如:enumday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};enumday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};enum<枚舉名><枚舉變數名表>;多個枚舉變數之間用逗號分隔;例如:enumdayd1,d2,d3;enumday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}d1,d2,d3;枚舉常量的值不一定互不相同;2.3.2枚舉變數的值其值是該枚舉變數所屬的枚舉聲明的枚舉表的某一個枚舉符;利用枚舉符所表示的整型值給枚舉變數賦值時,需要進行類型強制;例如:
d1=Sun;
d2=Sat;
d3=(enumday)4;2.4數組類型數目固定、類型相同的若干個變數的有序集合;2.4.1數組的定義1、格式<類型><數組名>[<大小1>][<大小2>]…;說明:方括號([])表示數組的維;某維的大小必須是大於0的常量運算式;2、示例inta[3];charb[3][5];constintsize=80;intm[size];2.4.2數組的賦值1、數組元素的表示下標表示:<數組名>[<下標運算式1>][<下標運算式2>]…;說明:下標從0開始;各個元素在內存中按其下標的昇冪順序連續存放;指針表示:2.4.2數組的賦值(續)2、數組元素賦初值利用初始值表(由一對花括弧括起來的若干資料項目組成)實現;初始值表中資料項目的個數要小於等於數組元素的個數;例如:inta[5]={1,2,3,4,5};
inta[4]={5,4};
intb[2][3]={{1,2,3},{4,5,6}};
intb[2][3]={1,2,3,4,5,6};
intc[2][3][2]={{{5,4},{3}},{{2},{1,0}}};3、數組元素的賦值例如:intm[3];
m[0]=5;
m[1]=3;
m[2]=1;2.4.3字元數組說明:字元數組是指數組元素是char類型的數組;注意字元常量、字元數組與字串常量的區別;例如:chars1[4]={'a','b','c','d'};字元數組chars2[5]={'a','b','c','d','\0'};字元數組(字串常量)等價於chars2[5]="abcd";chars3[5]="abcde";╳chars3[]="abcde";inta,bcin>>a>>b;運行時從鍵盤輸入:
12342.5鍵盤輸入和螢幕輸出一、鍵盤輸入使用標準輸入流對象cin和提取運算符>>鍵盤輸入和螢幕輸出都使用include<iostream.h>二、螢幕輸出2.5鍵盤輸入和螢幕輸出(續)使用標準輸出流對象和插入運算符<<inta=12;doubleb=12.34cout<<“ab的值為:”<<a<<‘,‘<<b<<endl;2.5鍵盤輸入和螢幕輸出(續)#include<iostream.h>voidmain(){ inta,b; doublem,n; charc,s[20]; cout<<"請輸入整數:"; cin>>a>>b; cout<<"請輸入浮點數:"; cin>>m>>n; cout<<"請輸入字元:"; cin>>c>>s; cout<<a<<","<<b<<endl; cout<<m<<","<<n<<endl; cout<<c<<","<<s<<endl;}例:對不同類型數據的輸入和輸出指針指針和數組引用2.6指針和引用2.6.1指針1、什麼是指針指針是用來存放某個變數的地址值的一種變數;指針的類型是它所指向變數的類型;指針本身數據值的類型是unsignedlongint型;例如:
inta(5);
int*p=&a;記憶體1000H5...a地址值1000H3000Hp2.6.1指針(續)2、如何定義指針例如:
int*pi;
char(*pa)[3];//數組指針
float*pl;
int(*pf)();//函數指針
char*pc;
int*pp;<類型>*<指針名1>,*<指針名2>,…;3、指針的賦值(記憶體地址值)指針必須被賦值後才可使用;一般變數、數組元素、結構成員的地址值為變數名前加運算符&;數組的地址值用該數組名表示;2.6.1指針(續)函數的地址值用該函數的名字表示;例如:
inta,b[10];
doublesin(doublex);
int*p=&a,*q=&b[3];
double(*pf)(doublex);
intc[10],*p=c;
pf=sin;4、指針的運算賦值運算。例如:inta,*p=&a,*q;
q=p;一個指針可以加上或減去一個整數值;在一定條件下(指向同一數組的不同元素),兩個指針可以相減;在一定條件下(指向同一數組的不同元素),兩個指針可以比較;2.6.2指針和數組1、C++中指針與數組的關係C++通過指針訪問數組中的每個元素;在運算運算式中,一個標識數組對象的運算元在運算運算式中被自動轉換為一個指向數組對象的第一個元素對象的指針值。2、一維數組的指針表示法C++中規定:任何一個數組的名字是一個常量指針,其值是該數組的首元素的地址值;例如:inta[5];數組表示法:a[i],i=0,1,2,3,4
指針表示法:*(a+i)a與&a[0]相同2.6.2指針和數組(續)3、二維數組的指針表示法intb[2][5];數組表示法:b[i][j]
i=0,1;j=0,1,2,3,4指針表示法:
*(*(b+i)+j)
*(b[i]+j)
(*(b+i))[j]
(&b[0][0]+5*i+j)4、三維數組的指針表示法(同二維)5、示例2.6.2指針和數組(續)例2.1:分析下列程式的輸出結果。#include<iostream.h>voidmain(){staticinta[5]={5,4,3,2,1};inti,j;i=a[0]+a[4];j=*(a+2)+*(a+4);cout<<i<<endl<<j<<endl;}輸出
6
44a[1]5a[0]3a[2]2a[3]1a[4]aa+2a+42.6.2指針和數組(續)例2.2:分析下列程式的輸出結果。#include<iostream.h>voidmain(){staticchars1[]="abcde", s2[5]={'m','n','p','q','\0'};char*ps=s1;cout<<s1<<"or"<<s2<<endl;cout<<s2[1]<<s2[2]<<s1[3]<<s1[4]<<endl;cout<<*ps<<*(ps+2)<<*(ps+4)<<*ps+2<<endl;}輸出
abcdeormnpq
npde
ace99a的ASCII碼值為0x61,即972.6.2指針和數組(續)例2.3:分析下列程式的輸出結果。#include<iostream.h>voidmain(){staticchart[][3][5]={"abcd","efgh","ijkl", "mnop","qrst","uvwx"};cout<<t[1][2][3]<<*(t[1][2]+3)<<*(*(*(t+1)+2)+3)<<*(*(t[1]+2)+3)<<endl;cout<<**t<<"\t"<<*(*(t+1)+1)<<"\t"<<t[0][2]<<"\t"<<**t+1<<endl;}輸出
xxxx
abcd
qrst
ijkl
bcd2.6.3引用對對象存儲地址的抽象,但引用不是變數或對象,它不占存儲空間;引用有類型;引用是變數的別名;1、定義格式<類型>&<引用名>(<變數名>);或<類型>&<引用名>=<變數名>;2、初始化與賦值定義引用時必須初始化;可以將一個引用賦給某個變數;引用可被賦值;2.6.3引用(續)示例:
inta=3;
int&m=a;
intn=m;
int*p=&m;
m=m+5;3a8pm3n定義引用並初始化將引用賦值給變數a=8,對引用的操作就是對被引用者的操作3、引用的功能功能:用做函數的參數或函數的返回值;注意:函數不能返回對局部對象的引用;2.6.3引用(續)示例:
int&f(intindex,inta[])
{
intr=a[index];
returnr;
}錯,r是局部對象4、指針與引用的區別(教材P159有錯)指針通過地址間接訪問某個變數,引用通過別名直接訪問某個變數;引用必須初始化,一旦被初始化後不得再作為其他變數的別名;正確:int&r=a[index];為什麼?2.6.3引用(續)例2.4:分析下列程式的輸出結果。#include<iostream.h>voidmain(){intval(5);int&refv=val;refv=refv+5;;cout<<val<<endl;int*p=&refv,val1(refv);cout<<*p<<"\t"<<val1<<endl;}輸出
10
10
102.6.3引用(續)例2.5:分析下列程式的輸出結果。#include<iostream.h>int&f(intindex,inta[]){int&r=a[index];returnr;}voidmain(){inta[]={1,3,5,7,9};f(2,a)=55;for(i=0;i<5;i++)cout<<a[i]<<"\t";}傳址調用(C++中數組自動轉換為指針);引用可作左值;輸出:
1
3
55
79a[0]91357…a[2]r55算術運算符關係運算符邏輯運算符位操作運算符賦值運算符其他運算符運算符的優先順序和結合性2.7運算符2.7.1算術運算符1、普通算術運算符單目算術運算符:-(取負)、+(取正);雙目算術運算符:+、-、*、/、%(只用於int型);單目運算符優先順序高於雙目運算符;2、增1和減1運算符單目運算符:++、--;++運算符的功能:由該運算符組成的運算式具有一定的值;由該運算符組成的運算式計算後,其變數值要發生改變;2.7.1算術運算符(續)++運算符的兩種方式:首碼方式與尾碼方式;首碼方式與尾碼方式的區別:首碼運算運算式的值為原來變數值加1;尾碼運算運算式的值為原來變數值;兩種方式的變數的值都加1;示例:
inta(1);
++a;
intb(1);
b++;運算式++a的值為2,變數a的值為2;運算式b++的值為1,變數b的值為2;2.7.2關係運算符雙目運算符:>、<、>=、<=、==、!=前四種優先順序高於後兩種;2.7.3邏輯運算符雙目運算符:&&、||優先順序:!、&&、||單目運算符:!2.7.4位操作運算符1、邏輯位運算符單目邏輯位運算符:~雙目邏輯位運算符:&、|、^邏輯位運算符的優先順序:~、
&、^、|;2、移位運算符雙目運算符:<<、>>;<<時移掉的位被丟棄,右邊移出的空位補0;>>時移掉的位被丟棄,左邊移出的空位補0或符號位;2.7.5賦值運算符簡單賦值運算符:=複合賦值運算符:+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=2.7.6其他運算符1、三目運算符格式:d1?d2:d3功能:先計算d1,若其非零,運算式的值為d2的值,否則為d3的值;運算式類型:d2和d3中類型較高者的類型;2、逗號運算符格式:d1,d2,…,dn運算式的值和類型:由最後一個運算式確定;優先順序在所有運算符中最低;3、sizeof運算符2.7.6其他運算符(續)格式:sizeof(<類型說明符>);功能:返回其後的類型說明符或運算式所表示的數在內存中所占的位元組;4、單目運算符&和*&:取地址;*:用在指針名前,表示取指針的內容;5、強制類型運算符或sizeof(<運算式>);
格式:<類型說明符>(<運算式>);或
(<類型說明符>)<運算式>;2.7.6其他運算符(續)強制類型轉換可將高類型轉換為低類型,是一種不安全的轉換;示例:
doublef(3.85);
inth;
h=int(f);該轉換是暫時的,一次性的;
將低類型轉換為高類型,不影響數據精度示例:
inta(3),m;
doubleb;
b=3.56+double(a);
m=a+5;2.7.7運算符的優先順序和結合性P48,表3.1運算式的種類運算式的值和類型運算式中的類型轉換2.8運算式2.8.1運算式的種類由運算符和運算元組成的式子;常見的運算式算術運算式;邏輯運算式;關係運算式;賦值運算式;條件運算式;逗號運算式;2.8.1運算式的種類(續)注意事項:連續的兩個運算符之間用空格分隔;可用括弧來改變運算符優先順序;過長的運算式可分成幾個運算式;2.8.2運算式的值和類型一、確定運算式的值二、運算式求值方法與確定類型的方法先確定運算符的功能;確定計算順序:先考慮優先順序,再考慮結合性;2.8.2運算式的值和類型(續)例2.6:分析下列程式的輸出結果(算術運算式)。#include<iostream.h>voidmain(){inta;a=123+3.2e2-3.6/6-6/8;cout<<a<<endl;doubleb;b=123+3.2e2-3.6/6-6/8;cout<<b<<endl;intc(7),d(4)a=c---++d;cout<<c<<‘,’<<d<<‘,’<<a<<endl;}輸出:
442442.4
6,5,22.8.2運算式的值和類型(續)例2.7:分析下列程式的輸出結果(關係運算式)。#include<iostream.h>voidmain(){charx('m'),y('n');intn;n=x<y;cout<<n<<endl;n=x==y-1;cout<<n<<endl;n=('y'!='Y')+(5>3)+(y-x==1);cout<<n<<endl;}輸出:
1
1
32.8.2運算式的值和類型(續)例2.8:分析下列程式的輸出結果(邏輯運算式)。#include<iostream.h>voidmain(){intx,y,z;x=y=z=1;--x&&++y&&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&++y&&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&y--||++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;}輸出:
0
1
1
1
2
2
2
1
2注意邏輯運算式的求值方法2.8.2運算式的值和類型(續)例2.9:分析下列程式的輸出結果(條件運算式)。#include<iostream.h>voidmain(){inta(3),b(4),c;c=a>b?++a:++b;cout<<a<<","<<b<<","<<c<<endl;c=a-b?a+b:a-3?b:a;cout<<a<<","<<b<<","<<c<<endl;}
3,5,5
3,5,8輸出注意三目運算符的判斷條件2.8.2運算式的值和類型(續)例2.10:分析下列程式的輸出結果(賦值運算式)。#include<iostream.h>voidmain(){intx(1),y(3),z(5);x+=y*=z-=2;cout<<x<<","<<y<<","<<z<<endl;x*=y/=z-=x;cout<<x<<","<<y<<","<<z<<endl;x=y=z=2;z=(x+=2)+(y+=4)+2;cout<<x<<","<<y<<“,"<<z<<endl;}輸出:
10,9,3
-10,-1,-7
4,6,122.8.2運算式的值和類型(續)例2.11:分析下列程式的輸出結果(逗號運算式)。#include<iostream.h>voidmain(){inta,b,c;a=1,b=2,c=a+b+3;cout<<a<<","<<b<<","<<c<<endl;c=(a++,a+=b,a+b);cout<<a<<","<<b<<","<<c<<endl;}
1,2,6
4,2,6輸出2.8.3運算式中的類型轉換一、隱式轉換雙目運算中運算元的類型轉換;是一種保值轉換,轉換類型由低到高;轉換規則:int
unsigned
long
unsignedlong
doubleshort,char
float二、強制轉換顯式強制轉換(通過強制轉換運算符實現);2.8.3運算式中的類型轉換(續)隱式強制轉換:在賦值運算式中,當左值(賦值運算符左邊的值)和右值(賦值運算符右邊的值)的類型不同時,一律將右值類型強制轉換為左值的類型;在函數有返回值的調用中,將return後面的運算式的類型強制轉換為該函數的類型;顯式隱式賦值運算式函數返回值隱式轉換強制轉換類型轉換2.9類型定義1、格式typedef<已有類型名><新類型名表>;例如:
typedefdoublewages,bouns;
wagesweekly;
bounsmonthly;2、自定義類型的作用改善程式的可讀性,增加所定義變數的資訊書寫簡練提高程式的可移植性
第3章預處理和語句3.1預處理功能3.2語句3.3選擇語句3.4迴圈語句3.5轉向語句3.1預處理功能一、預處理命令及預處理功能1、預處理命令C++根源程式中包含的各種編譯命令在程式被正常編譯之前執行;2、預處理功能由預處理命令實現的功能;二、常用的預處理命令檔包含命令宏定義命令3.1預處理功能(續)(1)以“
#”為引導,作為該命令的標誌;(4)每條預處理命令單獨佔用一行,同一行不能有其他預處理命令和語句;三、預處理命令使用說明條件編譯命令停止編譯命令(5)預處理命令可以續行,續行符為"\";(2)預處理命令不是語句,不能以分號(;)結束;(3)預處理命令的位置可放在開頭、中間和結尾3.1.1檔包含命令一、功能指示C++編譯器將一個檔(頭檔)的內容嵌入到该指令所在的文件的位置處;頭檔:指存放與標準函數有關的資訊,或者存放符號常量、類型定義、類和其他複雜類型的定義以及與程式環境相關資訊的.h檔;二、格式1、#include
<檔案名>由系統提供並放在指定子目錄中的頭檔;2、#include
"檔案名"
由用戶定義,放在當前目錄或其他目錄下的頭檔或其他原始檔案;3.1.1檔包含命令(續)三、說明(1)檔包含命令一般放在程式頭;(2)一條文件包含命令只能包含一個檔;檔案名:myfile1.h#include"myfile2.h“檔案名:myfile2.h#include"myfile3.h“(3)檔包含命令可以嵌套;(4)包含檔的內容不宜過多;3.1.2宏定義命令一、功能用來將一個識別字定義為一個字串,該識別字稱為宏名,被定義的字串稱為替換文本;二、宏定義命令格式1、兩種定義格式簡單宏定義帶參數的宏定義2、簡單宏定義定義符號常量,例如:#definePI3.1415#define<宏名><字串>3.1.2宏定義命令(續)#define與const定義符號常量的區別const產生一個具有類型的符號#define僅產生文本替換,而不管內容是否正確constdoublePI=3.1415;#definePI3.1415使用const可以定義一個局部常量,可局部在一個函數體內用#define定義的常量的作用域是從定義時開始,直到使用#undef取消定義時為止,如果不取消定義,直到整個檔結束使用const定義常量是一個說明語句,用分號(;)結束使用#define定義常量是一個預處理命令,不能用分號(;)結束3.1.2宏定義命令(續)#define命令說明(1)書寫#define命令時,<宏名>與<字串>之間用空格分隔,不能使用等號連接;(2)使用#define定義的識別字不是變數,它只用作宏替換,不佔用記憶體;(3)#define是一條預處理命令,不用分號結束,它所定義的識別字等價於其後的字串;(4)識別字被宏定義後,在取消這次宏定義之前,不允許重新對它進行宏定義;(5)宏定義可以嵌套,已定義的識別字可以用來定義新的字串;3.1.2宏定義命令(續)說明1)<宏體>應寫在一行上,如果需要寫在多行時,需使用續行符(\)結束,並在其後按下回車鍵;2)<宏名>與左括弧之間不能出現空格,否則空格右邊都將作為宏體;3)定義帶參數的宏體時,宏體中與參數名相同的字元序列適當地加上括弧,可以避免宏替換後出現的優先順序問題;4)C++中,帶參數的宏定義常由內聯函數取代;3、帶參數的宏定義#define<宏名>(<參數表>)<宏體>3.1.2宏定義命令(續)例3.1:分析下列程式的輸出結果。#include<iostream.h>voidmain(){intb(5);#defineb2#definef(x)b*(x)inty(3);cout<<f(y+1)<<endl;#undefbcout<<f(y+1)<<endl;#defineb(3)cout<<f(y+1)<<endl;}輸出:
8
20
12簡單宏定義帶參數的宏定義b=2b=5b=33.1.2宏定義命令(續)4、替換正文中的操作符##與###:將它兩邊的運算元連接成一個符號;#:將它右邊的運算元變成一個字串文字;例如:#defineCON(a,b)a##b
doublei=CON(5,E-10);
doublei=5E-10;
#defineSTR(a)#a
cout<<STR(Programmingisfun!)<<endl;
cout<<"Programmingisfun!"<<endl;5、取消宏定義命令#undef<識別字>3.1.3條件編譯命令一、功能用來定義某些編譯內容要在滿足一定條件下才參與編譯,否則不參與編譯;可使同一根源程式在不同的編譯條件下產生不同的目標代碼。二、格式格式一:#ifdef<識別字>
<程式段1>
#else
<程式段2>
#endif或#ifdef<識別字>
<程式段1>
#endif3.1.3條件編譯命令(續)格式二
#ifndef<識別字>
<程式段1>
#else
<程式段2>
#endif或
#ifndef<識別字>
<程式段1>
#endif格式三
#if<常量運算式1>
<程式段1>
#elif<常量運算式2>
<程式段2>
#elif<常量運算式3>
<程式段3>
...
#else
<程式段n+1>
#endif3.1.3條件編譯命令(續)例3.2:分析下列程式的輸出結果。#include<iostream.h>#defineA10voidmain(){#ifA>0cout<<"a>0"<<endl;#elifA<0cout<<"a<0"<<endl;#elsecout<<"a==0"<<endl;#endif}輸出:
a>03.1.3條件編譯命令(續)例3.3:避免重複引用某个头文件。//main.cpp#include"myfile1.h"#include"myfile2.h"//myfile1.h#include"myhead.h"//myfile2.h#include"myhead.h"
改進:
//myhead.h
#ifndefMYHEAD_H
#defineMYHEAD_H
myhead檔的內容
…………..
#endif3.1.3條件編譯命令(續)例3.4:用於調試。調試時:
#defineDEBUG1
...
#ifDEBUG=1
cout<<"OK"<<endl;
#endif
...調試後:
#defineDEBUG0
...3.1.4停止編譯命令一、格式#error<字元序列>二、功能當編譯器遇到該指令時,顯示“字元序列”,即错误信息,然后停止對該程式的編譯,從而可以在編譯階段發現程式中的錯誤;三、示例假設country值為:US、ENGLAND、CHINA
程式中有如下語句:3.1.4停止編譯命令(續)//…#else#errorYoudefinecountryincorrectly#endif當country的值不是上述三者之一時,編譯器將顯示:然後停止編譯。Youdefinecountryincorrectly3.2語句1、運算式語句和空語句運算式語句:任何一個運算式加上分號(;);空語句:只有一個分號(;)的語句;2、複合語句和分程式複合語句:由兩條或兩條以上的程式構成,並由一對花括弧括起;分程式:又稱程式塊,含有一條或多條說明語句的複合語句;條件語句開關語句3.3選擇語句3.3.1條件語句
if(<條件1>)<語句1>
elseif(<條件2>)<語句2>
elseif(<條件3>)<語句3>
...
elseif(<條件n>)<語句n>
else<語句n+1>說明:
if語句可以嵌套,在此情況下,else與最近的一個沒有與else配對的if配對。3.3.2開關語句
switch(<整型運算式>)
{
case<整常型運算式1>:<語句序列1>
case<整常型運算式2>:<語句序列2>
...
case<整常型運算式n>:<語句序列n>
default:<語句序列n+1>
}注意:
在執行語句序列中如果遇到break語句,則退出switch語句,執行後面的語句;如果其後的語句序列中沒有break語句,則一直執行至switch語句結束。3.3.2開關語句(續)例3.5:分析下列程式的輸出結果。#include<iostream.h>voidmain(){inti(1),j(0),m(1),n(2);switch(i++){case1:m++;n++;case2:switch(++j){case1:m++;case2:n++;}case3:m++;n++;break;case4:m++;n++;}cout<<m<<','<<n<<endl;}輸出:
4,53.4迴圈語句1、while迴圈語句while(<條件>)<語句>;2、do-while迴圈語句
do<語句>
while(<條件>);
do-while迴圈與while迴圈的區別:
do-while迴圈至少執行一次循環體,while迴圈可能一次也不執行循環體;3、for迴圈語句for
(d1;d2;d3)<語句>;4、多重迴圈3.5轉向語句1、goto語句格式:goto<語句編號>;goto語句只能在一個函數內進行轉向;2、break語句格式:break;適用情況:1)用於開關語句的語句序列中,其功能是退出開關語句,執行其後的語句;2)用於循環體中,其功能是用來退出該重迴圈;3、continue語句格式:continue;功能:在循環體中用來結束本次迴圈;第4章函數4.1函數的定義和說明4.2函數的參數和返回值4.3函數的調用方式4.4內聯函數4.5函數重載4.1函數的定義和說明函數的定義格式函數的說明方法(函數聲明)4.1.1函數的定義格式
<類型><函數名>(<參數表>)
{
<若干條語句>
}
說明:<類型>為函數返回值類型,若為void,則為過程調用;<參數表>中的參數為形參,在函數被調用時進行初始化,從而從被調用處獲得數據;函數體4.1.2函數的說明方法(函數的聲明)一、函數的說明原則如果一個函數定義在先,調用在後,調用前可以不必說明;如果一個函數定義在後,調用在先,調用前必須說明;二、函數的說明方法(原型說明)<類型><函數名>(<參數表>);三、示例參數表中的參數名稱可以省略4.1.2函數的說明方法(續)#include<iostream.h>voidfun1(),fun2(),fun3();voidmain(){cout<<"Itisinmain."<<endl;fun2();cout<<"Itisbackinmain."<<endl;}voidfun1(){cout<<"Itisinfun1."<<endl;fun3();cout<<"Itisbackinfun1."<<endl;}例4.1:分析下列程式的輸出結果。函數原型聲明4.1.2函數的說明方法(續)voidfun2(){cout<<"Itisinfun2."<<endl;fun1();cout<<"Itisbackinfun2."<<endl;}voidfun3(){cout<<"Itisinfun3."<<endl;}
Itisinmain.
Itisbackinfun1.
Itisinfun2.
Itisbackinfun2.
Itisinfun1.
Itisbackinmain.
Itisinfun3.
輸出含以下3個內容:函數參數的求值順序設置函數參數的默認值函數的返回值4.2函數的參數和返回值4.2.1函數參數的求值順序當一個函數帶有多個參數時,C++語言沒有規定函數調用時實參的求值順序;編譯器根據對代碼進行優化的需要自行規定對實參的求值順序;在實參中注意不要使用帶有副作用的運算符,此時可能產生二義性;例4.2:由於使用對參數求值順序不同的編譯器造成的二義性。4.2.1函數參數的求值順序(續)#include<iostream.h>intadd(intx,inty){returnx+y;}voidmain(){intx(4),y(6);intz=add(++x,x+y);cout<<z<<endl;}產生二義性可能的結果(按照編譯器對實參求值順序不同):自左至右,兩個實參的值分別為5和11;自右至左,兩個實參的值分別為5和10;4.2.2設置函數參數的默認值C++中,在函數聲明或定義時可以為一個或多個參數指定缺省參數值;intadd(intx,int
y=10);進行函數調用時,若未指定足夠的實參,則編譯器將按從左向右的順序用函數聲明或定義中的缺省值來補足所缺少的實參;add(15);
add(15,10);注意:函數參數求值順序與參數默認值補足順序不同參數求值順序:由編譯器決定求值方向;參數默認值補足順序:自左向右4.2.2設置函數參數的默認值(續)在一個指定了缺省值的參數的右邊,不能出現沒有指定缺省值的參數;voidf(intx,inty=1,intz);在給某個參數指定缺省值時,不僅可以是一個數值,而且可以是任意複雜的運算式;
intf();
……
voiddelay(intk,inttime=f());錯誤例如:f(2,4);理想:f(2,1,4),實際:z參數未被賦值4.2.2設置函數參數的默認值(續)#include<iostream.h>voidfun(inta=1,intb=3,intc=5){cout<<"a="<<a<<","<<"b="<<b<<","<<"c="<<c<<endl;}voidmain(){fun();fun(7);fun(7,9);fun(7,9,11);cout<<"OK!"<<endl;}輸出:
a=1,b=3,c=5
a=7,b=3,c=5
a=7,b=9,c=5
a=7,b=9,c=11
OK!例4.3:分析下列程式的輸出結果。4.2.2設置函數參數的默認值(續)(1)對函數的實參數實行初始化。
如果沒有缺省參數,在函數調用時必須逐一給出實參數,使函數的調用顯得不夠靈活、實用。而定義了參數缺省函數後,對參數初始化就顯得相當便捷。(2)使函數的定義和調用更具一般性
在定義了缺省參數函數後,函數的形式參數和實參數的對應形式就可以多種多樣了。
(3)降低編程的複雜性
降低編程的複雜性,降低程式出錯的可能性。
為什麼要定義參數缺省函數?4.2.3函數的返回值關於return語句的說明:有返回值的return語句可以返回一個運算式的值,從而實現函數之間的資訊傳遞;無返回值的函數必須用void說明其返回類型;返回語句格式格式一:return<運算式>;格式二:return;4.3函數的調用方式說明:實參表的個數由形參決定,用來初始化實參,多個實參用逗號分隔;實參的個數與類型必須與形參的個數與類型完全一致;函數調用格式<函數名>(<實參表>);實參對形參的初始化按其位置進行;調用方式的分類4.3函數的調用方式(續)傳值調用:傳遞變數本身的值(數據值);傳址調用:傳遞變數的地址值;引用調用:傳遞變數本身;4.3.1函數的傳值調用傳值調用的實現機制和特點用法:調用函數的實參用常量、變數(數據)值或運算式值,被調用函數的形參用變數;實現機制:系統將實參拷貝一個副本給形參(數據值);特點:形參值的改變不影響實參值;4.3.1函數的傳值調用(續)#include<iostream.h>voidswap1(intx,inty){inttemp;temp=x;x=y;y=temp;cout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap1(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}例4.4:分析下列程式的輸出結果(傳值調用)。輸出:
x=9,y=5
a=5,b=94.3.2函數的傳址調用傳址調用的實現機制和特點用法:調用函數的實參用地址值,被調用函數的形參用指針;實現機制:讓形參的指針直接指向實參;特點:可以通過改變形參所指向的變數值來影響實參值;4.3.2函數的傳址調用(續)#include<iostream.h>voidswap2(int*x,int*y){inttemp;temp=*x;
*x=*y;
*y=temp;cout<<"x="<<*x<<","<<"y="<<*y<<endl;}voidmain()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宫颈细胞学规范化培训
- 《线性代数计算方法》课件
- 《选任培训细则》课件
- 会计职业道德培训
- 中医护理整体查房
- 什么是感觉微电影分库周欣然
- 三位数乘两位数能力练习练习题大全附答案
- 《纪律与工作生活》课件
- 《级解析学生版》课件
- 导诊护士礼仪培训
- HGT 2902-2024《模塑用聚四氟乙烯树脂》
- 洗浴中心传染病病例防控措施
- 三基三严模拟考试题(附答案)
- 子宫内膜癌-医师教学查房
- 买卖合同解除证明模板
- 美国刑法制度
- 北师大版数学六年级上册第六单元《比的认识》大单元整体教学设计
- 第13课 社会治理与总体国家安全观(课件)-【中职专用】高一思想政治《中国特色社会主义》(高教版2023·基础模块)
- 2024年教师招聘考试-中小学校长招聘笔试参考题库含答案
- QCSG1204009-2015电力监控系统安全防护技术规范
- (正式版)SHT 3158-2024 石油化工管壳式余热锅炉
评论
0/150
提交评论