




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第八章繼承與派生§8.1繼承的概念§8.2派生類§8.3單繼承§8.4多繼承§8.5應用舉例1.什么是類?類的定義格式如何?類中成員的訪問權限有哪些?2.什么是對象?對象的定義格式如何?3.構造函數(shù)的功能和特點有哪些?①構造函數(shù)是一種成員函數(shù),它的說明在類體內,函數(shù)體可在類體內或體外。②構造函數(shù)是一種特殊函數(shù),函數(shù)名字同類名。沒有函數(shù)返回類型。③構造函數(shù)可以有一個或多個參數(shù),也可沒有參數(shù)。構造函數(shù)可以重載。1.什么是類?類的定義格式如何?類中成員的訪問權限有哪些?2.什么是對象?對象的定義格式如何?3.構造函數(shù)的功能和特點有哪些?①析構函數(shù)是一種成員函數(shù),函數(shù)體可在類體內或體外。②析構函數(shù)名字同類名,且前加“~”。③析構函數(shù)沒有參數(shù),不能重載。4.析構函數(shù)的功能和特點有哪些?1.什么是類?類的定義格式如何?類中成員的訪問權限有哪些?2.什么是對象?對象的定義格式如何?3.構造函數(shù)的功能和特點有哪些?①默認構造函數(shù)是無參數(shù)的空函數(shù)②默認構造函數(shù)的名字同類名③默認構造函數(shù)不能重載。4.析構函數(shù)的功能和特點有哪些?5.默認構造函數(shù)的特點有哪些?§8.1繼承的概念交通工具汽車火車飛機輪船小汽車卡車旅行車工具車轎車面包車圖:交通工具的類層次§8.1繼承的概念稱已經(jīng)存在的用來派生新類的類為基類,又稱為父類。由已經(jīng)存在的類派生出的新類稱為派生類,又稱為子類?!?.1繼承的概念在C++語言中,一個派生類可以從一個基類派生,也可以從多個基類派生。從一個基類派生的繼承稱為單繼承。從多個基類派生的繼承稱為多繼承?!?.2派生類class<派生類名>:<繼承方式><基類名>一、派生類的定義格式1.單繼承的定義格式{<派生類新定義的成員>};
public:表示公有繼承
private:表示私有繼承(默認的繼承方式)
protected:表示保護繼承§8.2派生類classA{public:A(inti){a=i;}voidp(){cout<<a<<endl;}private:inta;};一、派生類的定義格式1.單繼承的定義格式classB:publicA{public:…private:intb;};例§8.2派生類class<派生類名>:<繼承方式1><基類名1>,一、派生類的定義格式2.多繼承的定義格式{<派生類新定義的成員>};<繼承方式2><基類名2>,…§8.2派生類classA{inta,b;public:voidget_ab()//…};classB:A{intk;public:voidmake_k()};voidB::make_k(){k=a*b;}例二、派生類對基類成員的訪問權§8.2派生類二、派生類對基類成員的訪問權1.私有繼承方式由私有繼承得到的派生類,對其基類中的每個成員都是私有繼承,而且它們都不能再被派生類的子類訪問?!?.2派生類classx{inta;public:intget(){returna;}};classy:x{intb;public:voidmake(){b=get()+10;}//ok};voidf(){xx1;yy1;y1.make();y1.get();//error}例§8.2派生類二、派生類對基類成員的訪問權2.公有繼承方式該方式的特點是基類中的每個成員在派生類中保持同樣的訪問權限。classvehicle{intwheels;//表示車輪數(shù)
floatweight;//表示汽車重量public:intinitialize(intin_wheels,floatin_weight);//初始化intget_wheels();//取車輪數(shù)floatget_weight();//取車重floatwheel_loading();//車輪承重};例classcar:publicvehicle{intpassenger_load;//允許載客數(shù)public:voidinitialize(intin_wheels,floatin_weight,intpeople);intpassengers();//返回載客數(shù)};§8.2派生類二、派生類對基類成員的訪問權3.保護繼承方式該方式的特點是基類中的public成員和protected成員,在派生類中都是protected成員;基類中的private成員,在派生類中仍為private成員?!?.2派生類二、派生類對基類成員的訪問權繼承方式publicprivateprotectedpublicpublicprivateprotectedprivateprivateprivateprivateprotectedprotectedprivateprotected總結#include<iostream.h>classbase//定義一個基類{intx1,x2;public:voidassign(intp1,intp2){x1=p1;x2=p2;}//為私有數(shù)據(jù)賦值
intinc1(){return++x1;}//返回增加1后的x1值
intinc2(){return++x2;}//返回增加1后的x2值
voiddisplay(){cout<<"basex1="<<x1<<"x2="<<x2<<"\n";}};classderive1:base//定義一個私有派生類{intx3;public:derive1(intp3){x3=p3;}//構造函數(shù)
voidassign(intp1,intp2)//為私有數(shù)據(jù)賦值{base::assign(p1,p2);}//調用基類成員函數(shù)
intinc1(){returnbase::inc1();}//調用基類成員函數(shù)
intinc2(){returnbase::inc2();}intinc3(){return++x3;}voiddisplay(){cout<<"derive1x3="<<x3<<"\n";}};classderive2:publicbase//定義一個公有派生類{intx4;public:derive2(intp4){x4=p4;}intinc1(){inttemp=base::inc1();
temp=base::inc1();temp=base::inc1();returnbase::inc1();}intinc4(){return++x4;}voiddisplay(){base::display();cout<<"derive2x4=“;cout<<x4<<"\n";}};voidmain(){basep;p.assign(-2,-2);p.display();derive1d1(-4);d1.assign(10,10);d1.inc1();d1.display();derive2d2(5);d2.assign(-6,-6);d2.inc1();d2.inc2();d2.display();d2.base::inc1();d2.display();}#include<iostream.h>classbase//定義一個基類{intx1,x2;public:voidassign(intp1,intp2){x1=p1;x2=p2;}//為私有數(shù)據(jù)賦值
intinc1(){return++x1;}//返回增加1后的x1值
intinc2(){return++x2;}//返回增加1后的x2值
voiddisplay(){cout<<"basex1="<<x1<<"x2="<<x2<<"\n";}};classderive1:base//定義一個私有派生類{intx3;public:derive1(intp3){x3=p3;}//構造函數(shù)
voidassign(intp1,intp2)//為私有數(shù)據(jù)賦值{base::assign(p1,p2);}//調用基類成員函數(shù)
intinc1(){returnbase::inc1();}//調用基類成員函數(shù)
intinc2(){returnbase::inc2();}intinc3(){return++x3;}voiddisplay(){cout<<"derive1x3="<<x3<<"\n";}};classderive2:publicbase//定義一個公有派生類{intx4;public:derive2(intp4){x4=p4;}intinc1(){inttemp=base::inc1();
temp=base::inc1();temp=base::inc1();returnbase::inc1();}intinc4(){return++x4;}voiddisplay(){base::display();cout<<"derive2x4=“;cout<<x4<<"\n";}};voidmain(){basep;p.assign(-2,-2);p.display();derive1d1(-4);d1.assign(10,10);d1.inc1();d1.display();derive2d2(5);d2.assign(-6,-6);d2.display();d2.inc1();d2.inc2();d2.display();d2.base::inc1();d2.display();}顯示基類成員basex1=-2x2=-2顯示d1的私有對象x3的值derive1x3=-4basex1=-6x2=-6derive2x4=5basex1=-2x2=-5derive2x4=5basex1=-1x2=-5derive2x4=5§8.3單繼承在單繼承中,一個基類可以生成多個派生類,但是每個派生類只能有一個基類,從而形成一個樹型的層次結構?!?.3單繼承一、派生類對基類成員的訪問權classA{public:voidf1();protected:intj1;private:inti1;};classB:publicA{public:voidf2();protected:intj2;private:inti2;};classC:publicB{public:voidf3();};例1ABCf1()j1i1publicprotectedprivatef2()j2i2publicprotectedprivatef3()publicpublicpublic§8.3單繼承一、派生類對基類成員的訪問權ABCf1()j1i1publicprotectedprivatef2()j2i2publicprotectedprivatef3()publicpublicpublic1.派生類B中成員函數(shù)f2()能否訪問基類A中的成員f1(),i1,j1?理論1:公有繼承時,派生類的成員函數(shù)可訪問基類中的公有成員和保護成員?!?.3單繼承一、派生類對基類成員的訪問權ABCf1()j1i1publicprotectedprivatef2()j2i2publicprotectedprivatef3()publicpublicpublic2.派生類B的對象b能否訪問基類A中的成員f1(),i1,j1?理論2:公有繼承時,派生類的對象只能訪問基類中的公有成員。b§8.3單繼承一、派生類對基類成員的訪問權ABCf1()j1i1publicprotectedprivatef2()j2i2publicprotectedprivatef3()publicpublicpublic3.派生類C中成員函數(shù)f3()能否訪問基類B中的成員f2(),i2,j2?能否訪問基類A中的成員f1(),i1,j1?理論3:公有繼承時,派生類的派生類中的成員函數(shù)可訪問基類中的公有成員和保護成員?!?.3單繼承一、派生類對基類成員的訪問權ABCf1()j1i1publicprotectedprivatef2()j2i2publicprotectedprivatef3()publicpublicpuclic4.派生類C的對象c能否訪問基類B中的成員f2(),i2,j2?能否訪問基類A中的成員f1(),i1,j1?理論4:公有繼承時,派生類的派生類的對象只能訪問基類中的公有成員。c§8.3單繼承一、派生類對基類成員的訪問權公有繼承時,基類中的公有成員和保護成員可被派生類的成員函數(shù)訪問,基類中僅有公有成員才可被派生類的對象訪問??偨Y#include<iostream.h>classA{public:voidf(inti){cout<<i<<endl;}private:voidg(){cout<<“A\n”;}};classB:A{public:voidh(){cout<<“B\n”;}A::f;};voidmain(){Bb;b.f(10);b.g();b.h();}例2errorC2248:'g':cannotaccessprivatememberdeclaredinclass'A'1.執(zhí)行該程序時,編譯能夠通過嗎?一、派生類對基類成員的訪問權#include<iostream.h>classA{public:voidf(inti){cout<<i<<endl;}private:voidg(){cout<<“A\n”;}};classB:A{public:voidh(){cout<<“B\n”;}A::f;};voidmain(){Bb;b.f(10);
//b.g();b.h();}例210B2.去掉出錯語句后,執(zhí)行該程序后輸出結果如何?一、派生類對基類成員的訪問權私有繼承時,派生類的成員函數(shù)可以訪問基類中的公有成員和保護成員;派生類的對象不能訪問基類中的任何成員??偨Y#include<iostream.h>classA{public:voidf(inti){cout<<i<<endl;}private:voidg(){cout<<“A\n”;}};classB:A{public:voidh(){cout<<“B\n”;}A::f;};voidmain(){Bb;b.f(10);
//b.g();b.h();}例2一、派生類對基類成員的訪問權§8.3單繼承一、派生類對基類成員的訪問權保護繼承時,派生類中的成員函數(shù)可以訪問基類中的公有成員和保護成員,而該派生類的對象不能訪問基類中的任何成員??偨Y§8.3單繼承二、派生類的構造函數(shù)和析構函數(shù)派生類構造函數(shù)的一般形式如下:1.派生類的構造函數(shù)<派生類名>(<派生類構造函數(shù)總參數(shù)表>):<基類構造函數(shù)>(<參數(shù)表1>),<子對象名>(<參數(shù)表2>){<派生類中數(shù)據(jù)成員初始化>}§8.3單繼承1.派生類構造函數(shù)的名字同派生類名。<派生類名>(<派生類構造函數(shù)總參數(shù)表>):<基類構造函數(shù)>(<參數(shù)表1>),<子對象名>(<參數(shù)表2>){<派生類中數(shù)據(jù)成員初始化>}說明2.派生類構造函數(shù)總參數(shù)表中包含后面<參數(shù)表1>和<參數(shù)表2>中所有參數(shù)的總和。3.派生類構造函數(shù)的調用順序:基類構造函數(shù)子對象構造函數(shù)派生類構造函數(shù)§8.3單繼承#include<iostream.h>classA{public:A(){cout<<“Aconstructor”<<endl;}};classB:publicA{public:B(){cout<<“Bconstructor”<<endl;}};voidmain(){Bb;}例1執(zhí)行結果:AconstructorBconstructor#include<iostream.h>classA{public:A(){cout<<“Aconstructor1”<<endl;}A(inti){x1=i;cout<<“Aconstructor2”<<endl;}voiddispa(){cout<<“x1=”<<x1<<endl;}private:intx1;};classB:publicA{public:B(){cout<<“Bconstructor1”<<endl;}B(inti):A(i+10){x2=i;cout<<“Bconstructor2”<<endl;}voiddispb(){dispa();cout<<“x2=”<<x2<<endl;}private:intx2;};例2Aconstructor2Bconstructor2x1=12x2=2voidmain(){Bb(2);b.dispb();}§8.3單繼承二、派生類的構造函數(shù)和析構函數(shù)派生類析構函數(shù)的執(zhí)行順序:
先執(zhí)行派生類的析構函數(shù)
再執(zhí)行基類的析構函數(shù)2.派生類的析構函數(shù)#include<iostream.h>classA{public:A(){cout<<“Aconstructor”<<endl;}~A(){cout<<“Adestructor”<<endl;}};classB:publicA{public:B(){cout<<“Bconstructor”<<endl;}~B(){cout<<“Bdestructor”<<endl;}};voidmain(){Bb;}例AconstructorBconstructorBdestructorAdestructor§8.3單繼承二、派生類的構造函數(shù)和析構函數(shù)①在基類中定義了默認構造函數(shù)或者沒有定義任何構造函數(shù)時,派生類構造函數(shù)中省略對其基類構造函數(shù)的調用。3.派生類構造函數(shù)使用中應注意的問題在基類中定義有默認構造函數(shù)或者沒有定義任何構造函數(shù)時,派生類構造函數(shù)中省略對其基類構造函數(shù)的調用。B():A(){b1=b2=0;}B(inti):A(){b1=0;b2=i;}§8.3單繼承二、派生類的構造函數(shù)和析構函數(shù)②當基類的構造函數(shù)使用一個或多個參數(shù)時,派生類必須定義構造函數(shù),提供將參數(shù)傳遞給基類構造函數(shù)的途徑。3.派生類構造函數(shù)使用中應注意的問題當基類的構造函數(shù)使用一個或多個參數(shù)時,派生類必須定義構造函數(shù),提供將參數(shù)傳遞給基類構造函數(shù)的途徑?!?.4多繼承一、多繼承的概念多繼承與單繼承的區(qū)別僅在于它們基類的個數(shù)。單繼承多繼承§8.4多繼承二、多繼承派生類的構造函數(shù)<派生類名>(<總參數(shù)表>):<基類名1>(<參數(shù)表1>),<基類名2>(<參數(shù)表2>),<子對象名3>(<參數(shù)表3>),…{<派生類構造函數(shù)體>}注意:各個基類構造函數(shù)的執(zhí)行順序取決于定義派生類時所指定的各個基類的順序,而與派生類構造函數(shù)的成員初始化列表中給定的基類順序無關?!?.4多繼承三、多繼承中的二義性問題解決辦法:使用作用域限定符::§8.5應用舉例編寫一個日期和時間的程序.要求有三個類:日期類Date,時間類Time,這兩個類的派生類DateTime。DateTimeTimeDate{Date(),Date(int,int,int),GetStringDate(),Year,Month,Day}{Time(),Time(int,int,int),GetStringTime(),Hours,Minutes,Seconds}{TimeDate(),TimeDate(int,int,int,int,int,int),GetStringDT()}string80DemoStr;string80&Date;typedefcharstring80[80];類型定義語句,定義新類型string80DemoStr是一個具有80個元素的一維的字符數(shù)組。Date是一個具有80個元素的一維的字符數(shù)組的引用。sprintf()是一個帶格式的拷貝字符串函數(shù),該函數(shù)的一般格式如下:sprintf(<字符數(shù)組名>,<格式符>,<參數(shù)表>);練習1.下列對派生類的描述中,()是錯誤的.一個派生類可以作為另一個派生類的基類B.派生類至少應有一個基類C.基類中成員的訪問權限繼承到派生類中都保持不變D.派生類的成員除了自己定義的成員外,還包括了它的基類的成員√2.派生類的對象對它的哪一類基類成員是可以訪問的.公有繼承的基類公有成員B.公有繼承的基類保護成員C.公有繼承的基類私有成員D.保護繼承的基類公有成員√3.描述一個學校的情況,它要描述的對象是教師和學生。因為教師和學生之間有很多相同的消息,如姓名、年齡等,所以可抽象出一個基類person;而學生類student和教師類teacher作為person類的派生類。寫出正確結果。
#include<iostream.h>classperson{char*name;intage;public:person(){cout<<“personconstructor”<<endl;}~person(){cout<<“persondestructor”<<endl;}};classstudent:publicperson{char*department;intlevel;public:student(){cout<<“studentconstructor”<<endl;}~student(){cout<<“studentdestructor”<<endl;}};classteacher:publicperson{char*major;floatsalary;public:teacher(){cout<<“teacherconstructor”<<endl;}~teacher(){cout<<“teacherdestructor”<<endl;}};voidmain(){students1;
teachert1;}執(zhí)行結果:personconstructorstudentconstructorpersonconstructorteacherconstructorteacherdestructorpersondestructorstudentdestructorpersondestructor4.編寫一個教師和學生數(shù)據(jù)的輸入和顯示程序。學生數(shù)據(jù)有編號、姓名、班號和成績,教師數(shù)據(jù)有編號、姓名、職稱和部門。要求將編號、姓名輸入和顯示設計成一個類person;并作為學生數(shù)據(jù)操作類student和教師數(shù)據(jù)操作類teacher的基類。第二章C++語言初步初識C++程序C++語言的基本符號C++語言的詞匯C++程序的基本框架運行C++程序C++的運行環(huán)境§2.2C++語言的基本符號一、基本符號分類
每種語言都用一組字符來構造有意義的語句。C++程序是用下列字符所組成的字符集寫成的:大小寫英文字母:a~z,A~Z數(shù)字字符:0~9特殊字符:空格!#%^&*_(下劃線)
-+=~<>/\|.,:;?’”()[]{}$@§2.2C++語言的基本符號二、基本符號的ASCII編碼P31例:charcl=‘a(chǎn)’;
inti=cl;
cout<<cl<<endl<<i;輸出結果:a97§2.3C++語言的詞匯一、關鍵字(保留字)關鍵字是一類有特定的專門含義的單詞。
在程序中用到的其他名字(標識符)不能與C/C++的關鍵字有相同的拼法和大小寫。關鍵字也不能重新定義。注§2.3C++語言的詞匯一、關鍵字(保留字)①C++的關鍵字一般包含了幾乎所有的C
語言的關鍵字說明②C++的關鍵字集是在不斷變化的③不同版本的C++的關鍵字集可能不同補充:基本關鍵字表asmautobreakcasecatchcharclassconstcontinuedefaultdeletedodoubleelseenumexternfloatforfriendgotoifinlineintlongnewoperatorprivateprotectedpublicregisterreturnshortsignedsizeofstaticstructswitchtemplatethisthrowtrytupedefunionunsignedvirtualvoidvolatilewhile§2.3C++語言的詞匯二、標識符標識符是由程序員為程序中的各種成份——
變量,有名常量,用戶定義的類型,枚舉類型的值,函數(shù)及其參數(shù),類,對象等所起的名字。說明
標識符必須符合以下規(guī)則:§2.3C++語言的詞匯標識符必須符合的規(guī)則:1.不能是C++關鍵字,如for,if,case等不可作標識符;2.標識符中字母區(qū)分大小寫,如Abc與abc被認為是兩個不同的標識符。而關鍵字不區(qū)分大小寫,如for,F(xiàn)OR,F(xiàn)or,foR都認為是同一關鍵字;3.第一個字符必須是字母或下劃線;§2.3C++語言的詞匯標識符必須符合的規(guī)則:4.不要太長,一般不超過31個字符為宜(太長則書寫困難,反為不美);5.不能以數(shù)字開頭。如C5合法,而5C則為非法;6.中間不能有空格。如map合法,而map則為非法;§2.3C++語言的詞匯標識符必須符合的規(guī)則:7.變量名不能包含.;,”
’
+-之類的特殊符號。實際上,標識符中除了能使用26個英文字母的大小寫和數(shù)字之外,只能使用下劃線_。numberOfStudentnumOfStudentDx6y命名的方式?jīng)Q定了程序書寫的風格補充:介紹幾種常用的命名方式1.駱駝表示法:mycarmy_carmyCar易讀,但是下劃線書寫困難標識符中不能出現(xiàn)空格補充:介紹幾種常用的命名方式2.匈牙利標記法:iMycaripMycar表示整型指針變量表示整型變量在每個變量名的前面加上若干表示類型的字符§2.3C++語言的詞匯三、字面常量
常量:C++程序中的常量是指固定不變的量。字面常量有名常量例如:圓周率pai=3.1416Int型常量float型常量char型常量字符串常量§2.3C++語言的詞匯三、字面常量即整型常量,可用3種形式表示:⑴Int型常量:①十進制整數(shù)。如123,-456,0,79834等。
如果某個整數(shù)超出了一般整數(shù)的表示范圍,系統(tǒng)可自動按長整型(longint)來處理。如79834L表示長整型。若此字面整數(shù)超出了長整型范圍,系統(tǒng)將發(fā)出警告。注§2.3C++語言的詞匯三、字面常量即整型常量,可用3種形式表示:⑴Int型常量:②八進制整數(shù)
以零開頭的整數(shù)表示八進制整數(shù)。如0123,表示(123)8?!?.3C++語言的詞匯三、字面常量即整型常量,可用3種形式表示:⑴Int型常量:③十六進制整數(shù)
以零和字母x開頭或以零和字母X開頭的整數(shù)表示十六進制整數(shù)。如0x123或0X123,表示(123)16?!?.3C++語言的詞匯三、字面常量即實型常量,實數(shù)在C++中就是浮點數(shù)。實數(shù)有2種表示:⑵float型常量:①定點數(shù)形式:如0.123,.456,0.0等。②指數(shù)形式:如123e5,123E5都表示123×105?!?.3C++語言的詞匯三、字面常量⑵float型常量:單精度(float)48f或F后綴34.5f
雙精度(double)810默認34.5
長雙精度
(longdouble)1019l或L后綴34.5e2L種類占用內存有效數(shù)字表示形式舉例§2.3C++語言的詞匯三、字面常量即字符常量,是用單引號括起來的一個字符。如‘a(chǎn)’,‘?’等。⑶char型常量:C++還允許使用一種特殊形式的字符常量,即以“\”開頭的字符序列,如‘\n’。注0表示一個整數(shù)值‘0’表示一個數(shù)字字符,其ASCII碼等于48或0x30。§2.3C++語言的詞匯三、字面常量即用雙引號括起來的字符序列。⑷字符串常量:①字符常量和字符串常量是不同的。說明HELLO‘\0’H§2.3C++語言的詞匯三、字面常量即用雙引號括起來的字符序列。⑷字符串常量:②不能將字符串常量賦給字符常量。例如:說明charc=“abc”;//error§2.3C++語言的詞匯三、字面常量即用雙引號括起來的字符序列。⑷字符串常量:說明③單個字符的字符串與字符在輸出的表示上沒有差別,因為字符串輸出時,
C++并不把0結束符一同輸出。例如:cout<<“a”<<endl;cout<<‘a(chǎn)’<<endl;輸出結果為:aa§2.3C++語言的詞匯四、運算符說明①C++語言的運算符和運算形式很豐富,要尤其注意一些包含混和操作的運算符。如++、--、+=、-=等的功能和用法。②C++語言的某些運算符有多種含義。如*的用法。(第三章詳述)§2.4C++程序的基本框架一、SP框架main用戶定義函數(shù)全局變量庫函數(shù)入口出口
從結構設計的觀點,一個C++程序由下面幾個部分組成:主函數(shù)、用戶定義函數(shù)、庫函數(shù)、全局說明。另外還包括預處理命令和注釋。§2.4C++程序的基本框架二、OOP框架
按照面向對象程序設計的思想,其主體是若干類定義的集合。理想的C++程序應由以下幾部分組成:類的定義主函數(shù)注釋預處理命令包括類的說明及類成員函數(shù)的類外定義程序的入口分布于程序各處把程序文件劃分成若干.h和.cpp文件§2.5運行C++程序從C++源程序到可執(zhí)行程序的步驟:
編輯、預處理、編譯、鏈接、調試C++源程序C++預處理后的C++源程序目標程序可執(zhí)行程序運行編輯器預處理器C++編譯器鏈接器程序員調試出錯信息第三章基本數(shù)據(jù)類型與基本運算包含簡單計算的C++程序基本類型及其派生類型說明語句基本運算符§3.1包含簡單計算的C++程序一、程序實例:求和#include<iostream.h>voidmain(){inta,b,sum;//說明三個整型變量
a=43;b=37;//賦值語句
sum=a+b;//“+”、“=”是C++的算術運算符
cout<<“Thesumis”<<sum;cout<<endl;}P55§3.1包含簡單計算的C++程序二、程序實例:計算圓面積#include<iostream.h>voidmain(){constfloatpai=3.14;//說明浮點型常量
floatradius;cout<<“Enterradius:”;cin<<radius;floatarea=pai*radius*radius;//說明后即被賦值
cout<<“\nTheareaofcircleis”<<area<<endl;}P56§3.2基本類型及其派生類型一、C++的數(shù)據(jù)類型C++程序中的數(shù)據(jù)類型以如下不同類型的形式出現(xiàn):1.基本類型2.用戶定義類型3.導出類型
由系統(tǒng)定義。C++語言在int,float,char,void四種基本類型的基礎上又給出了若干類型的派生類型。
是OOP區(qū)別于一般SP語言的主要特征之一。C++既可以定義象棧、隊列、集合、布爾類型等多種數(shù)據(jù)類型,又可以結合具體問題定義象學生、汽車等類型。
由已定義類型的某種確定的方式產(chǎn)生的新類型,主要指數(shù)組、指針和引用類型?!?.2基本類型及其派生類型二、C++的基本類型2.float型3.char型4.void型float型數(shù)據(jù)占4個字節(jié)空間,取值范圍為-3.4E(+/-)38~3.4E(+/-)38,可應用于部分運算。char型數(shù)據(jù)占1個字節(jié)空間,值集為全部基本字符,ASCII碼集或擴充ASCII碼集對應的全部符號。char型可看作是字符的整型,因此可參與的運算相當多。無值型。1.int型int型數(shù)據(jù)占2個字節(jié)空間,取值范圍為-32768~32767,可參與幾乎所有的運算?!?.2基本類型及其派生類型2.float型3.char型4.void型說明1.int型①void指沒有數(shù)值的數(shù)據(jù)類型。沒有任何返回值的函數(shù)應被說明為void類型。如:
voidfn();
在函數(shù)體內,可以使用return語句,但return
之后不能有任何表達式
(C++對此檢查非常嚴格)②void也會出現(xiàn)在函數(shù)體說明中。如:
intg(void);
此語句說明g()是一個不需要任何入口參數(shù)的函數(shù),并且返回一個int類型的值。C++中,也可以寫成:intg();③不能把數(shù)據(jù)說明成void型,因為變量說明成沒有任何值是沒有意義的。④void型可以說明指針,
void指針在C++中是一種普通指針類型(傳統(tǒng)的C
中被當成字符指針),如
void*ptr;
指針ptr可以被賦給指向任何類型的指針?!?.2基本類型及其派生類型三、基本類型的派生類型
基本類型經(jīng)過簡單的字長及范圍放大或縮小,就形成了基本類型的簡單派生類型。派生類型的說明符由int、float、char前面加上類型修飾符組成。類型修飾符包括:shortlongsignedunsingeddoubleP61§3.2基本類型及其派生類型四、enum類型enum類型又稱枚舉類型,它是一種由用戶參與定義的類型。其格式為:enum<enum類型名>{<枚舉值表>}<枚舉變量表>;enumcolor{red,blue,green,white};例§3.2基本類型及其派生類型四、enum類型⒈一個enum類型實際上是int型的一個子集,其每一個值代表一個整數(shù)。說明⒉幾個枚舉值全未賦值時,它們自左至右分別與整數(shù)0、1、…n-1相對應?!?.2基本類型及其派生類型四、enum類型⒊若第i個枚舉值賦常量值為整數(shù)m,則未賦值的后續(xù)枚舉值分別與整數(shù)m+1、
m+2對應,直到下一個賦了值的枚舉值或結束。說明enumcolor{red=100,blue=200,green,white=400};§3.2基本類型及其派生類型四、enum類型⒋枚舉類型的說明也可作為成組說明若干整形符號常量的方法。說明⒌C++的enum類型只有一個賦值操作,不能進行任何算術運算,也不能通過強制類型轉換而直接給enum類型賦整數(shù)值?!?.2基本類型及其派生類型四、enum類型⒍定義了枚舉類型之后,枚舉變量的取值只能取枚舉類型定義時規(guī)定的值。說明colorpaint=green;colorpaint=200;//error§3.3說明語句一、語句2.表達式語句3.控制語句4.復合語句和空語句1.說明語句§3.3說明語句一、語句2.表達式語句3.控制語句4.復合語句和空語句1.說明語句對程序中所用到的名字標識符在使用前加以定義和說明,有的還同時給與初始化?!?.3說明語句一、語句2.表達式語句3.控制語句4.復合語句和空語句1.說明語句程序中要求計算機對數(shù)據(jù)進行處理和操作的語句?!?.3說明語句一、語句2.表達式語句3.控制語句4.復合語句和空語句1.說明語句程序中用來控制語句執(zhí)行次序的語句?!?.3說明語句一、語句2.表達式語句3.控制語句4.復合語句和空語句1.說明語句
復合語句是用“{”和“}”括起來的若干語句,又稱為“塊”或“塊語句”??照Z句是一個特殊的表達式語句,不做任何事情?!?.3說明語句二、常量和變量常量(constant):在程序執(zhí)行過程中其值不能改變的數(shù)據(jù)稱為常量。變量(variable):在程序執(zhí)行過程中其值可以改變的數(shù)據(jù)稱為變量?!?.3說明語句三、常量說明const<類型名><常量名>=<表達式>;例如:constintN=2000;constfloatpai=3.14159;§3.3說明語句三、常量說明例如:constfloatpai;pai=3.14159;//error說明⒈定義成const后的常量,程序中對其只能讀不能修改,由于不可修改,所以常量定義時必須初始化?!?.3說明語句三、常量說明例如:
constintnumber=max(8,3);//error
說明⒉常量名不能放在賦值語句的左邊。補充:關于#define
在編譯預處理命令中使用宏替換定義符號常量的方法與用const方式定義的方法有所不同:
#definepai3.14159;
宏替換是在編譯時把程序中出現(xiàn)的所有標識符pai都用3.14159來替換,僅僅是兩個字符串的代換,并不是一個具有一定類型的常量名,隨后的編譯無法發(fā)現(xiàn)由它引起的數(shù)據(jù)類型誤用的錯誤?!?.3說明語句四、變量說明[<存儲類>]<類型名或類型定義><變量名表>;例如:
intsize,high,temp=37;staticlongsum;autofloatt=0.5;§3.3說明語句四、變量說明說明①在同一語句里不能混合定義不同類型的變量。②存儲類:自動變量auto寄存器變量register靜態(tài)變量static外部變量extern缺省,按自動變量處理[<存儲類>]<類型名或類型定義><變量名表>;§3.3說明語句四、變量說明說明③類型名和類型定義不可缺省,用以指定數(shù)據(jù)類型。④變量名表:列出該說明語句所定義的同一類型的變量及其初值。其格式為:<變量名>[=<表達式>],<變量名表>[<存儲類>]<類型名或類型定義><變量名表>;§3.3說明語句四、變量說明1.全局變量和局部變量全局變量:其說明語句不在任何一個類定義、函數(shù)定義和復合語句之內的變量。即包含在某一對“{”和“}”之外的變量。占用內存的數(shù)據(jù)區(qū),在程序運行過程中位置不變?!?.3說明語句四、變量說明1.全局變量和局部變量局部變量:其說明語句在某一類定義、函數(shù)定義和復合語句之內的變量。即包含在某一對“{”和“}”之內,所占空間為程序運行時設置的臨時工作區(qū),以堆棧的形式允許反復占用和釋放?!?.3說明語句四、變量說明2.生存期與作用域生存期:變量a的生存期是指從a被說明且分配了內存開始,直到該說明語句失去效力,相應內存被釋放為止,稱為該變量的生存期。全局變量的生存期局部變量的生存期§3.3說明語句四、變量說明2.生存期與作用域作用域:變量a的作用域是指a可以代表該變量的范圍。#include<iostream.h>voidfn(inty)//y作用域開始{intx=1;//x作用域開始
if(x>y)cout<<x<<endl;elsecout<<y<<endl;}//x和y作用域結束例1描述作用域的概念#include<iostream.h>intid=3;voidmain(){id=5;{intid=7;cout<<“id=”<<id<<endl;//輸出7}cout<<“id=”<<id<<endl;//輸出5}例2不同作用域的同名變量#include<iostream.h>intn;voidfn(){cout<<“m=”<<m<<endl;//errorcout<<“n=”<<n<<endl;//ok}voidmain(){doublem=3.8;cout<<“n=”<<n<<endl;//okfn();}例3全局變量和局部變量§3.3說明語句四、變量說明3.變量的存儲類型⑴auto變量⑵register變量⑶static變量該變量在程序的臨時工作區(qū)中獲得存儲空間,為默認值。當寄存器夠用時,可以以寄存器作為存儲空間。⑷extern變量§3.3說明語句四、變量說明3.變量的存儲類型⑴auto變量⑵register變量⑶static變量靜態(tài)變量和全局變量一樣,在內存數(shù)據(jù)區(qū)分配空間,在整個程序運行中不釋放。說明②靜態(tài)變量如未賦初值,系統(tǒng)將自動為其賦默認初值0(NULL)。③靜態(tài)變量的說明語句在程序執(zhí)行過程中多次運行或多次被同樣說明時,其第一次稱為定義性說明,進行內存分配和賦初值操作,在以后的重復說明時僅維持原狀,不再做賦初值的操作。⑷extern變量//example1.cpp#include<iostream.h>intn;voidfn();voidmain(){n=20;cout<<n<<endl;fn();}//example2.cpp#include<iostream.h>staticintn;//全局靜態(tài)變量voidfn(){n++;cout<<n<<endl;}運行結果:201§3.3說明語句全局靜態(tài)變量使該變量成為定義該變量的源文件所獨享?!?.3說明語句四、變量說明3.變量的存儲類型⑴auto變量⑵register變量⑶static變量⑷extern變量①一般用于由多個文件組成的程序中,避免重復分配內存。帶extern的變量是變量聲明,不是變量定義。說明②如果共同變量一次都沒有定義,或者在各個文件中分別定義,造成定義多次,或者聲明的類型不一致,都會造成直接或間接的錯誤。例如://file1.cppinta=5;intb=6;externintc;//file2.cppinta;//error:多次定義externdoubleb;//error:類型不一致externintc;//error:無定義§3.3說明語句
兩個源文件都以常規(guī)方式定義變量a,沒有一個聲明extern,若在VC環(huán)境下,會在鏈接時,給出一個錯誤信息:intaalreadydefinedinfile1.obj
兩個源文件的b類型不一致,VC在鏈接時報告一個錯誤信息:linkerror:unresolvedexternal
兩個源文件都聲明了變量c為extern,這時編譯不會出錯,鏈接時卻會找不到該變量,產(chǎn)生一個鏈接錯誤,因為沒有一個文件為該變量分配空間例1//file1.cpp#include<iostream.h>voidfn1();voidfn2();intn;voidmain(){n=3;fn1();cout<<n<<endl;}voidfn1(){fn2();}//file2.cppexternintn;//n由另一個源
//文件定義voidfn2(){n=8;//使用n}運行結果:8§3.3說明語句例2§3.3說明語句五、類型說明
作用:由用戶為一個已定義的類型賦予一個新的類型名。typedeftypedef<已定義類型名><新類型名>;typedefintid_number;typedeffloattemprature;例測試題
面向對象程序設計將數(shù)據(jù)與___放在一起,做為一個相互依存、不可分割的整體來處理。A對數(shù)據(jù)的操作B信息C數(shù)據(jù)隱藏D數(shù)據(jù)抽象A2面向對象程序設計優(yōu)于傳統(tǒng)的結構化程序設計,其優(yōu)越性主要表現(xiàn)在,它有希望解決軟件工程的兩個主要問題:軟件復雜性控制和___。A精化已有的代碼B編寫可重用代碼C共享代碼D軟件生產(chǎn)率的提高D3C++對C語言作了很多改進,下列描述中___使得C語言發(fā)生了質變,即從面向過程變成了面向對象。A增加了一些新的運算符B允許函數(shù)重載,并允許設置默認參數(shù)C規(guī)定了函數(shù)說明必須用原型D引進了類和對象的概念D4在C語言中合法的字符型常量是___。A“A”B‘t’C65DAB字符常量是用單引號括起來的一個字符。5下列變量名中___是合法的。ACHINABbyte-sizeCdoubleDA+aA第九章多態(tài)性和虛函數(shù)§9.1運算符的重載§9.2靜態(tài)聯(lián)編和動態(tài)聯(lián)編§9.3虛函數(shù)§9.4純虛函數(shù)和抽象類§9.5虛析構函數(shù)面向對象程序設計語言的三大特性:封裝性繼承性多態(tài)性指同一個接口名稱有多種功能用戶單一接口名稱功能1功能n…§9.1運算符重載1.運算符的重載實際上是函數(shù)的重載。重載的形式是:
<類型>operator<運算符號>(<參數(shù)說明>);一、運算符重載中的幾點說明ClassA(){//…intoperator+(A&,A&);//兩個A類對象的加法}例§9.1運算符重載2.只有以下幾種運算符不能重載:·::·*?:例如:intoperator::(int,int);一、運算符重載中的幾點說明intoperator@(int,int);§9.1運算符重載3.運算符重載遵循著“四個不變”的原則:①優(yōu)先級不變②結合性不變③操作數(shù)個數(shù)不變④語法結構不變一、運算符重載中的幾點說明重載為類的成員函數(shù)注:單目運算符采用成員函數(shù)形式重載時,
該<參數(shù)表>無參數(shù);雙目運算符采用成員函數(shù)形式重載時,該<參數(shù)表>中有一個參數(shù)。二、運算符重載的兩種形式<類名>operator<運算符>(<參數(shù)表>){…}§9.1運算符重載#include<iostream.h>classPoint{intx,y;public:Point(){}Point(inti,intj){x=i;y=j;}voiddisp(){cout<<“(”<<x<<“,”<<cout<<y<<“)”<<endl;}Pointoperate+(Point&p){returnPoint(x+p.x,y+p.y);}};voidmain(){Pointp1(3,4);Pointp2(2,9);Pointp3;p3=p1+p2;p3.disp();}執(zhí)行結果:(5,13)例如:重載運算符“+”為類的成員函數(shù),該運算符實現(xiàn)兩點坐標的相加運算。p1.operator+(p2)2.重載為友元函數(shù)注:①有些運算符不能重載為友元函數(shù),必須重載為成員函數(shù):二、運算符重載的兩種形式friend<類型>operator<運算符>(<參數(shù)表>){…}§9.1運算符重載=()[]->2.重載為友元函數(shù)二、運算符重載的兩種形式friend<類型>operator<運算符>(<參數(shù)表>){…}§9.1運算符重載注:②單目運算符被重載為友元函數(shù)時,
該<參數(shù)表>有一個參數(shù);雙目運算符被重載為友元函數(shù)時,該<參數(shù)表>
有兩個參數(shù)。#include<iostream.h>classPoint{intx,y;public:Point(){}Point(inti,intj){x=i;y=j;}voiddisp()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 質量管理在商業(yè)項目中的應用案例
- 恒定流能量方程式熱工流體課件
- 招聘物業(yè)保安合同范本
- 長垣烹飪職業(yè)技術學院《電子商務概論》2023-2024學年第二學期期末試卷
- 湘潭大學《計算機平面設計》2023-2024學年第二學期期末試卷
- 上虞市2025屆四年級數(shù)學第二學期期末調研試題含解析
- 河北資源環(huán)境職業(yè)技術學院《nux系統(tǒng)與大數(shù)據(jù)應用》2023-2024學年第二學期期末試卷
- 食品安全管理從源頭預防食品衛(wèi)生事故
- 石材供貨協(xié)議合同范本
- 貴州體育職業(yè)學院《能源類專業(yè)寫作》2023-2024學年第二學期期末試卷
- 中國銀行海爾多聯(lián)機方案書
- 涂布機初級操作技術與維修培訓課件
- GB/T 8417-2003燈光信號顏色
- GB/T 7984-2001輸送帶具有橡膠或塑料覆蓋層的普通用途織物芯輸送帶
- GB/T 7631.10-2013潤滑劑、工業(yè)用油和有關產(chǎn)品(L類)的分類第10部分:T組(渦輪機)
- GB/T 7324-2010通用鋰基潤滑脂
- GB/T 28114-2011鎂質強化瓷器
- GB/T 15566.1-2020公共信息導向系統(tǒng)設置原則與要求第1部分:總則
- 三菱電梯LEHY-II、LEGY緊急救援的盤車裝置切換說明
- 新編物理基礎學(上下冊1-17章)課后習題(每題都有)詳細答案
- 現(xiàn)代漢語常用詞匯表(兩字)
評論
0/150
提交評論