版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
11.1實用的C++?編程11.2面向對象C++?編程11.3面向對象C++?編程應用本章小結
習題第11章C++編程
11.1實用的C++?編程11.1.1C++?概述
C++?語言最初是一個C語言的超集,稱為“面向對象的C”,后來,面向對象的概念廣泛深入人心,于是C++?開始被更多的人關注。目前在大中型軟件或規(guī)模較大的信息軟件中C++?有不可替代的作用,一般大型軟件多采用C++?開發(fā),而以其它語言作為輔助。在信息技術領域,如大中型電信計費系統(tǒng),大型銀行核算系統(tǒng),大型證劵交易系統(tǒng),電子商務交易支付系統(tǒng),全國工業(yè)、消費數(shù)據(jù)統(tǒng)計系統(tǒng),全國稅收征稽核算系統(tǒng),城市道路交通車輛監(jiān)視系統(tǒng),海關核算系統(tǒng),航空預售票、全國鐵路預售票系統(tǒng),電子政務系統(tǒng)等的底層應用軟件,以及幾乎全球所有的操作系統(tǒng)、大型數(shù)據(jù)庫系統(tǒng)軟件等多采用C++?進行開發(fā)。
C++?是為克服C的不足而出現(xiàn)的。其主要實現(xiàn)了面向對象、抽象、封裝性、繼承、多重繼承、字符串變量等特性,適宜于大中型程序與團隊協(xié)調的軟件開發(fā),雖效果、安全性好,但復雜度高,初學者掌握的難度大。下面列舉一個C++?程序示例,進行學習。試分析下面的程序,判斷程序執(zhí)行結果,從而理解C++?程序與C程序的不同點。#include<iostream>intmain(){usingnamespacestd; //使用std命名空間
intfactAry=0; //C語言風格聲明賦值語句intfact(1);
//典型C++風格聲明賦值語句,定義fact變量,并給其
賦初始值1do{cout<<"Factorialof:";//C++標準輸出,相當于C中的printf("Factorialof\n");
cin>>factAry;
//C++標準輸入
if(factAry<0){cout<<"nonegativevalue,please!"<<endl;}}while(factAry<0);inti=2;while(i<=factAry){fact=fact*i;
i=i+1;
}
cout<<"TheFactorialof"<<factAry<<"is"<<fact<<endl;return0;
}此程序是一段計算階乘的小程序,展示了C++?語法中的一些基本要素。通過上述程序,不難發(fā)現(xiàn)C++?程序和C語言程序并沒有太大的區(qū)別。程序中的第4行usingnamespacestd意思是導入命名空間std,在C++?中,標準庫中的符號都包含在命名空間std中。程序中的第6行是C++?典型的聲明賦值語句。
1.命名空間
C++?中的命名空間是由類、函數(shù)和對象組成的一個集合,其中的元素都可以通過名字前綴來定位。C++?語言提供一個全局的命名空間(namespace),可以避免全局命名沖突問題。此處以一個例子說明,請注意以下兩個頭文件:
one.h//頭文件1
charfunc(char);
classString{...};
somelib.h//頭文件2
classString{...};如果按照上述方式定義,那么這兩個頭文件不可能包含在同一個程序中,因為String類會發(fā)生沖突。所謂命名空間,是一種將程序庫名稱封裝起來的方法,它就像在各個程序庫的邊界上立起一道道分隔的圍墻。比如:
one.h
namespaceone
{
charfunc(char);
classString{...};
}
somelib.h
namespaceSomelib
{
classString{...};
}現(xiàn)在就算在同一個程序中使用String類也不會發(fā)生沖突了,因為它們分別變成了one::String()和somelib::String()。也即,通過聲明命名空間就可以區(qū)分不同的類或函數(shù)等。
2.輸入與輸出在本章的第一個例子中,命令#include<iostream>允許我們使用預定義的全局輸入/輸出流對象,分別如下:
cin:標準輸入流,默認為標準輸入設備,如計算機鍵盤。
cout:標準輸出流,默認為標準輸出設備,如控制臺屏幕。
cerr:標準出錯流,另一個輸出到控制臺屏幕的輸出流。在上述示例中,我們使用了一個全局流對象cout,通過調用其成員函數(shù)operator<<()把程序結果輸出到屏幕上,其標準語句如下:
cout.operator<<("Factorialof");而我們使用了省略掉成員函數(shù)名operator的一種更靈活、可讀性更好的語法:
cout<<"Factorialof";此操作符經過預定義,可以使用很多內置類型,如下所示:
cout<<"Thecostis$"<<29.35<<"for"<<6<<"iteams."<<'\n';實現(xiàn)了ostream的對象cout調用其函數(shù)operator<<()完成輸出。與ostream類似,在下面的示例中我們可以看到通過istream的對象cin調用其函數(shù)operator>>()來完成輸入。例如:通過istream的對象cin調用其函數(shù)operator>>()。程序如下:
#include<iostream>
#include<string>
intmain(){
usingnamespacestd;
constintTHISYEAR=2008;
stringyouName;
intbirthYear;cout<<"whatyouname?__"<<flush;cin>>yourName;
cout<<"hello"<<yourName<<",whatyearwereyouborn?";cin>>birthYear;cout<<"nicetomeetingyou!,"<<yourName<<"."<<"Andyouareapproximately"<<(THISYEAR-birthYear)<<"yearold."<<endl;}符號flush與endl是為了方便起見而加到命名空間std中的操作符,操作符(控制符)是對應函數(shù)的隱式調用,這些函數(shù)能夠以各種方式改變流對象的狀態(tài)。
3.輸入輸出流的控制符如果使用了控制符,程序開頭除了加<iostream>外,還要加<iomanip>。<iomanip>的作用是對cin、cout類的具體格式加以控制;它是I/O流控制頭文件,就像C程序里的格式化輸出一樣,如一些常見的控制函數(shù)的dec置基數(shù)為10,相當于“%d”;hex置基數(shù)為16,相當于“%X”;oct置基數(shù)為8,相當于“%o”等??刂品捌渥饔萌绫?1-1所示。表11-1<iomanip>的控制符及作用11.1.2C++?基本數(shù)據(jù)類型和一些參數(shù)
1.?C++?的基本數(shù)據(jù)類型
C++?支持的基本數(shù)據(jù)類型有布爾型(bool)、字符型(char和wchar_t)、整型(short,int,long)、浮點型(double,float,longdouble等)和指針(int*,char*,bool*,double*,void*等)。布爾型是用來表示邏輯值,或稱布爾值。布爾型數(shù)據(jù)的值只有兩個:True(邏輯真)和False(邏輯假)。其中,規(guī)定了False<TRUE,F(xiàn)ALSE的序號為0,TRUE的序號為1。字符型分普通字符型(通常指ASCII范圍)和漢字字符型,漢字字符型(wchar_t)是Unicode用的字符類型。在C++中,可用漢字字符型表示1個漢字字符,即用雙字母位表示一個漢字字符,也就是指漢字字符類型表示也可稱為英文字母的雙字符位。整型分短整型、整型和長整型。浮點型分雙精度、單精度和長雙精度。指針分整型、字符型、布爾邏輯型、雙精度和空指針等。各個數(shù)據(jù)類型所占空間的長度可通過下述程序來查看。各個數(shù)據(jù)類型所占空間的長度查看程序如下:
#include<assert.h>
#include<iostream>
#include<string>
intmain(){
usingnamespacestd;
inti=0;
chararray1[34]="thisisadreadedCarrayofchar";
chararray2[]="ifnotformain,wecouldavoiditentirely.";
char*charp=array1;stringstlstring="thisisanstandsrdlibrarystring.muchpreferred.";assert(sizeof(i)==sizeof(int));cout<<"sizeofchar="<<sizeof(char)<<"\n";cout<<"sizeofwchar_t="<<sizeof(wchar_t)<<"\n";cout<<"sizeofint="<<sizeof(int)<<"\n";cout<<"sizeoflong="<<sizeof(long)<<"\n";cout<<"sizeoffloat="<<sizeof(float)<<"\n";cout<<"sizeofdouble="<<sizeof(double)<<"\n";cout<<"sizeofdouble*="<<sizeof(double*)<<"\n";cout<<"sizeofarray1="<<sizeof(array1)<<"\n";cout<<"sizeofarray2="<<sizeof(array2)<<"\n"<<endl;cout<<"sizeofstring="<<sizeof(string)<<"\n"<<endl;cout<<"sizeofstlstring="<<sizeof(stlstring)<<"\n"<<endl;}
2.?main函數(shù)與命令行參數(shù)
main函數(shù)是程序啟動時調用的第一個函數(shù);如果程序接收命令行參數(shù),我們必須給main函數(shù)定義完整的形參列表。在C++?中,main()函數(shù)定義參數(shù)形式很靈活,因此可能會看到其定義類似于下面三種形式之一:
intmain(intargc,char*argv[])
intmain(intargc,char**argv)
intmain(intargCount,char*constargValue[])上面所有的形式都是合法的,均定義了兩個參數(shù),這些參數(shù)包含了從父進程(命令行Shell窗口管理器等)向程序傳遞命令行參數(shù)的充足信息。C++?中main函數(shù)的基本用法可由一段程序說明如下:
#include<iostream>
usingnamespacestd;
intmain(intargCount,char*argValue[]){
for(inti=0;i<argCount;++i){
cout<<"argv#"<<I<<"is"<<argValue[i]<<endl;
}
return0;
}編譯源文件,運行程序并傳遞一些參數(shù),我們將得到如圖11-1所示的輸出結果。圖11-1編譯C++源文件并運行程序的輸出結果不難發(fā)現(xiàn),第一個參數(shù)總是該可執(zhí)行文件的名字,其余的參數(shù)是命令行中由空格與制表符分隔而得到的字符串。如果要傳遞一個包含空格的字符串作為參數(shù),則需要用雙引號將這個字符串括起來。
3.?C++?標準庫字符串
C++?中有一個能方便用戶處理字符串的庫,它大大簡化了子程序中對字符串的構建和修改,這就是C++?標準庫字符串?,F(xiàn)以exmstring.cpp演示其基本的應用。程序如下:
#include<string>
#include<iostream>
intmain(){usingnamespacestd;strings1("this"),s2("isa"),s3("string");s1+=s2;strings4=s1+s3;cout<<s4<<endl;strings5("thelengthofthatstringis:");cout<<s5<<s4.length()<<"characters."<<endl;cout<<"Enterasentence:"<<endl;
getline(cin,s2);cout<<"Hereisyoursentence:\n"<<s2<<endl;cout<<"Thelengthofitwas:"<<s2.length()<<endl;}編譯并執(zhí)行成功后的結果如圖11-2所示。圖11-2程序運行結果
4.關鍵字const某個實體被聲明為const后,編譯器會將其視為只讀,所以用const修飾的對象必須在聲明時進行恰當?shù)某跏蓟?。例如?/p>
constintx=33;
constintv[]={1,6,x,2*x}針對上面的申明,下面的操作都是錯誤的:
++x;
v[2]=44;使用const實體來代替代碼中嵌入的常量表達式是一種非常好的編程風格,這為后期修改數(shù)值提供了便利,并提高了程序的可維護性。例如,在下面的代碼段中我們應該使用第二段代碼來代替第一段代碼:for(i=0;i<237;++i){
……
}
//聲明常量
contintSIZE=237;
……
for(i=0;i<SIZE;++i){
……
}
5.指針與內存的訪問
C和C++?允許通過指針直接訪問內存。
1)一元運算符&與*變量是一個能被編譯器識別的有名對象,可以將其名字當作變量本身進行使用。例如:intx=5,我們可以使用x來代表值為5的整型變量,也可以通過名字x來直接操作此整型變量,如:++x。對象是一個可以存儲數(shù)據(jù)的內存區(qū)域,每一個對象都有一個內存地址(數(shù)據(jù)在內存中的起始地址),一元運算符?&?可以用來返回某對象的地址,一般將其看做是取地址運算符,例如:&x,將返回變量x的內存地址。保存另外一個對象內存地址的對象稱為指針,我們稱該指針指向該存儲地址處的對象,即
int*y=&x;在上面的示例中,y指向整數(shù)x,int后面的?*?表明變量y是一個整型指針,此處,將整型指針y初始化為指向整型變量x。指針最強大的功能是:某類型指針可以指向一個不同但相關類型的對象。在C程序中,經常使用NULL這個宏來代表0。這是一個特殊的指針,它可以在指針初始化或者重新初始化時賦值給指針變量。0不是某個對象的地址,存儲了0的指針稱為空指針。相對于C中NULL的應用,建議在C++?中使用0。一元運算符?*?是引用運算符,當應用到非空指針時,返回指針指向對象的內容。以下為指針的一個實例。輸入程序如下:pointerdemo.cpp#include<iostream>usingnamespacestd;intmain(){intx=4;int*px=0;px=&x;
cout<<"x="<<x<<"\n"<<"px="<<px<<"\n"<<"&px="<<&px<<endl;*px=*px+1;cout<<"將指針加1(*px+1)運算之后!"<<endl;cout<<"x="<<x<<"\n"<<"*px="<<*px<<"\n"<<"px="<<px<<endl;cout<<"px+1="<<px<<"\n"<<"px++="<<px++<<"\n";return0;}編譯運行后的結果如圖11-3所示。
2)運算符new和delete
C++?支持運行時動態(tài)內存機制,這意味著程序員不必預先估計程序的內存需求也可以保證程序需要的最大內存量得到滿足,運行時動態(tài)內存分配是幫助程序員構建有效可擴展系統(tǒng)的強大工具。
new運算符從內存堆中分配內存,并且返回指向最新分配對象的指針,如果由于某種原因無法完成內存分配,就會彈出一個異常。
delete運算符則剛好相反,它用于釋放動態(tài)分配的內存,將其返回給內存堆。注意:對于每一個由new運算符返回的指針或者空指針,只能進行一次delete操作;并且,如果不對new運算符返回的指針進行delete操作,則會引起內存泄漏。例如以下代碼:
3)左值左值是指向某個對象的表達式。典型的左值包括變量、數(shù)組元素、解引用的指針等。從本質上說,左值是任何具有內存地址并且可以擁有別名的元素。在C++中,引用提供了一個給左值賦別名的機制,在避免變量復制時非常有用。例如向一個函數(shù)傳送一個非常大的對象作為參數(shù)。引用必須在聲明時進行初始化。要創(chuàng)建一個some類型對象的引用,必須聲明一個some類型的變量。例如:
intn;
int&rn=n;這樣就可以聲明一個rn的引用,引用變量rn是實際變量n的別名。注意,此時的&被當作類型修飾符,而不是一個取地址運算符。在整個生命周期中,引用變量都可以作為一個初始化該變量的實際左值的別名,但這種關系可以相互轉移。例如:inta=10,b=20;int&ra=a;ra=b; //此句是把20賦給了aconstintc=45; //c是一個常量,其值為只讀constint&rc=c; //給常量定義一個引用變量,但沒什么實際用處rc=10; //錯誤,因為常量數(shù)據(jù)不允許改變
4)取地址運算符和引用符的區(qū)分取地址運算符和引用符的區(qū)分有以下兩點:
(1)取地址運算符應用到一個對象上,返回其地址。
(2)當作為引用符時,它一定出現(xiàn)在引用名字聲明時,并出現(xiàn)在其左側。11.1.3類定義
1.類的概念
C++中有一種稱為類的數(shù)據(jù)類型,它非常類似于結構體。一個簡單的類定義類似于:
classclassname{
members
};類定義的第一行稱為類頭。類的特征包括數(shù)據(jù)成員、成員函數(shù)以及訪問限定符,其中成員函數(shù)用來操作或管理數(shù)據(jù)成員。類的成員函數(shù)規(guī)定了類的所有對象的行為,這些成員函數(shù)可以訪問該類的所有成員,而非成員函數(shù)則通過調用此類的成員函數(shù)來間接地操縱對象。一個對象數(shù)據(jù)成員的值集合稱為對象的狀態(tài)。類是一組具有相同屬性特征的對象的抽象描述,是面向對象程序設計的又一個核心概念。類是對象抽象的結果。有了類,對象就是類的具體化,是類的實例。類可以有子類,同樣也可以有父類,從而構成類的層次結構。類之間主要存在三種關系,分別是關聯(lián)、聚合和泛化。繼承是類之間的一種常見關系。這種關系為共享數(shù)據(jù)和操作提供了一種良好的機制。通過繼承,一個類的定義可以基于另外一個已經存在的類。繼承是面向對象程序設計方法的一個重要標志,利用繼承機制可以大大提高程序的可重用性和可擴充性。不同的類對象收到同一個消息可以產生完全不同的響應效果,這種現(xiàn)象叫做多態(tài)。利用多態(tài)機制,用戶可以發(fā)送一個通用的消息,而實現(xiàn)的細節(jié)由接收對象自行決定,這樣,同一個消息可能會導致調用不同的方法。面向對象有四個特性:抽象性、封裝性、繼承性和多態(tài)性。具體內容將在后文中加以介紹。為了定義一個類,通常把定義放在頭文件中,而該文件一般傾向于與類同名且后綴為.h。例如:
fraction.h
#ifndef_FRACTION_H_
#define_FRACTION_H_
#include<string>
Usingnamespacestd;
classFraction{
public:voidset(intnumerator,intdenominator);doubletoDouble()const;stringtoString()const;private:intm_Numerator;intm_Denominator;};#endif預處理過程通常會將某個文件包含的多個頭文件插入到此文件當中,這是為了防止一個頭文件在某個編譯過的文件中被錯誤地包含多次。通常使用#ifndef,#define…#endif預處理宏來將頭文件包裹起來。通常,我們把成員函數(shù)的實現(xiàn)放在類定義之外,并存放在一個單獨的擴展名為.cpp的實現(xiàn)文件中。任何類成員在類外部進行定義時,都需要使用作用域解析運算符,即在成員名之前使用“類名::”。作用域解析運算符告訴編譯器類的范圍擴展到了類定義之外,并且包含符號?::?與函數(shù)定義結束符之間的代碼。例如:fraction.cpp#include"fraction.h"#include<iostream>voidFraction::set(intnn,intnd){//作用域解析
m_Numerator=nn;m_Denominator=nd;}DoubleFraction::toDouble()const{return1.0*m_Numerator/m_Denominator;}StringFraction::toString()const{Ostringstreamsstr;sstr<<m_Numerator<<"/"<<m_Denominator;
returnsstr.str();//把流轉化成字符串}
2.構造函數(shù)和析構函數(shù)在面向對象的語言中,構造函數(shù)是一個比較重要的概念,構造函數(shù)在C++中用縮寫ctor表示,它是一種控制對象初始化過程的特殊成員函數(shù),每一個構造函數(shù)與其類同名,它沒有返回值,也沒有返回值類型。
1)構造函數(shù)定義在面向對象的語言中,程序在實際執(zhí)行的時候操作的都是對象,而對象的產生就是通過(隱式或顯式)調用構造函數(shù)初始化對象得到的。定義構造函數(shù)的語法格式如下:
Classname::classname(parameter_list):init_list
{
Constructorbody
}當(且僅當)一個類的定義中沒有提供任何構造函數(shù)時,編譯器會默認提供如下的一個構造函數(shù):
Classname::classname()
{}可以不帶參數(shù)進行調用的構造函數(shù)稱為默認構造函數(shù)。默認構造函數(shù)會對該類的對象進行默認初始化。例如:complex.hclassComplex{public:Complex(doublerealPart,doubleimPart);Complex(doublerealPart);Complex();private:doublem_R,m_T;}Complex.cpp#include"complex.h"#include<iostream>usingnamespacestd;Complex::Complex(doublerealPart,doubleimPart):m_R(realPart),m_I(imPart){Cout<<"Complex("<<m_R<<","<<m_I<<")"<<endl;}Complex(doublerealPart){Complex(doublerealPart,0);}Complex::Complex():m_R(0.0),m_I(0.0){}intmain(){Complexc1;//使用默認構造函數(shù)Complexc2(3.14);Complexc3(6.2,10.23);}
2)析構函數(shù)析構函數(shù)縮寫為dtor,它也是一個特殊的成員函數(shù),此函數(shù)在對象銷毀之前進行自動清理工作。析構函數(shù)的名字以波浪號~開始,它也沒有返回類型和返回值,因此析構函數(shù)不能被重載,如果類的定義中沒有包含析構函數(shù),編譯器會提供一個如下的默認析構函數(shù):
Classname::~classname()
{}進程會在對象銷毀之前調用該類所有成員的析構函數(shù),調用時按照成員在類定義中出現(xiàn)的次序進行。11.2面向對象C++?編程11.2.1面向對象C++?編程的理念面向對象程序設計(Object-OrientedProgramming,OOP)方法是軟件業(yè)界流行的軟件設計方法。雖然能實現(xiàn)面向對象程序設計的用戶沒有C程序設計那么多,但所有程序設計都在向面向對象的程序設計方法靠攏,究其原因是面向對象程序設計確實代表著軟件設計的一個研發(fā)方向。
1.對象(Object)每個對象都具有屬性(Attribute)和方法(Method)這兩方面的特征。對象的屬性描述了對象的狀態(tài)和特征,對象的方法說明了對象的行為和功能;并且對象的屬性值只應由這個對象的方法來讀取和修改,兩者結合在一起就構成了對象的完整描述。
2.類(Class)具有相似屬性和行為的一組對象,就稱為類。有了類的概念以后,就可以對具有共同特征的事物進行統(tǒng)一描述。
3.消息(Message)在面向對象的程序設計中,由于對象描述了客觀實體,它們之間的聯(lián)系通過對象間的聯(lián)系來反映。當一個對象需要另外一個對象提供服務時,它向對方發(fā)出一個服務請求,而收到請求的對象會響應這個請求并完成指定的服務。這種向對象發(fā)出的服務請求就稱為消息。當一個消息發(fā)送給某一對象時,其中包含了要求接收對象去執(zhí)行某個服務的信息。接收到消息的對象經解釋,然后予以響應,此種通信機制稱為消息傳遞。發(fā)送消息的對象不需要知道接收消息的對象如何對消息予以響應,如圖11-4所示。圖11-4各對象通過消息相互作用
4.封裝(Encapsulation)封裝把對象的屬性和方法看成一個密不可分的整體,從而使對象能夠完整地描述并對應一個具體事物。對象向外界提供訪問接口,外界只能通過接口來訪問對象。
5.繼承(Inheritance)將客觀事物進行歸類是一個逐步抽象的過程,反之,將類進行層層分類便是一個概念逐漸細化的過程。在面向對象的程序設計中,允許在已有類的基礎上通過增加新特征而派生出新的類,這稱為繼承。其原有的類稱為基類(baseclass),而新建立的類稱為派生類。
6.多態(tài)性(Polymorphism)多態(tài)性是面向對象的另一重要特征。在通過繼承而派生出的一系列類中,可能存在一些名稱相同但實現(xiàn)過程和功能不同的方法(Method)。所謂多態(tài)性,是指當程序中的其它部分發(fā)出同樣的消息時,按照接收消息對象的不同能夠自動執(zhí)行類中相應的方法。其好處是,用戶不必知道某個對象所屬的類就可以執(zhí)行多態(tài)行為,從而為程序設計帶來更多便利。11.2.2C++程序的編寫面向對象的程序設計方法(OOP方法)指將設計目標從模擬現(xiàn)實世界的行為轉向了模擬現(xiàn)實世界中存在的對象及其各自的行為。在OOP中,將“對象”作為系統(tǒng)中最基本的運行實體,整個程序即由各種不同類型的對象組成,各對象既是一個獨立的實體,又可通過消息相互作用,對象中的方法決定要向哪個對象發(fā)送消息、發(fā)送什么消息以及收到消息時如何進行處理等。
OOP方法的特點主要有:
(1)?OOP以“對象”或“數(shù)據(jù)”為中心。由于對象自然地反映了應用領域的模塊性,因此具有相對穩(wěn)定性,可以被用作一個組件去構成更復雜的應用,又由于對象一般封裝的是某一實際需求的各種成分,因此,某一對象的改變對整個系統(tǒng)幾乎沒有影響。
(2)引入了“類”(class)的概念。類與類以層次結構組織,屬于某個類的對象除具有該類所描述的特性外,還具有層次結構中該類上層所有類描述的全部性質,OOP中稱這種機制為繼承。
(3)?OOP方法的模塊性與繼承性,保證了新的應用程序設計可在原有對象的數(shù)據(jù)類型和功能的基礎上通過重用、擴展和細化來進行,而不必從頭做起或復制原有代碼,大大減少了重新編寫代碼的工作量,同時降低了程序設計過程中出錯的可能性,達到了事半功倍的效果。與傳統(tǒng)的面向過程程序設計相比,C++的OOP程序設計主要有如下優(yōu)勢:
(1)傳統(tǒng)的結構化程序設計方法以過程為中心構造應用程序,數(shù)據(jù)和處理數(shù)據(jù)的過程代碼相分離,是相互獨立的實體,設計出的程序可重用代碼少,且當代碼量增加時,維護數(shù)據(jù)和代碼的一致性出現(xiàn)困難。面向對象程序設計方法中,對象所具有的封裝性和繼承性使得代碼重用成為可能,并大大減少了程序出錯的可能性。
(2)面向對象方法吸收了結構化程序設計方法的優(yōu)點,同時引入了新概念、新機制并建立了比傳統(tǒng)方法更高層次的抽象。通過前面C程序設計的學習,之所以C程序設計的生命力如此強,并以其獨有的特點而備受青睞,主要表現(xiàn)在以下幾點:
(1)語言簡潔、緊湊,使用方便、靈活。C語言只有32個關鍵字,程序書寫形式自由。
(2)具有豐富的運算符和數(shù)據(jù)類型。
(3)可以直接訪問內存地址,能進行位操作,使其能夠勝任開發(fā)操作系統(tǒng)的工作。
(4)生成的目標代碼質量高,程序運行效率高。
(5)可移植性好。
C程序有一定的局限性,主要在于:
(1)數(shù)據(jù)類型檢查機制相對較弱,這使得程序中的一些錯誤不能在編譯階段發(fā)現(xiàn)。
(2)?C本身幾乎沒有支持代碼重用的語言結構,因此一個程序員精心設計的程序,很難為其它程序所用。
(3)當程序的規(guī)模達到一定程度時,程序員很難控制程序的復雜性。
C++包含了整個C,C是建立C++?的基礎。C++?包括C的全部特征和優(yōu)點,同時添加了對面向對象編程(OOP)的完全支持。C++?迎合了程序不斷發(fā)展的需求,在國內外市場上正逐漸崛起。
1.?C++程序的結構與基本組成一個簡單的C++?程序由若干個函數(shù)構成,其中有且僅有一個名稱為main的函數(shù)存在。圖11-5說明了C++?程序的基本架構。圖11-5C++?程序的基本架構由圖11-5可知,C++?程序的基本架構由聲明區(qū)、主程序區(qū)和函數(shù)定義區(qū)三部分組成。聲明區(qū)處于程序文件的所有函數(shù)的外部,主要包括:
(1)頭文件。如:#include"iostream.h"。
(2)宏定義。如:#definePI3.1415926。
(3)類定義。如:classname{…}。
(4)結構體定義。如:structrecord{…}。
(5)函數(shù)聲明。如:voidprint()。
(6)全局變量聲明。如:floatH=2.58。
(7)條件編譯。如:#ifdef…#else…#endif等。主程序區(qū)以main()函數(shù)開始,是整個程序運行的入口,該函數(shù)中可能包含的內容主要如下:
(1)局部變量的聲明。如:inti=1。
(2)函數(shù)調用。如:y=sin(x)。
(3)一般運算。如:a=b+c+d/3。
(4)結構控制。如:if(a>b)c=a。
(5)對象與結構的處理。
(6)文件的處理等。函數(shù)定義區(qū)指程序中除了main函數(shù)之外,還可以包含其它的函數(shù),每個函數(shù)是由函數(shù)說明和函數(shù)體兩部分構成的,如圖11-6所示。圖11-6C++?函數(shù)的組成把上述三部分組合在一起,就組成一個基本的C++程序,如圖11-7所示。圖11-7C++程序的基本組成以下為一個簡單C++?程序://ThisisfirstC++program/*C語言的某些特征仍可沿用*/#include"iostream.h"#include"stdio.h"voidprint();//函數(shù)聲明voidmain(){inti;chars[80];print();cout<<"What′syourname?\n";//用C++特有的方式輸出數(shù)據(jù)cin>>s;cout<<"Howoldareyou?\n";cin>>i;//驗證結果cout<<s<<"is"<<i<<"yearsold.";}voidprint(){printf("printfisalsocanbeused\n");}從上述程序可以看出:
(1)?C++不僅沿用了C語言中原有的規(guī)則和語句,同時又增添了很多新的風格。
(2)一個C++?程序是由一到若干個函數(shù)構成的,但其中必須有且僅有一個名稱為main的函數(shù)存在。不管一個程序中有多少個函數(shù),只有main函數(shù)是整個程序運行時的入口,程序運行時總是從main函數(shù)開始執(zhí)行。main函數(shù)在程序中所處的前后位置先后并不影響整個程序運行時的最初入口。
(3)一個C++?函數(shù)由兩部分構成,即函數(shù)的說明部分和函數(shù)體。函數(shù)的說明部分包括了函數(shù)的返回值的類型、函數(shù)的名稱、圓括號、形參及形參的類型說明。函數(shù)體由一對大括號{}括起來,其內容由若干條語句構成,函數(shù)體的內容決定了該函數(shù)的功能。
(4)?C++?對程序中的名稱是大小寫“敏感”的,除特殊情況外,應一律小寫。
(5)程序中的注釋,可以用?/*…*/?或?//(單行注釋)對程序中的內容進行注釋。二者的區(qū)別在于,采用?/*…*/?方法時,注釋可以寫成多行;而采用//方法時,注釋只能寫成一行,它可單獨占一行,也可寫在某行程序代碼的末尾。
(6)數(shù)據(jù)輸出。除了使用printf()函數(shù)外,還可使用功能更強大、更方便的cout對象進行輸出數(shù)據(jù)。格式如下:
cout<<數(shù)據(jù)1<<數(shù)據(jù)2<<…<<數(shù)據(jù)n上例中的語句“cout<<s<<"is"<<i<<"yearsold.";”表示同時輸出了變量s的值、字符串“is”、變量i的值和字符串“yearsold.”。
(7)數(shù)據(jù)輸入。除了使用scanf()函數(shù)外,還可使用cin對象進行數(shù)據(jù)輸入。格式如下:
cin>>變量1>>變量2>>…>>變量n如上例中的語句“cin>>s;”表示給變量s輸入一個值。
(8)在分別使用cout和cin進行數(shù)據(jù)的輸出和輸入時,需要在程序的開頭嵌入“iostream.h”文件。在該頭文件中定義了輸入/輸出流對象cout和cin等。
(9)一個C++?的源程序文件在存盤時,要以?.cpp為文件名后綴,而不是.c。2.?C++?數(shù)據(jù)類型、運算符和表達式
1)數(shù)據(jù)類型
(1)預定義數(shù)據(jù)類型(基本數(shù)據(jù)類型),包括字符型、整型、浮點型、無值型四種,其中浮點型又分為單精度浮點型和雙精度浮點型兩種。
(2)構造數(shù)據(jù)類型,包括數(shù)組、結構體、共用體(聯(lián)合)、枚舉、類等。本節(jié)重點介紹C++?的基本數(shù)據(jù)類型。基本數(shù)據(jù)類型在程序中使用時,必須預先定義,故稱為預定義數(shù)據(jù)類型。C++?中基本數(shù)據(jù)的關鍵字寫法以及在桌面系統(tǒng)所占用的字節(jié)數(shù)和限定數(shù)值范圍如表11-2所示。表11-2C++基本數(shù)據(jù)類型
2)類型修飾符
C++?還允許在基本數(shù)據(jù)類型(除void類型外)前加上類型修飾符,來更具體地表示數(shù)據(jù)類型。
C++?的類型修飾符包括:
signed:有符號。
unsigned:無符號。
short:短型。
long:長型。
C++?的基本數(shù)據(jù)類型修飾符如表11-3所示。表11-3C++的基本數(shù)據(jù)類型修飾符類型修飾符說明:
(1)表中帶[]的部分表示可以省略,如short[int]可以寫為shortint或簡寫為short,二者的含義相同。
(2)四種修飾符都可以用來修飾整型和字符型。用signed修飾的類型,其值可以為正數(shù)或負數(shù),用unsigned修飾的類型,其值只能為正數(shù)。
(3)用short修飾的類型,其值一定不大于對應的整數(shù);用long修飾的類型,其值一定不小于對應的整數(shù)。
3)常量在C++中,數(shù)據(jù)分為常量和變量兩大類。由于C++?程序中的數(shù)據(jù)都有類型,因此C++的常量和變量都有類型之分。常量按照不同的數(shù)據(jù)類型可以分為整型常量、浮點型常量、字符型常量以及字符串常量等。程序根據(jù)程序中常量的書寫格式來區(qū)分它是哪種類型的常量。C++中常量的表示形式如下:
(1)整型常量。在程序中書寫整型常量時,沒有小數(shù)部分。用戶根據(jù)需要分別可以用十進制、八進制和十六進制的形式書寫。十進制格式:由數(shù)字0~9和正、負號組成,書寫時直接寫出數(shù)字,如:923、-5160、+3000等。八進制格式:以數(shù)字0開頭的數(shù)字(0至7)序列,如:0121、010607、0177777等。十六進制格式:以0x或0X開頭的數(shù)字(數(shù)字0~9、字母a~z)序列,如:0x68AC、0xBFFF等。
(2)浮點型常量。只能用十進制來表示浮點型常量??梢圆捎眯?shù)或指數(shù)形式,且不分單精度和雙精度類型。如:34.5、.345、1.5e-3等。
(3)字符型常量。①用一對單撇號括起來的一個字符,單撇號只是字符與其它部分的分割符,不是字符的一部分,并且,不能用雙撇號代替單撇號。在單撇號中的字符不能是單撇號或反斜杠。如:
'a','A','#'合法的字符常量
''','\'非法的字符常量
"A"不代表字符常量②另一種表示字符常量的方法是使用轉義字符。C++規(guī)定,采用反斜杠后跟一個字母來代表一個控制字符,具有新的含義。
C++中常用的轉義字符見表11-4。
(4)字符串常量。用一對雙撇號括起來的一個或多個字符的序列稱為字符串常量或字符串。字符串以雙撇號為定界符,但雙撇號不作為字符串的一部分。如:
"Hello","GoodMorning!","Isay:\"Goodbye!\""字符串中的字符數(shù)稱為該字符串的長度,在存儲時,系統(tǒng)自動在字符串的末尾加以字符串結束標志,即轉義字符'\0'。表11-4C++中常用的轉義字符
(5)符號常量。常量也可用一個標識符來代表,稱為符號常量。如:#definePRICE60
main()
{……}使用符號常量應注意以下兩個問題:①它不同于變量,在作用域內其值不能改變和賦值。如在上例中再用“PRICE=40;”這一語句進行賦值則是錯誤的。②符號常量名一般用大寫,而變量名用小寫,以示區(qū)別。
(6)程序中常量的表示方法。在程序中常量有以下三種表示方法:①在程序中直接寫入常量。如:-200,3.4e-10,'A','1',0x120,045,5.35,1000l
inti;chars;floatf;
i=20;s='a';f=2.0;②利用#define定義宏常量。一般格式:#define宏名常數(shù)如:#definePI3.14
…………
s=2*PI*r;
…………③利用const定義正規(guī)常數(shù)。一般格式:const數(shù)據(jù)類型標識符常數(shù)名=常量值;說明:
·const必須放在被修飾類型符和類型名前面。
·數(shù)據(jù)類型是一個可選項,用來指定常數(shù)值的數(shù)據(jù)類型,如果省略了該數(shù)據(jù)類型,那么編譯程序認為它是int類型。如:“constinta=10;”表示定義了一個初始值為10的整型常量,它在程序中不可改變,但可用于表達式的計算中。
4)變量
(1)變量的概念及特點。每一變量就相當于一個容器,對應著計算機內存中的某一塊存儲單元,用于存儲程序中的數(shù)據(jù)。變量的值具有以下兩個特點:①“一充變新”。即將一個新數(shù)據(jù)存放到一個變量中時,該變量中原存值消失(一充便失),變量的值變成了新值。如:執(zhí)行完語句“inti;i=10;i=20;”后i的值為20,而不是10。②“取之不盡”??蓪⒛硞€變量的值與程序中的其它數(shù)據(jù)進行各種運算,在運算過程中,如果沒有改變該變量的值,不管用該變量的值進行多少次運算,其值始終保持不變。如:語句“inti,j,k;i=10;j=i+10;k=i+j*5;”中,i的值可無限制地多次使用,但它的值始終能保持為10,因為在程序中沒有改變變量i的值。程序中的每一變量,都要先定義、后使用。變量不定義不得使用。定義變量一般有以下三種格式:①數(shù)據(jù)類型標識符變量名;②數(shù)據(jù)類型標識符變量名=初始化值;③數(shù)據(jù)類型標識符變量名1[=初始值1],變量名2[=初始值2],…;如:
charm; //定義字符型變量m
inti=1000; //定義整型變量i,i的初始值為1000
floata=2,b=3,c; //定義浮點型變量a、b、c且a、b的初始值分別為2、3變量名是每個變量的名稱,其命名遵循標識符的規(guī)定規(guī)則:①由字母、數(shù)字和下劃線(_)三類符號排列組合形成,且開頭字符必須是字母或下劃線。②名稱中字符的最大個數(shù)是31個。③C++?中區(qū)分變量名的大小。④變量名不能和C++?中的關鍵字同名,也不能和用戶編制的函數(shù)或C++庫函數(shù)同名。如:int,double或static都不能作為變量名。⑤變量名盡量做到“見名知意”。
(3)定義變量的位置。在程序中的不同位置采用不同的變量定義方式,從而也決定了該變量具有不同的特點。變量的定義一般可有以下三種位置:①在函數(shù)體內部。在函數(shù)體內部定義的變量稱為局部變量,這種局部變量只在進入定義它的函數(shù)體時起作用,離開該函數(shù)體后該變量就消失(被釋放),即不再起作用。因此,不同函數(shù)體內部可以定義相同名稱的變量,而互不干擾。例如:
voidfunc1(void)
{inty;
y=2;
}
voidfunc2(void)
{inty;
y=-100;
}在本例中,函數(shù)func1和func2的函數(shù)體內部都分別定義了變量y,但它們都只能在各自的函數(shù)體內起作用,都是局部變量,且互不干擾。②形式參數(shù)。當定義一個有參函數(shù)時,函數(shù)名后面括號內的變量統(tǒng)稱為形式參數(shù)。例如:
intis_in(char*a,charb)
{while(*a)
if(*a==b)
return1;
else
a++;
return0;
}本例中,函數(shù)名is_in后面括號內的變量a和b是該函數(shù)的形式參數(shù),它們都只能在該函數(shù)體內起作用,是該函數(shù)的局部變量。③全局變量。在所有函數(shù)體外部定義的變量,其作用范圍是整個程序,并在整個程序運行期間有效。以下為一定義全局變量的程序:
#include"stdio.h"
intcount;//定義count變量是全局變量
voidfunc1(void);
voidfunc2(void);
intmain()
{count=10;
func1();
return0;}
voidfunc1(void){inttemp;temp=count;func2();printf("countis%d",count);//輸出10}voidfunc2(void){intcount;for(count=1;count<10;count++)putchar('.');}
5)運算符和表達式程序中對數(shù)據(jù)進行的各種運算是由運算符來決定的;不同運算符的運算方法和特點有所不同。一個運算式子中要涉及到數(shù)據(jù)及運算符,而運算符是對數(shù)據(jù)進行指定操作,并產生新值的特殊符號。
(1)算術運算符和算術表達式。算術運算符就是對數(shù)據(jù)進行算術運算,如:加、減、乘、除等,是在程序中使用最多的一種運算符,C++?的算術運算符如表11-5所示。表11-5C++的算術運算符算術表達式是指由算術運算符和括號將常量、變量、函數(shù)、圓括號等連接形成的一個有意義的式子。如:
(1+x)/(3*x)
(((2*x-3)*x+2)*x)-5
3.14*sqrt(r)
b*b-4.0*a*c注意:①表達式中的括號不管有多少層,一律使用圓括號。②在將一個數(shù)學上的運算式子寫成對應的C++?的表達式時,要注意進行必要的轉換。③乘號不能省略,在程序中乘號用?*?表示。④數(shù)學表達式中出現(xiàn)的數(shù)學運算函數(shù)要用C++?提供的對應的數(shù)學運算庫函數(shù)來代替。⑤要特別注意表達式中兩個整型數(shù)相除的情況。如:有一數(shù)學表達式為2/3(f-32),要寫成對應的C++?的表達式時,正確的寫法應是2.0/3.0*(f-32),而不是2/3*(f-32)。
(2)賦值運算符和賦值表達式。賦值運算符的功能是將某個數(shù)據(jù)的值賦給某個變量。賦值運算符的用法格式如下:變量名賦值運算符常量、變量或表達式說明:①被賦值的目標,即賦值運算符左邊的量必須是變量,而不能是常量或表達式。②C++?中的賦值運算符如表11-6所示。表11-6C++中的賦值運算符③要注意區(qū)分賦值運算符“=”與數(shù)學上的“等號”間的區(qū)別,如下程序段:
intx,y; //定義變量x、y為int類型變量
x=10; //將變量x賦成值10
x=x+20; //將x的值在原值(10)的基礎上再加上值20后(結果為30)賦給變量x
y-=x+5; //等價于y=y-(x+5);右邊表達式的值為30-
(31+5)=-6,y被賦成值?-6
x%=y+10; //等價于x=x%(y+10);右邊表達式的值為31%(-6+10)=3,y被賦成值3
(3)?sizeof運算符。sizeof運算符功能是求某一數(shù)據(jù)類型或某一變量在內存中所占空間的字節(jié)數(shù)。其使用的一般形式如下:
sizeof(變量名或數(shù)據(jù)類型)或sizeof變量名或數(shù)據(jù)類型sizeof運算符的示例見下述程序:
#include<iostream.h>
voidmain()
{shortintaShort;
intanInt;longaLong;charaChar;floataReal;cout<<"datatype\tmemoryused(bytes)";cout<<"\nshortint\t"<<sizeof(aShort);cout<<"\ninteger\t"<<sizeof(anInt);cout<<"\nLonginteger\t"<<sizeof(aLong);
cout<<"\ncharachar\t"<<sizeof(aChar);cout<<"\nfloat\t"<<sizeof(aReal);}其輸出結果為datatypememoryused(bytes)shortint 2integer 4Longinteger 4charachar 1float 4
(4)關系運算符和關系表達式。關系運算符就是對兩個量進行比較的運算符,如表11-7所示。表11-7C++中的比較運算符由關系運算符將兩個表達式連接形成的運算式子叫做關系表達式。關系表達式的值是一個邏輯值,當為真時,值為1,為假時,值為0。如:假設a=1,b=20,c=3,則
a<b 表達式成立,其值為1
b==c 表達式不成立,其值為0
(a+b)!=c 表達式成立,其值為1注意:在比較兩個表達式的值是否相等時,要用運算符“==”,而不能寫成“=”。
(5)邏輯運算符和邏輯表達式。邏輯運算符是在兩個邏輯量間進行運算的運算符,如表11-8所示。表11-8C++中的邏輯運算符由邏輯運算符將兩個表達式連接形成的式子叫做邏輯表達式。各種邏輯運算的“真值表”如表11-9所示。對于參加邏輯運算的操作數(shù),系統(tǒng)認為“非0”為真,“0”為假,而邏輯表達式的結果只能為邏輯真(1)或邏輯假(0)。表11-9邏輯運算真值表注意:①C或C++?中在給出一個邏輯表達式的最終計算結果值時,用1表示真,用0表示假。但在進行邏輯運算的過程中,凡是遇到非零值時就當真值參加運算,遇到0值時就當假值參加運算。如:inta=10,b=15,c=14,則(a+6)&&(b>c)的值為1(真)。②在邏輯表達式的求值過程中,并不是所有的邏輯運算符都被執(zhí)行,只是在必須執(zhí)行下一個邏輯運算符才能求出表達式的值時,才執(zhí)行該運算符。③對于a&&b&&c,只有a為真時,才需要判別b的值,只有a和b的值都為真時才需要判別c的值。如:inti=10,則表達式i&&(i=0)&&(++i)的值為0(假),該表達式運算結束后,變量i的值為0,而不是1。④對于a||b||c,只要a為真,就不必須判斷b和c;只有a為假,才判別b;a和b都為假才判別c。如:inti=1,j,則表達式i++||i++||i++的值為1(真),運算結束后,變量i的值為2,而不是4。⑤對于數(shù)學上的表示多個數(shù)據(jù)間進行比較的表達式,在C或C++?中要拆寫成多個條件并用邏輯運算符連接形成一個邏輯表達式。如:在數(shù)學上,要表示一個變量a的值處于?-1和?-9之間時,可以用?-9<a<-1,但在C++?語言中必須寫成a>-9&&a<-1,而不能寫成?-9<a<-1。因為,假設變量a當前的值為?-5,它的值確實處在?-1和?-9之間,但在C++?語言中求?-9<a<-1時,從左向右進行計算,先計算?-9<a,得1(真),此時該表達式可簡化為1<-1,結果為0(假),因此必須寫成a>-9&&a<-1的形式。
(6)條件運算符。在C++中只提供一個三目運算符,即條件運算符“?:”,其一般形式如下:表達式1?表達式2:表達式3條件運算的規(guī)則是:首先判斷表達式1的值,若其值為真(非0),則取表達式2的值為整個表達式的值;若其值為假(0),則取表達式3的值為整個表達式的值。如:若a=3,b=4,則條件表達式a>b?a:b的值為4。
(7)位運算符。①位運算符及其運算規(guī)則。所謂位運算符是指能進行二進制位運算的運算符。C++提供的位運算符如表11-10所示。表11-10C++?中的位運算符位運算的運算規(guī)則如下:
·按位與&:兩個運算量相應的位都是1,則該位的結果值為1,否則為0。
·按位或|:兩個運算量相應的位只要有一個是1,則該位的結果值為1,否則為0。
·按位異或^:兩個運算量相應的位不同,則該位的結果值為1,否則為0。
·按位取反~:將運算量的每一位取反。
·按位左移<<:將操作數(shù)中的每一位向左移動指定的位數(shù),移出的位被舍棄,空出的位補0。
·按位右移>>:將操作數(shù)中的每一位向右移動指定的位數(shù),移出的位被舍棄,空出的位補0或補符號位。如:a=5,b=6,則即a&b=4,a|b=7,a^b=3,~b=249。②復合位運算符。位運算符與賦值運算符結合可以形成復合位運算符,如表11-11所示。表11-11C++?中的復合位運算符
(8)強制類型轉換運算符。該運算符的功能是將某一數(shù)據(jù)從一種數(shù)據(jù)類型向另一種數(shù)據(jù)類型進行轉換。其使用的一般形式如下:數(shù)據(jù)類型標識符(表達式)
(數(shù)據(jù)類型標識符)表達式如:inti=2;
floata,b;
a=float(i);
//將變量i的類型強制轉換為浮點型,并將其值賦給變量a
b=(float)i;
//將變量i的類型強制轉換為浮點型,并將其值賦給變量b
(9)逗號運算符。逗號運算符的運算優(yōu)先級是最低的。一般形式如下:表達式1,表達式2,…,表達式N在計算逗號表達式的值時,按從左至右的順序依次分別計算各個表達式的值,而整個逗號表達式的值和類型是由最右邊的表達式決定的。如:有語句“inta=3,b=4;”,則表達式“a++,b++,a+b”的值為9。再如:設有“inti;”,則表達式“i=1,i++==2?i+1:i+4”的值為6。
(10)運算符的優(yōu)先級與結合性。每個運算符都有自己的優(yōu)先級和結合性。當一個表達式中包含多個運算符時,要確定運算的結果,必須首先確定運算的先后順序,即運算符的優(yōu)先級和結合性。C++中運算符的優(yōu)先級和結合性如表11-12所示。表11-12C++運算符的優(yōu)先級和結合性
3.數(shù)據(jù)的輸入與輸出在C++?語言中,數(shù)據(jù)的輸入和結果的輸出是分別使用系統(tǒng)所提供的輸入流對象cin和輸出流對象cout來完成的。在使用過程中,只要在程序的開頭嵌入相應的頭文件“iostream.h”即可。
1)數(shù)據(jù)的輸出cout輸出流對象輸出數(shù)據(jù)的語句格式如下:
cout<<數(shù)據(jù)1<<數(shù)據(jù)2<<…<<數(shù)據(jù)n;說明:
(1)?cout是系統(tǒng)預定義的一個標準輸出設備(一般代表顯示器);“<<”是輸出操作符,用于向cout輸出流中插入數(shù)據(jù)。
(2)?cout的作用是向標準輸出設備上輸出數(shù)據(jù),被輸出的數(shù)據(jù)可以是常量、已有值的變量或是一個表達式。以下為一個cout向標準輸出設備上輸出數(shù)據(jù)的實例說明。輸入程序:#include<iostream.h>#include<math.h>voidmain(){floata=3,b=4;cout<<"Theresultis";cout<<sqrt(a*a+b*b);}該程序的輸出結果為Theresultis5
(3)可以在cout輸出流中插入C++?中的轉義字符。如:cout<<"thevalueofa:\n";
cout<<a;這表示輸出完字符串“thevalueofa:”后,在下一行輸出變量a的值。
(4)可以將多個被輸出的數(shù)據(jù)寫在一個cout中,各輸出項間用“<<”操作符隔開即可。但要注意,cout首先按從右向左的順序計算出各輸出項的值,然后再輸出各項的值。如:cout<<"valueofa:"<<a<<"valueofb:"<<b<<"Theresultis:"<<sqrt(a*a+b*b);再如:設變量i的值為10,則“cout<<i<<","<<i++<<","<<i++;”的輸出結果為“12,11,10”。
(5)一個cout語句也可拆成若干行來書寫,但注意語句結束符“;”只能寫在最后一行。對于上面的語句,也可寫成如下形式:cout<<"valueofa:"http://注意行末無分號
<<a<<"valueofb:"<<b<<"Theresultis:"<<sqrt(a*a+b*b);//在此處書寫分號
(6)在cout中,實現(xiàn)輸出數(shù)據(jù)換行功能的方法:既可使用轉義字符“\n”,也可使用表示行結束的流操作子endl。如:cout<<"ThisisfirstLine.\n"<<"Thisissecondline.";上面的語句可等價地寫為
cout<<"ThisisfirstLine."<<endl<<"Thisissecondline.";
(7)在cout中還可以使用流控制符控制數(shù)據(jù)的輸出格式,但使用這些流控制符時,要在程序的起始位置嵌入頭文件?#include<iomanip.h>。常用的流控制符及其功能如表11-13所示。表11-13I/O流的常用控制符①設置域寬。所謂域寬,是指被輸出數(shù)據(jù)所占的輸出寬度(單位是字符數(shù))。設置域寬可以使用流控制符setw(n)和cout的方法cout.width(n)。其中n為正整數(shù),表示域寬。但是,cout.width(n)和setw(n)二者都只對下一個被輸出的數(shù)據(jù)有作用。若一個輸出語句內有多個被輸出的數(shù)據(jù)而要保持一定格式域寬,則需要在每一輸出數(shù)據(jù)前加上cout.width(n)或setw(n)。此外,當參數(shù)n的值比實際被輸出數(shù)據(jù)的寬度大時,則在給定的域寬內,數(shù)據(jù)靠右輸出,不足部分自動填充空格符;若被輸出數(shù)據(jù)的實際寬度比n值大,則按數(shù)據(jù)所占的實際位數(shù)輸出數(shù)據(jù),設置域寬的參數(shù)n不再起作用。
cout流控制符setw的使用舉例。輸入如下程序:
#include<iostream.h>
#include<iomanip
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深度解析(2026)《GBT 25658.1-2010數(shù)控仿形定梁龍門鏜銑床 第1部分:精度檢驗》(2026年)深度解析
- 國際關系中的“韌性”(resilience)話語霸權化批判-基于2023–2025年歐盟、北約、聯(lián)合國戰(zhàn)略文件共現(xiàn)分析
- 2025年江西移動第四季度社會招聘備考筆試題庫及答案解析
- 2025年西安市雁塔區(qū)第一小學教師招聘考試筆試備考試題及答案解析
- 2025云南農業(yè)生產資料股份有限公司及下屬公司招聘考試參考試題及答案解析
- 2025四川宜賓市消防救援局第五次招聘政府專職消防員35人模擬筆試試題及答案解析
- 2026河北滄州醫(yī)學高等專科學校高層次人才選聘50人備考筆試試題及答案解析
- 《人口普查》數(shù)學課件教案
- 2025安徽六安霍邱老年大學旅游專業(yè)教師招聘1人備考考試題庫及答案解析
- 2025年下半年武警江西總隊醫(yī)院社會招聘5人考試備考題庫及答案解析
- 2025-2030中國水系鋅離子電池市場深度研究及未來發(fā)展建議報告
- T-CNFIA 208-2024 花膠干魚鰾標準
- 蓄水池防水施工方案
- 動物咬傷急救醫(yī)學課程課件
- 巨量千川營銷師(初級)認證考試題(附答案)
- 《數(shù)字地圖之綜合》課件
- 《土木工程專業(yè)英語 第2版》 課件 Unit5 Composite Construction;Unit6 Introduction to Foundation Analysis and Design
- 《讓子彈飛》電影賞析
- 華北戰(zhàn)記-在中國發(fā)生的真實的戰(zhàn)爭-桑島節(jié)郎著
- 干細胞研究與臨床應用
- 排澇泵站重建工程安全生產施工方案
評論
0/150
提交評論