北京大學(xué)軟件學(xué)院模板課件_第1頁
北京大學(xué)軟件學(xué)院模板課件_第2頁
北京大學(xué)軟件學(xué)院模板課件_第3頁
北京大學(xué)軟件學(xué)院模板課件_第4頁
北京大學(xué)軟件學(xué)院模板課件_第5頁
已閱讀5頁,還剩161頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

移動應(yīng)用軟件開發(fā)技術(shù)

第二講:C++編程基礎(chǔ)《移動應(yīng)用軟件開發(fā)技術(shù)》課程建設(shè)小組北京大學(xué)二零一一年*致謝:感謝Intel對本課程項(xiàng)目的支持

移動應(yīng)用軟件開發(fā)技術(shù)

第二講:C++編程基礎(chǔ)C++編程基礎(chǔ)C++編程基礎(chǔ)3C++標(biāo)識符(Identifiers)程序設(shè)計(jì)語言中為變量、常量、類型、函數(shù)等取的名字稱為標(biāo)識符。標(biāo)識符由大小寫字母、數(shù)字和下劃線組成,并且只能以字母或下劃線開始。

例如:

9abc、*abc是不合法的標(biāo)識符注意:標(biāo)識符區(qū)分大小寫標(biāo)識符長度任意提倡使用“見名知義”的標(biāo)識符避免使用系統(tǒng)已定義的標(biāo)識符(系統(tǒng)保留字)3C++標(biāo)識符(Identifiers)4關(guān)鍵字關(guān)鍵字在計(jì)算機(jī)中有預(yù)定的含義。關(guān)鍵字又稱保留字,它們不能再被用戶重新定義使用。

autoboolbreakcasecatchcharclassconstconst_castcontinuedefaultdeletedodoubleelseenumexplicitexternfalsefloatforfriendgotoifinlineintlongmutablenamespacenewoperatorprivateprotectedpublicregisterreturnshortsignedsizeofstaticstructswitchtemplatethisthrowtruetrytypedeftypeidtypenameunionunsignedusingvirtualvoidvolatilewhile4關(guān)鍵字5注釋符C++語言保留了C語言中以/*開始,*/結(jié)束的注釋,這種方式適用于多行的注釋同時(shí)C++語言中還提供行注釋符//,該注釋在它的行結(jié)束處結(jié)束,適用于短注釋。5注釋符6數(shù)據(jù)類型數(shù)據(jù)類型是不同形式的信息在內(nèi)存中分配方式的基本約定(不同類型的數(shù)據(jù)在內(nèi)存中占用的字節(jié)數(shù)有所不同),是構(gòu)造程序的基礎(chǔ)。常量、變量甚至函數(shù)都具有自己的數(shù)據(jù)類型。類型名說明符整型int字符型char浮點(diǎn)型float布爾型bool空值型void五種基本數(shù)據(jù)類型6數(shù)據(jù)類型數(shù)據(jù)類型是不同形式的信息在內(nèi)存中分配方式的基本約定7類型名字寬(字節(jié))范圍short[int]2–32768~32767signedshort[int]2–32768~32767unsignedshort[int]20~65535int4–2147483648~2147483647signed[int]4–2147483648~2147483647unsigned[int]40~4294967295long[int]4–2147483648~2147483647signedlong[int]4–2147483648~2147483647unsignedlong[int]40~4294967295char1–128~127signedchar1–128~127unsignedchar10~255float4double8longdouble8void032位機(jī)上各基本類型的字寬及表示范圍7類型名字寬(字節(jié))范圍short[int]2–327688變量變量是在程序執(zhí)行過程中,其值可以改變的量;變量有3個基本要素:名字類型值8變量變量是在程序執(zhí)行過程中,其值可以改變的量;9變量的名字是一種標(biāo)識符,需用遵守標(biāo)識符的規(guī)則區(qū)分大小寫mycarMyCarMYCAR是三個變量名稱不能使用關(guān)鍵字作為變量名“見名知意”常見命名方法:my_bookmyBookiMyBook9變量的名字是一種標(biāo)識符,需用遵守標(biāo)識符的規(guī)則10變量的類型C++中的變量在使用前必須定義,定義變量時(shí)必須指明變量的類型及名字。變量的類型包含數(shù)據(jù)類型和存儲類型定義或說明變量的格式:<類型說明符><變量名表>;例如:staticintmy_car;10變量的類型C++中的變量在使用前必須定義,定義變量時(shí)必須11變量的值變量自身包含兩個值:變量值:變量所表示的數(shù)據(jù)值地址值:變量在內(nèi)存中的地址值變量可以在定義時(shí)初始化,給變量賦一個初值。

例如:inta=3,b=-78;doublearea=67.34;變量賦值,或更改變量值 例如:a=5;取變量地址值:通過“&”運(yùn)算符來獲得 例如:&a;11變量的值變量自身包含兩個值:12C++提供另一種形式的初始化方法。例如,前面兩個語句可改寫為:

inta(3),b(-78);doublearea(67.34);12C++提供另一種形式的初始化方法。例如,前面兩個語句可改13常量的定義格式定義格式:

const<類型說明符><常量名>=<常量值>

例如:

constdoublepi=3.141592653;13常量的定義格式定義格式:14整型常量十進(jìn)制整型常量由0~9的數(shù)字組成,不能以0開頭,沒前綴例如:20189等八進(jìn)制整型常量由0~7的數(shù)字組成,以0位前綴例如:032024等十六進(jìn)制整型常量由0~9及a~f字母組成,0x或0X為前綴例如:0x1a0X3F等長整型常量后綴L(l),無符號整型常量后綴U(u)例如:123L12322U223212ul14整型常量十進(jìn)制整型常量15字符串常量以一對雙撇號括起來的字符序列例如:“Helloworld!\n”字符串常量中可以包含空格符、轉(zhuǎn)義字符及其他字符,也可以包含漢字。由于雙撇號是字符串的定界符,因此字符串中使用\”表示雙撇號。字符串中字符的個數(shù)可以為任意數(shù)目字符串常量后面有一個結(jié)束符’\0’“a”與’a’不同15字符串常量以一對雙撇號括起來的字符序列16運(yùn)算符

運(yùn)算符是指用來表示在數(shù)據(jù)上執(zhí)行某些特定操作的符號。參與運(yùn)算的數(shù)據(jù)稱為操作數(shù)。(可以分別稱為單目、雙目和三目運(yùn)算符)。算術(shù)運(yùn)算符關(guān)系運(yùn)算符邏輯運(yùn)算符位操作運(yùn)算符賦值運(yùn)算符其他運(yùn)算符16運(yùn)算符運(yùn)算符是指用來表示在數(shù)據(jù)17

邏輯運(yùn)算真值表(真為非0,假為0)aba&&ba||b!a!b0000110非00110非000101非0非0110017邏輯運(yùn)算真值表(真為非0,假為0)aba&&ba|18位操作運(yùn)算符位運(yùn)算符是對其操作數(shù)按其二進(jìn)制形式逐位進(jìn)行運(yùn)算,參加位運(yùn)算的操作數(shù)必須為整數(shù)。C++中所有的位運(yùn)算符如下:~(按位求反) <<(左移)>>(右移) &(按位與) ^(按位異或) |(按位或)18位操作運(yùn)算符位運(yùn)算符是對其操作數(shù)按其二進(jìn)制形式逐位進(jìn)行運(yùn)19選擇語句利用選擇語句可以實(shí)現(xiàn)具有選擇結(jié)構(gòu)的程序選擇語句有兩種條件語句(if語句)開關(guān)語句(switch語句)特點(diǎn):具有一定的判斷功能可以根據(jù)給定的條件來決定執(zhí)行哪路分支中的語句19選擇語句利用選擇語句可以實(shí)現(xiàn)具有選擇結(jié)構(gòu)的程序20C++中有三種循環(huán)語句可用來實(shí)現(xiàn)循環(huán)結(jié)構(gòu):while語句、do_while語句和for語句。這些語句各有各的特點(diǎn),而且常常可以互相替代。在編程時(shí)應(yīng)根據(jù)需要選擇最適合的循環(huán)語句。循環(huán)語句20循環(huán)語句21轉(zhuǎn)向語句goto無條件轉(zhuǎn)向語句,很少使用break退出語句continue結(jié)束本次循環(huán)語句轉(zhuǎn)向語句用于改變語句的執(zhí)行順序21轉(zhuǎn)向語句goto無條件轉(zhuǎn)向語句,很少使用22枚舉的定義枚舉類型和枚舉變量的定義格式如下,其中enum是枚舉類型定義的關(guān)鍵字。enum枚舉類型名{

枚舉常量名1, 枚舉常量名2,

…}枚舉變量;//在定義枚舉類型的同時(shí)定義枚舉變量。例如:enumWeekDay{ Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}today;也可在枚舉類型定義后再定義枚舉變量,格式如下:枚舉類型名枚舉變量。如:WeekDaytomorrow;22枚舉的定義23枚舉類型voidmain(){ enumWeakDay{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; WeakDayToday; Today=Friday; cout<<"Today="<<Today<<endl; Today=Sunday; cout<<"Today="<<Today<<endl;}Today=5Today=023枚舉類型voidmain()Today=524756-2354……107a[0]a[1]a[2]a[n-1]圖一維數(shù)組數(shù)組是一些意義上相關(guān)的同類型變量的有序集合。每個數(shù)組元素都是一個變量,用來存放不同的值。數(shù)組元素引用形式:數(shù)組名[下標(biāo)]數(shù)組24756-2354……107a[0]a[指針的概念1.指針:即變量的內(nèi)存地址。2.指針變量指針變量是一種特殊的變量:

它存放的不是數(shù)據(jù)的值,而是另一個變量的地址。指針變量常常直接簡稱為指針。

指針指針的概念

指針26一個指針在定義以后,并不具體地指向某個變量,而只是確定了類型??梢詫χ羔樳M(jìn)行初始化,讓它指向某個具體的變量。

“&”是取地址運(yùn)算符,用在一個存儲器操作數(shù)的前面,表示取存儲器操作數(shù)的地址值。例如:

floatsalary;float*salary_ptr=&salary;就將指針salary_ptr初始化為變量salary的地址值,也即指向了具體的salary。

26一個指針在定義以后,并不具體地指向某個變量,而只是確定了27指針的賦值和引用

除了在指針定義時(shí)對它進(jìn)行初始化外,還可以使用賦值運(yùn)算來給指針賦以變量的地址值。例如:

inta=-8978;int*p;p=&a;這里,p被賦值為變量a的地址。也可以將一個已被賦值的指針賦給另一個相同類型的指針。例如:

doublea;double*x=&a,*y;y=x;這樣一來,y就與x指向同一個變量a。27指針的賦值和引用28一個關(guān)于指針的例子。

#include<iostream.h>voidmain(){intx=50;int*x_ptr=&x;//x_ptr指向xcout<<"x="<<x<<endl;//輸出x的值

cout<<"*x_ptr="<<*x_ptr<<endl; //輸出x_ptr所指單元的值

cout<<"x_ptr="<<x_ptr<<endl; //輸出x_ptr的值*x_ptr=100;cout<<"x="<<x<<endl;cout<<"*x_ptr="<<*x_ptr<<endl;cout<<"x_ptr="<<x_ptr<<endl;}程序的輸出為:

x=50*x_ptr=50x_ptr=0x0065FDF4x=100*x_ptr=100x_ptr=0x0065FDF428一個關(guān)于指針的例子。程序的輸出為:29指針與整數(shù)進(jìn)行的加、減運(yùn)算,代表著指針在內(nèi)存空間上、下移動。具體上移或下移的字節(jié)數(shù)與其類型密切相關(guān)。例如,假設(shè)在某字長為32的計(jì)算機(jī)中,一個int型數(shù)據(jù)占4個字節(jié),如果有

inta=78;int*x=&a;x初始化為指向變量a。在語句

x=x+1;執(zhí)行后,x中存放的地址值被加了4,指向變量a下面一個整數(shù)。同理,語句

x=x–1;執(zhí)行后,x指向了上一個整數(shù)。指針運(yùn)算29指針與整數(shù)進(jìn)行的加、減運(yùn)算,代表著指針在內(nèi)存空間上、下移30

當(dāng)++或––與*同時(shí)作用于指針時(shí),同樣應(yīng)該注意運(yùn)算的順序。 例如:x=*p++;相當(dāng)于x=*(p++);即先從當(dāng)前地址中取值,然后將指針指向下一個數(shù)據(jù)。 又如:x=*++p;相當(dāng)于x=*(++p);先將地址加1,再取地址中的數(shù)據(jù)賦給x。 而x=++*p;相當(dāng)于x=++(*p);表示先取p所指向的單元內(nèi)的數(shù)據(jù)值,再將數(shù)據(jù)值加1后賦給x。30 當(dāng)++或––與*同時(shí)作用于指針時(shí),同樣應(yīng)該注意運(yùn)算的31例:給出程序的運(yùn)行結(jié)果#include<iostream.h>voidmain(){ inta[3]={24,30,8}; int*p; p=a; intx; x=*p++; cout<<x<<","<<*p<<endl; x=*++p; cout<<x<<","<<*p<<endl; x=++*p; cout<<x<<","<<*p<<endl;}24,308,89,93132函數(shù)定義與函數(shù)原型C++中的函數(shù)由一段相對獨(dú)立的程序組成,這段程序能實(shí)現(xiàn)某一方面獨(dú)立和完整的功能。例

求5!+4!#include<iostream.h>intfactorial(intn){ intz,i; z=1; for(i=1;i<=n;i++) z=z*i; returnz;}voidmain(){ intx; x=factorial(5)+factorial(4); cout<<”5!+4!=”<<x<<endl;}程序運(yùn)行結(jié)果:5!+4!=14432函數(shù)定義與函數(shù)原型C++中的函數(shù)由一段相對獨(dú)立的程序組成(1)形式參數(shù):在被調(diào)用函數(shù)名后面的()內(nèi)的變量稱為形式參數(shù)(簡稱“形參”)。(2)實(shí)際參數(shù):在調(diào)用函數(shù)名后面的()內(nèi)中的表達(dá)式或變量稱為實(shí)際參數(shù)(簡稱實(shí)參)。

求從鍵盤上輸入的兩數(shù)中的最大值#include<iostream.h>voidmax(intx,inty);voidmain(){ inta,b; cout<<"Pleaseinputtwointegers:"; cin>>a>>b; max(a,b);}voidmax(intx,inty){ intw; w=x>y?x:y; cout<<"Thebigoneoftwoinputnumberis:"<<w<<endl;}運(yùn)行結(jié)果:Pleaseinputtwointegers:54

-89Thebigoneoftwoinputnumberis:54

程序中x,y為形參,a,b為實(shí)參。(1)形式參數(shù):在被調(diào)用函數(shù)名后面的()內(nèi)的變量稱為形式34函數(shù)的傳值調(diào)用例

交換兩個整數(shù)變量的值。#include<iostream.h>voidexch(intx,inty){ intz; z=x; x=y; y=z;}voidmain(){ inta=3,b=5; exch(a,b); cout<<"a="<<a<<",b="<<b<<endl;}//運(yùn)行結(jié)果:a=3,b=5變量a,b的值沒有改變。34函數(shù)的傳值調(diào)用voidmain()//運(yùn)行結(jié)果:a=335函數(shù)的傳址調(diào)用

傳址調(diào)用:指針作函數(shù)參數(shù)例

交換兩個整數(shù)變量的值。#include<iostream.h>voidexch(int*x,int*y){ intz; z=*x; *x=*y; *y=z;}voidmain(){ inta=3,b=5; exch(&a,&b); cout<<"a="<<a<<",b="<<b<<endl;}//運(yùn)行結(jié)果:a=5,b=3變量a,b的值已經(jīng)交換。35函數(shù)的傳址調(diào)用

傳址調(diào)用:指針作函數(shù)參36動態(tài)內(nèi)存分配

在ANSIC中,malloc()和free()

C++兼容了C語言中的這兩個函數(shù),并提供了兩個新的操作符:new和deleteC++程序運(yùn)行時(shí)可以在內(nèi)存區(qū)使用new運(yùn)算符和delete運(yùn)算符動態(tài)創(chuàng)建和刪除變量。36動態(tài)內(nèi)存分配在ANSIC中,mallo37//動態(tài)分配#include"stdio.h“

//包含標(biāo)準(zhǔn)輸入輸出頭文件#include"stdlib.h" //包含動態(tài)存儲分配函數(shù)頭文件voidmain(){ int*p; //定義一個整型指針p

//為指針p動態(tài)分配一個存儲單元

p=(int*)malloc(sizeof(int)); *p=6; //將6賦給指針p指向的存儲單元 printf("%d",*p);

free(p);

//釋放p所指向的存儲單元}37//動態(tài)分配38例內(nèi)存動態(tài)分配程序#include<iostream.h>voidmain(){ int*pc; cout<<"pc="<<pc<<endl;

pc=newint; cout<<"pc="<<pc<<endl; *pc=10; cout<<"pc="<<pc<<endl; cout<<"*pc="<<*pc<<endl;

deletepc;}堆0pc38例內(nèi)存動態(tài)分配程序堆0pc39對于數(shù)組進(jìn)行動態(tài)分配的格式為:指針變量名=new類型名[下標(biāo)表達(dá)式];delete[]指向該數(shù)組的指針變量名;兩式中的方括號是非常重要的,兩者必須配對使用,如果delete語句中少了方括號,因編譯器認(rèn)為該指針是指向數(shù)組第一個元素的指針,會產(chǎn)生回收不徹底的問題(只回收了第一個元素所占空間),加了方括號后就轉(zhuǎn)化為指向數(shù)組的指針,回收整個數(shù)組。delete[]的方括號中不需要填數(shù)組元素?cái)?shù),系統(tǒng)自知。即使寫了,編譯器也忽略。請注意“下標(biāo)表達(dá)式”不是常量表達(dá)式,即它的值不必在編譯時(shí)確定,可以在運(yùn)行時(shí)確定。39對于數(shù)組進(jìn)行動態(tài)分配的格式為:40【例】動態(tài)數(shù)組的建立與撤銷#include<iostream.h>#include<string.h>voidmain(){ intn; char*pc; cout<<"請輸入動態(tài)數(shù)組的元素個數(shù)"<<endl;

cin>>n;

//在運(yùn)行時(shí)確定,可輸入17

pc=newchar[n];

//申請17個字符(可裝8個漢字和一個結(jié)束符)的內(nèi)存空間

strcpy(pc,"堆內(nèi)存的動態(tài)分配"); cout<<pc<<endl;

delete[]pc;//釋放pc所指向的n個字符的內(nèi)存空間}40【例】動態(tài)數(shù)組的建立與撤銷41結(jié)構(gòu)定義格式:struct結(jié)構(gòu)名{

類型1結(jié)構(gòu)成員1; 類型2結(jié)構(gòu)成員2;

…;};例如:structTeacher{ longintid; charname[10];

intage; intsex;};結(jié)構(gòu)定義后,可以聲明結(jié)構(gòu)變量或指向結(jié)構(gòu)的指針如:

TeacherZhang;

Teacher*tp; tp=newTeacher;41結(jié)構(gòu)定義格式:例如:結(jié)構(gòu)定義后,可以聲明結(jié)構(gòu)變量或指向結(jié)42類類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。利用類可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。42類類是具有相同屬性和行為的一組對象的集合,它為屬于該類的43類的定義分為說明和實(shí)現(xiàn)兩個部分。類說明部分是用來聲明該類中的成員。類的成員包括數(shù)據(jù)成員和函數(shù)成員。其中,函數(shù)成員又稱成員函數(shù)或“方法”,用于對數(shù)據(jù)成員進(jìn)行各種操作。類實(shí)現(xiàn)部分用來對成員函數(shù)進(jìn)行定義。即說明部分告訴類要“干什么”,實(shí)現(xiàn)部分告訴類“怎么干”。43類的定義分為說明和實(shí)現(xiàn)兩個部分。44類說明部分類說明部分一般格式如下:class類名{

private:(或缺省時(shí))

數(shù)據(jù)成員聲明或函數(shù)成員的原型;

protected:

數(shù)據(jù)成員聲明或函數(shù)成員的原型;

public:

數(shù)據(jù)成員聲明或函數(shù)成員的原型;};44類說明部分類說明部分一般格式如下:45類實(shí)現(xiàn)部分

類的實(shí)現(xiàn)部分,包括所有在類體中說明的成員函數(shù)的定義。成員函數(shù)的定義通常在類定義體之外給出,其中每個成員函數(shù)定義格式為:返回值類型類名::成員函數(shù)名(<參數(shù)表>){

…//函數(shù)體}

類的成員函數(shù)在類外部定義時(shí),前面必須加上“類名::”,以說明所定義的函數(shù)是哪一個類的成員?!埃海骸狈Q為作用域運(yùn)算符。45類實(shí)現(xiàn)部分類的實(shí)現(xiàn)部分,包括所有在類體中說明的成46

封裝性來自對類成員的訪問控制權(quán)限。在C++中,類的成員從訪問權(quán)限上分為私有(private)、公有(public)和保護(hù)(protected)三類。私有成員通常是一些數(shù)據(jù)成員。private權(quán)限為類帶來了封裝性,它使私有成員隱藏起來,不能從類的外部對它們進(jìn)行訪問,或者說它們從類外部是不可見的,只有類自己的成員函數(shù)才可以訪問它們。公有成員往往是一些操作(即成員函數(shù)),可在程序中類的外部訪問它們,它們是類的對外接口。類封裝和數(shù)據(jù)隱藏46封裝性來自對類成員的訪問控制權(quán)限。類封裝和數(shù)據(jù)隱藏47例:點(diǎn)類Point的定義classPoint{private:

doublex,y;public:

voidSetPoint(doublex,doubley); doubleGetX();

doubleGetY(); voidPrint();};voidPoint::SetPoint(doublea,doubleb)//定義成員函數(shù)SetPoint(){x=a; y=b;}doublePoint::GetX()//定義成員函數(shù)GetX(){returnx;}doublePoint::GetY()//定義成員函數(shù)GetY(){returny;}voidPoint::Print()//定義成員函數(shù)Print(){cout<<”X=”<<x<<”,”<<“Y=”<<y<<endl;}類實(shí)現(xiàn)部分:類說明部分:47例:點(diǎn)類Point的定義classPoint{vo48

定義類時(shí)說明部分中的關(guān)鍵字public、private、protected從它們出現(xiàn)的位置起開始生效,直到出現(xiàn)另一個訪問權(quán)限關(guān)鍵字為止。訪問權(quán)限關(guān)鍵字可以按任意順序出現(xiàn)任意次,但是,如果把所有的私有成員和公有成員歸類放在一起,能增強(qiáng)程序的可讀性。如果把所有的私有成員放在公有成員前面,可以自動獲得缺省訪問控制權(quán)限private。4849

類中的數(shù)據(jù)成員可以是任何數(shù)據(jù)類型。例如整型、浮點(diǎn)型、字符型、數(shù)組、指針和引用等。

不能在類的說明部分給類的數(shù)據(jù)成員賦初值,例如在點(diǎn)類的定義中,下面的定義是錯的:classPoint{

intx=0,y=0; public: ┆};49類中的數(shù)據(jù)成員可以是任何數(shù)據(jù)類型。例如整型、浮點(diǎn)50對象的定義和成員表示

類描述了對象的數(shù)據(jù)存儲和操作特性,對象是類的實(shí)例。正像定義int類型的變量一樣,創(chuàng)建類類型Point的對象也被看作定義Point類型的變量。對象在它的類確定了以后,定義格式為:

類名<對象名表>

例如,定義(或者說創(chuàng)建)兩個點(diǎn)類Point的對象:

Point p1,p2(2.0,3.0);<對象名表>中,可以是一般的對象名,也可以是指向?qū)ο蟮闹羔樆驅(qū)ο蟮囊?,還可以是對象數(shù)組名。例如,一個復(fù)數(shù)類Complex的對象可以如下定義:

Complexc1,c2,*pc,c[10];

50對象的定義和成員表示類描述了對象51對象成員的表示方法

一個對象的成員就是該對象的類所定義的成員。對象成員有數(shù)據(jù)成員和成員函數(shù)。

一般對象的成員表示如下:

<對象名>.<成員名>

或者

<對象名>.<成員名>(<參數(shù)表>)

前者用來表示數(shù)據(jù)成員,后者用來表示成員函數(shù)。這里的“.”是一個運(yùn)算符,該運(yùn)算符的功能是表示對象的成員。

指向?qū)ο蟮闹羔樀某蓡T表示如下:

<對象指針名>-><成員名>

或者

<對象指針名>-><成員名>(<參數(shù)表>)

這里的“->”是一個表示成員的運(yùn)算符,它與“.”運(yùn)算符的區(qū)別是“->”用來表示對象的指針的成員,而“.”用來表示一般對象的成員。同樣,前者表示數(shù)據(jù)成員,而后者表示成員函數(shù)。

51對象成員的表示方法52#include<iostream.h>#include"cdate.h"voidmain(){CDatedate1,date2;date1.SetDate(1996,5,4);date2.SetDate(1998,4,9);intleap=date1.IsLeapYear();cout<<leap<<endl;date1.Print();date2.Print();}例分析該程序的輸出結(jié)果classCDate{public:voidSetDate(inty,intm,intd);intIsLeapYear();voidPrint();private:intyear,month,day;};voidCDate::SetDate(inty,intm,intd){year=y;month=m;day=d;}intCDate::IsLeapYear(){return(year%4==0&&year%100!=0)||(year%400==0);}voidCDate::Print(){cout<<year<<"."<<month<<"."<<day<<endl;}52#include<iostream.h>例分析該程53構(gòu)造函數(shù)與析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)是在類體中說明的兩種特殊的成員函數(shù)。構(gòu)造函數(shù)的功能是在創(chuàng)建對象時(shí),用給定的對象對對象進(jìn)行初始化。析構(gòu)函數(shù)的功能是用來釋放一個對象,它與構(gòu)造函數(shù)的功能正好相反。53構(gòu)造函數(shù)與析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)是在類體中說明的兩種54構(gòu)造函數(shù)的特點(diǎn)如下:構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可寫在類體外。構(gòu)造函數(shù)是一個特殊的成員函數(shù),該函數(shù)的名字與類名相同,該函數(shù)不指定類型說明。該函數(shù)可以沒有參數(shù),也可有參數(shù)。構(gòu)造函數(shù)可以重載,即可定義多個參數(shù)個數(shù)不同的函數(shù)。程序中一般不直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對象時(shí)系統(tǒng)自動調(diào)用構(gòu)造函數(shù)。54構(gòu)造函數(shù)的特點(diǎn)如下:55構(gòu)造函數(shù)舉例classClock{public: Clock(intNewH,intNewM,intNewS);//構(gòu)造函數(shù)

voidSetTime(intNewH,intNewM,intNewS); voidShowTime();private: intHour,Minute,Second;};55構(gòu)造函數(shù)舉例classClock56構(gòu)造函數(shù)的實(shí)現(xiàn):Clock::Clock(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}建立對象時(shí)構(gòu)造函數(shù)的作用:voidmain(){

Clockc(0,0,0);//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。

c.ShowTime();}3156構(gòu)造函數(shù)的實(shí)現(xiàn):3157析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。在對象的生存期結(jié)束的時(shí)刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個默認(rèn)的析構(gòu)函數(shù)。57析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。58構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include<iostream>usingnamespacestd;classPoint{public:

Point(intxx,intyy);

~Point();//...其它函數(shù)原形

private:intX,intY;};58構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include<iostream59Point::Point(intxx,intyy){X=xx;Y=yy;}Point::~Point(){}//...其它函數(shù)的實(shí)現(xiàn)略4159Point::Point(intxx,intyy)460繼承是C++實(shí)現(xiàn)軟件重用的主要手段。計(jì)程車公共汽車旅游車汽車客車貨車工程車

交通工具類層次關(guān)系圖60繼承是C++實(shí)現(xiàn)軟件重用的主要手段。計(jì)程車公共汽車旅游61派生(Derivate)類的定義格式派生類的定義格式為:class派生類名:繼承方式基類名{ //派生類新增成員定義

…};

“繼承方式”用于規(guī)定派生類中由基類繼承到的那部分成員在派生類中的訪問控制權(quán)限。繼承方式用下述三個關(guān)鍵字之一來指定:public:公有繼承;protected:保護(hù)繼承;private:私有繼承。61派生(Derivate)類的定義格式派生類的定義格式為:62繼承方式基類特性派生類特性Public繼承publicpublicprotectedprotectedprivate不可訪問Private繼承publicprivateprotectedprivateprivate不可訪問Protected繼承publicprotectedprotectedprotectedprivate不可訪問62繼承方式基類特性派生類特性Publicpublicpub63class<派生類名>:<繼承方式1><基類名1>,<繼承方式2><基類名2>,…{

<派生類新定義成員>};多繼承與單繼承的區(qū)別從定義格式上看,主要是多繼承的基類多于一個。63class<派生類名>:<繼承方式1><基類名1>,<64

派生類構(gòu)造函數(shù)的一般格式如下:

<派生類名>(<派生類構(gòu)造函數(shù)總參數(shù)表>):<基類構(gòu)造函數(shù)>(參數(shù)表1),<子對象名>(<參數(shù)表2>)

{

<派生類中數(shù)據(jù)成員初始化>

};

派生類構(gòu)造函數(shù)的調(diào)用順序如下:

·

基類的構(gòu)造函數(shù)

·

子對象類的構(gòu)造函數(shù)(如果有的話)

·

派生類構(gòu)造函數(shù)

執(zhí)行的順序是:先祖先(基類),再客人(成員對象),后自己(派生類)

。64派生類構(gòu)造函數(shù)的一般格式如下:

<派生類名>(<派生類65派生類構(gòu)造函數(shù)實(shí)例#include<iostream.h>classA{ //定義基類private: inta;public:A(intx){a=x;cout<<"A'sconstructorcalled."<<endl;}voidshow(){cout<<a<<endl;}};classB{ //定義另一個類private: intb;public:B(intx){b=x;cout<<"B'sconstructorcalled."<<endl;}intget(){returnb;}};65派生類構(gòu)造函數(shù)實(shí)例66派生類構(gòu)造函數(shù)實(shí)例classC:publicA{ //定義派生類private: intc; Bobj_b;public: C(intx,inty,intz):A(x),obj_b(y)//派生類構(gòu)造函數(shù)

{ c=z; cout<<"C'sconstructorcalled."<<endl; } voidshow(){ A::show(); cout<<obj_b.get()<<","<<c<<endl; }};voidmain(){ Cc1(1,2,5),c2(3,4,7); c1.show(); c2.show();}程序輸出如下:A'sconstructorcalled.B'sconstructorcalled.C'sconstructorcalled.A'sconstructorcalled.B'sconstructorcalled.C'sconstructorcalled.12,534,766派生類構(gòu)造函數(shù)實(shí)例classC:publicA67派生類析構(gòu)函數(shù)實(shí)例#include<iostream.h>classX{ intx1,x2;public: X(inti,intj){x1=i;x2=j;} voidprint(){cout<<x1<<”,”<<x2<<endl;} ~X(){cout<<”X’sdestructorcalled.”<<endl;}};classY:publicX{ inty; //派生類Y新增數(shù)據(jù)成員public: Y(inti,intj,intk):X(i,j) {y=k;} //派生類構(gòu)造函數(shù)

voidprint(){X::print();cout<<y<<endl;} ~Y(){cout<<”Y’sdestructorcalled.”<<endl;}};voidmain(){Yy1(5,6,7),y2(2,3,4);y1.print();y2.print();}程序輸出結(jié)果如下:5,672,34Y’sdestructorcalled.X’sdestructorcalled.Y’sdestructorcalled.X’sdestructorcalled.67派生類析構(gòu)函數(shù)實(shí)例#include<iostream.h68A{a}A{a}B1{b1}B2{b2}C{c,f1(),f2(),print()}A::aB1::b1A::aB2::b2C::c重復(fù)繼承關(guān)系及其內(nèi)存映象(a)(b)在上例中若聲明:Cc1;則對繼承的數(shù)據(jù)成員a的訪問 c1.a;或 c1.A::a;都會出現(xiàn)二義性。系統(tǒng)將沒有足夠的信息區(qū)分是訪問B1中的a,還是B2中的a。派生類C的對象c1中保存了間接基類A的成員a的兩份拷貝。為避免出現(xiàn)這種二義性,可以用作用域運(yùn)算符::加以限定。例如:c1.B1::a;c1.B2::a;要想從根本上消除這種二義性,應(yīng)想法使這個公共基類在間接派生類中只產(chǎn)生一個該公共基類的子對象。這就需要將這個公共基類定義為虛基類。重復(fù)繼承及其二義性68A{a}A{a}B1{b1}B2{b2}C{c69

虛基類與普通基類的區(qū)別只有在發(fā)生重復(fù)繼承時(shí)才能表現(xiàn)出來:被重復(fù)繼承的基類被說明為虛基類后,其成員在派生類中只產(chǎn)生一個唯一的副本,這就從根本上解決了二義性問題。

虛基類的說明是在派生類的定義中進(jìn)行,其說明的語法格式如下:class派生類名:virtual繼承方式基類名}…;}其中,virtual是說明虛基類的關(guān)鍵字。虛基類的說明是在定義派生類時(shí),寫在派生類名的后面。6970虛基類的說明classA{protected: inta;public: A(); voidf();};classB1:virtualpublicA{protected: intb1;};classB2:virtualpublicA{protected: intb2;};classc:publicB1,publicB2{private: intc;public: C(); intg();}A{f(),a}B1{b1}B2{b2}C{g(),c}含有虛基類時(shí)的類層次關(guān)系圖70虛基類的說明classAclassc:publi71函數(shù)重載的區(qū)分機(jī)制1.用參數(shù)區(qū)分函數(shù)重載的不同調(diào)用版本重載函數(shù)靠參數(shù)不同而區(qū)分不同調(diào)用版本。決定參數(shù)是否相同有參數(shù)個數(shù)、參數(shù)類型等要素。如length()函數(shù)的重載說明:intlength(intx);intlength(intx,inty);doublelength(doublex1,doublex2,doubley1,doubley2);這三個函數(shù),由于它們的函數(shù)名相同,參數(shù)不同而成為重載函數(shù),與它們返回值類型相同并無關(guān)系。intsum(intx,inty);和doublesum(inta,intb);這兩個函數(shù)不是重載函數(shù),因?yàn)樗鼈儏?shù)個數(shù)和類型都相同,盡管它們的返回值類型不同、形式參數(shù)名也不同。編譯程序認(rèn)為它們是對一個函數(shù)的重新定義(override)另外不同的參數(shù)傳遞方式也無法區(qū)分重載函數(shù),如:intfunc1(intvalue);intfunc1(int&value);不能作為重載函數(shù)。

71函數(shù)重載的區(qū)分機(jī)制1.用參數(shù)區(qū)分函數(shù)重載的不同調(diào)用版本重72虛函數(shù)定義:在某基類中聲明為virtual并在一個或多個派生類中被重新定義的成員函數(shù)

語法:virtual

函數(shù)返回類型函數(shù)名(參數(shù)表)

{函數(shù)體}用途:實(shí)現(xiàn)多態(tài)性,通過指向派生類對象的基類對象指針或?qū)ο笠?,訪問派生類中同名覆蓋成員函數(shù),72虛函數(shù)定義:73說明:虛函數(shù)是一個類的成員函數(shù)關(guān)鍵字virtual指明該成員函數(shù)為虛函數(shù)。當(dāng)某一個類的一個類成員函數(shù)被定義為虛函數(shù),則由該類派生出來的所有派生類中,該函數(shù)始終保持虛函數(shù)的特征。當(dāng)在派生類中重新定義虛函數(shù)(overridingavirtualfunction,亦譯作超載或覆蓋)時(shí),不必加關(guān)鍵字virtual。但重新定義時(shí)不僅要同名,而且它的參數(shù)表和返回類型全部與基類中的虛函數(shù)一樣。73說明:74例#include<iostream.h>classPet//基類{public: virtualvoidSpeak(){cout<<"Howdoesapetspeak?"<<endl;}};classCat:publicPet //派生類{public: virtualvoidSpeak(){cout<<"miao!miao!"<<endl;}};classDog:publicPet //派生類{public: virtualvoidSpeak(){cout<<“wang!wang!"<<endl;}};voidmain(){ Petobj,*p1;//基類對象指針p1,基類對象obj Dogdog1; Catcat1; obj=dog1;//用Dog類對象給Pet類對象賦值

obj.Speak(); p1=&cat1; p1->Speak();}這個程序?qū)⑤敵鼋Y(jié)果如下:Howdoesapetspeak?miao!miao!對于函數(shù)obj.Speak()調(diào)用語句是靜態(tài)綁定的(靜態(tài)聯(lián)編)。對于p1->Speak()調(diào)用語句是動態(tài)聯(lián)編。74例#include<iostream.h>這個程序?qū)?5動態(tài)聯(lián)編(dynamicbinding)亦稱滯后聯(lián)編(latebinding),對應(yīng)于靜態(tài)聯(lián)編(staticbinding)。如果使用對象名和點(diǎn)成員選擇運(yùn)算符“.”引用特定的一個對象來調(diào)用虛函數(shù),則被調(diào)用的虛函數(shù)是在編譯時(shí)確定的(稱為靜態(tài)聯(lián)編)如果使用基類指針或引用指明派生類對象,使用該指針調(diào)用虛函數(shù)(成員選擇符用箭頭號“->”),則程序動態(tài)地(運(yùn)行時(shí))選擇該派生類的虛函數(shù),稱為動態(tài)聯(lián)編。75動態(tài)聯(lián)編(dynamicbinding)亦稱滯后聯(lián)編(76純虛函數(shù)是在基類中只有說明而沒有實(shí)現(xiàn)定義的虛函數(shù),它的任何派生類都必須定義自己的實(shí)現(xiàn)版本。普通的虛函數(shù)在派生類中可以不重新定義。此時(shí)指向派生類對象的指針調(diào)用該函數(shù)時(shí)調(diào)用的是基類中定義的版本。純虛函數(shù)定義形式:virtual類型函數(shù)名(參數(shù)表)=0;例如:在前面例子中對于從Circle、Triangle、Rectangle抽象出的公共基類Figure,求面積的運(yùn)算是無實(shí)際意義的:virtualvoidarea(){ cout<<"Can'tdefineareaforanabstractionfigure"<<endl;}area()可以定義為純虛函數(shù)。純虛函數(shù)76純虛函數(shù)是在基類中只有說明而沒有實(shí)現(xiàn)定義的虛函數(shù),它的任77抽象類說明凡是包含純虛函數(shù)的類都是抽象類?;蛑辽賻в幸粋€純虛函數(shù)的類稱為抽象類。因?yàn)榧兲摵瘮?shù)是不能被調(diào)用的,包含純虛函數(shù)的類是無法建立對象的。抽象類的作用是作為一個類族的共同基類,或者說,為一個類族提供一個公共接口。77抽象類說明78異常處理的基本思想計(jì)算機(jī)程序在機(jī)器上運(yùn)行時(shí)會產(chǎn)生錯誤,這些錯誤對于編程人員可以預(yù)料到但卻無法避免。在一個小型程序中,一旦程序運(yùn)行時(shí)發(fā)生了異常,一般是將程序立即中斷運(yùn)行,從而無條件釋放所有資源。而在一個較為復(fù)雜的軟件中,函數(shù)與函數(shù)之間存在著各自明確的功能和相互間復(fù)雜的調(diào)用關(guān)系,發(fā)現(xiàn)錯誤的函數(shù)又并不具備處理錯誤的能力。78異常處理的基本思想計(jì)算機(jī)程序在機(jī)器上運(yùn)行時(shí)會產(chǎn)生錯誤,這79C++的異常處理機(jī)制使得異常的引發(fā)和處理不需要在同一函數(shù)內(nèi)完成,它可以將異常向上傳播,這樣底層的函數(shù)可以專門用以解決具體問題,而上層的調(diào)用者就可以在適當(dāng)?shù)奈恢冕槍Σ煌愋偷漠惓TO(shè)計(jì)處理。

異常處理的基本思想79C++的異常處理機(jī)制使得異常的引發(fā)和處理不需要在同一函數(shù)80異常處理的機(jī)制C++語言提供了對處理異常情況的內(nèi)部支持。在C++語言中,try、throw和catch語句就是用于實(shí)現(xiàn)異常處理的機(jī)制。有了C++程序的異常處理機(jī)制,程序可以向更高的執(zhí)行上下文傳遞意想不到的事件,使C++程序能更好地從各種異常事件中進(jìn)行有效地恢復(fù),從而更好地執(zhí)行80異常處理的機(jī)制C++語言提供了對處理異常情況的內(nèi)部支持。81try{//錯誤偵測區(qū)塊復(fù)合語句

throw異常類型表達(dá)式;//如果發(fā)生錯誤用throw語句拋出異常}catch(異常類型1){//錯誤處理區(qū)塊復(fù)合語句}catch(異常類型2){//錯誤處理區(qū)塊復(fù)合語句}……catch(…)//如果在前面并沒有列舉異常類型,則由此處理區(qū)塊處理{//錯誤處理區(qū)塊復(fù)合語句}//try-throw-catch后繼續(xù)執(zhí)行異常處理的機(jī)制81try異常處理的機(jī)制82#include<iostream>usingnamespacestd;inttry_modulus(int,int);voidmain(){try//代碼保護(hù)段

{ cout<<"Modulus(5,2)is"<<try_modulus(5,2)<<endl; cout<<"Modulus(3,0)is"<<try_modulus(3,0)<<endl; cout<<"Modulus(8,5)is"<<try_modulus(8,5)<<endl; } catch(char*s)//處理異常

{cerr<<s;} cout<<"endoftheprogram.\n";}inttry_modulus(intx,inty){ if(y==0)//檢查被除數(shù)是否為零,是則拋出異常

throw("exceptionofdividingzero!\n"); returnx%y;}Modulus(5,2)is1exceptionofdividingzero!endoftheprogram82#include<iostream>Modulus(5Q&A本講結(jié)束!Q&A本講結(jié)束!移動應(yīng)用軟件開發(fā)技術(shù)

第二講:C++編程基礎(chǔ)《移動應(yīng)用軟件開發(fā)技術(shù)》課程建設(shè)小組北京大學(xué)二零一一年*致謝:感謝Intel對本課程項(xiàng)目的支持

移動應(yīng)用軟件開發(fā)技術(shù)

第二講:C++編程基礎(chǔ)C++編程基礎(chǔ)C++編程基礎(chǔ)86C++標(biāo)識符(Identifiers)程序設(shè)計(jì)語言中為變量、常量、類型、函數(shù)等取的名字稱為標(biāo)識符。標(biāo)識符由大小寫字母、數(shù)字和下劃線組成,并且只能以字母或下劃線開始。

例如:

9abc、*abc是不合法的標(biāo)識符注意:標(biāo)識符區(qū)分大小寫標(biāo)識符長度任意提倡使用“見名知義”的標(biāo)識符避免使用系統(tǒng)已定義的標(biāo)識符(系統(tǒng)保留字)3C++標(biāo)識符(Identifiers)87關(guān)鍵字關(guān)鍵字在計(jì)算機(jī)中有預(yù)定的含義。關(guān)鍵字又稱保留字,它們不能再被用戶重新定義使用。

autoboolbreakcasecatchcharclassconstconst_castcontinuedefaultdeletedodoubleelseenumexplicitexternfalsefloatforfriendgotoifinlineintlongmutablenamespacenewoperatorprivateprotectedpublicregisterreturnshortsignedsizeofstaticstructswitchtemplatethisthrowtruetrytypedeftypeidtypenameunionunsignedusingvirtualvoidvolatilewhile4關(guān)鍵字88注釋符C++語言保留了C語言中以/*開始,*/結(jié)束的注釋,這種方式適用于多行的注釋同時(shí)C++語言中還提供行注釋符//,該注釋在它的行結(jié)束處結(jié)束,適用于短注釋。5注釋符89數(shù)據(jù)類型數(shù)據(jù)類型是不同形式的信息在內(nèi)存中分配方式的基本約定(不同類型的數(shù)據(jù)在內(nèi)存中占用的字節(jié)數(shù)有所不同),是構(gòu)造程序的基礎(chǔ)。常量、變量甚至函數(shù)都具有自己的數(shù)據(jù)類型。類型名說明符整型int字符型char浮點(diǎn)型float布爾型bool空值型void五種基本數(shù)據(jù)類型6數(shù)據(jù)類型數(shù)據(jù)類型是不同形式的信息在內(nèi)存中分配方式的基本約定90類型名字寬(字節(jié))范圍short[int]2–32768~32767signedshort[int]2–32768~32767unsignedshort[int]20~65535int4–2147483648~2147483647signed[int]4–2147483648~2147483647unsigned[int]40~4294967295long[int]4–2147483648~2147483647signedlong[int]4–2147483648~2147483647unsignedlong[int]40~4294967295char1–128~127signedchar1–128~127unsignedchar10~255float4double8longdouble8void032位機(jī)上各基本類型的字寬及表示范圍7類型名字寬(字節(jié))范圍short[int]2–3276891變量變量是在程序執(zhí)行過程中,其值可以改變的量;變量有3個基本要素:名字類型值8變量變量是在程序執(zhí)行過程中,其值可以改變的量;92變量的名字是一種標(biāo)識符,需用遵守標(biāo)識符的規(guī)則區(qū)分大小寫mycarMyCarMYCAR是三個變量名稱不能使用關(guān)鍵字作為變量名“見名知意”常見命名方法:my_bookmyBookiMyBook9變量的名字是一種標(biāo)識符,需用遵守標(biāo)識符的規(guī)則93變量的類型C++中的變量在使用前必須定義,定義變量時(shí)必須指明變量的類型及名字。變量的類型包含數(shù)據(jù)類型和存儲類型定義或說明變量的格式:<類型說明符><變量名表>;例如:staticintmy_car;10變量的類型C++中的變量在使用前必須定義,定義變量時(shí)必須94變量的值變量自身包含兩個值:變量值:變量所表示的數(shù)據(jù)值地址值:變量在內(nèi)存中的地址值變量可以在定義時(shí)初始化,給變量賦一個初值。

例如:inta=3,b=-78;doublearea=67.34;變量賦值,或更改變量值 例如:a=5;取變量地址值:通過“&”運(yùn)算符來獲得 例如:&a;11變量的值變量自身包含兩個值:95C++提供另一種形式的初始化方法。例如,前面兩個語句可改寫為:

inta(3),b(-78);doublearea(67.34);12C++提供另一種形式的初始化方法。例如,前面兩個語句可改96常量的定義格式定義格式:

const<類型說明符><常量名>=<常量值>

例如:

constdoublepi=3.141592653;13常量的定義格式定義格式:97整型常量十進(jìn)制整型常量由0~9的數(shù)字組成,不能以0開頭,沒前綴例如:20189等八進(jìn)制整型常量由0~7的數(shù)字組成,以0位前綴例如:032024等十六進(jìn)制整型常量由0~9及a~f字母組成,0x或0X為前綴例如:0x1a0X3F等長整型常量后綴L(l),無符號整型常量后綴U(u)例如:123L12322U223212ul14整型常量十進(jìn)制整型常量98字符串常量以一對雙撇號括起來的字符序列例如:“Helloworld!\n”字符串常量中可以包含空格符、轉(zhuǎn)義字符及其他字符,也可以包含漢字。由于雙撇號是字符串的定界符,因此字符串中使用\”表示雙撇號。字符串中字符的個數(shù)可以為任意數(shù)目字符串常量后面有一個結(jié)束符’\0’“a”與’a’不同15字符串常量以一對雙撇號括起來的字符序列99運(yùn)算符

運(yùn)算符是指用來表示在數(shù)據(jù)上執(zhí)行某些特定操作的符號。參與運(yùn)算的數(shù)據(jù)稱為操作數(shù)。(可以分別稱為單目、雙目和三目運(yùn)算符)。算術(shù)運(yùn)算符關(guān)系運(yùn)算符邏輯運(yùn)算符位操作運(yùn)算符賦值運(yùn)算符其他運(yùn)算符16運(yùn)算符運(yùn)算符是指用來表示在數(shù)據(jù)100

邏輯運(yùn)算真值表(真為非0,假為0)aba&&ba||b!a!b0000110非00110非000101非0非0110017邏輯運(yùn)算真值表(真為非0,假為0)aba&&ba|101位操作運(yùn)算符位運(yùn)算符是對其操作數(shù)按其二進(jìn)制形式逐位進(jìn)行運(yùn)算,參加位運(yùn)算的操作數(shù)必須為整數(shù)。C++中所有的位運(yùn)算符如下:~(按位求反) <<(左移)>>(右移) &(按位與) ^(按位異或) |(按位或)18位操作運(yùn)算符位運(yùn)算符是對其操作數(shù)按其二進(jìn)制形式逐位進(jìn)行運(yùn)102選擇語句利用選擇語句可以實(shí)現(xiàn)具有選擇結(jié)構(gòu)的程序選擇語句有兩種條件語句(if語句)開關(guān)語句(switch語句)特點(diǎn):具有一定的判斷功能可以根據(jù)給定的條件來決定執(zhí)行哪路分支中的語句19選擇語句利用選擇語句可以實(shí)現(xiàn)具有選擇結(jié)構(gòu)的程序103C++中有三種循環(huán)語句可用來實(shí)現(xiàn)循環(huán)結(jié)構(gòu):while語句、do_while語句和for語句。這些語句各有各的特點(diǎn),而且常??梢曰ハ嗵娲T诰幊虝r(shí)應(yīng)根據(jù)需要選擇最適合的循環(huán)語句。循環(huán)語句20循環(huán)語句104轉(zhuǎn)向語句goto無條件轉(zhuǎn)向語句,很少使用break退出語句continue結(jié)束本次循環(huán)語句轉(zhuǎn)向語句用于改變語句的執(zhí)行順序21轉(zhuǎn)向語句goto無條件轉(zhuǎn)向語句,很少使用105枚舉的定義枚舉類型和枚舉變量的定義格式如下,其中enum是枚舉類型定義的關(guān)鍵字。enum枚舉類型名{

枚舉常量名1, 枚舉常量名2,

…}枚舉變量;//在定義枚舉類型的同時(shí)定義枚舉變量。例如:enumWeekDay{ Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}today;也可在枚舉類型定義后再定義枚舉變量,格式如下:枚舉類型名枚舉變量。如:WeekDaytomorrow;22枚舉的定義106枚舉類型voidmain(){ enumWeakDay{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; WeakDayToday; Today=Friday; cout<<"Today="<<Today<<endl; Today=Sunday; cout<<"Today="<<Today<<endl;}Today=5Today=023枚舉類型voidmain()Today=5107756-2354……107a[0]a[1]a[2]a[n-1]圖一維數(shù)組數(shù)組是一些意義上相關(guān)的同類型變量的有序集合。每個數(shù)組元素都是一個變量,用來存放不同的值。數(shù)組元素引用形式:數(shù)組名[下標(biāo)]數(shù)組24756-2354……107a[0]a[指針的概念1.指針:即變量的內(nèi)存地址。2.指針變量指針變量是一種特殊的變量:

它存放的不是數(shù)據(jù)的值,而是另一個變量的地址。指針變量常常直接簡稱為指針。

指針指針的概念

指針109一個指針在定義以后,并不具體地指向某個變量,而只是確定了類型??梢詫χ羔樳M(jìn)行初始化,讓它指向某個具體的變量。

“&”是取地址運(yùn)算符,用在一個存儲器操作數(shù)的前面,表示取存儲器操作數(shù)的地址值。例如:

floatsalary;float*salary_ptr=&salary;就將指針salary_ptr初始化為變量salary的地址值,也即指向了具體的salary。

26一個指針在定義以后,并不具體地指向某個變量,而只是確定了110指針的賦值和引用

除了在指針定義時(shí)對它進(jìn)行初始化外,還可以使用賦值運(yùn)算來給指針賦以變量的地址值。例如:

inta=-8978;int*p;p=&a;這里,p被賦值為變量a的地址。也可以將一個已被賦值的指針賦給另一個相同類型的指針。例如:

doublea;double*x=&a,*y;y=x;這樣一來,y就與x指向同一個變量a。27指針的賦值和引用111一個關(guān)于指針的例子。

#include<iostream.h>voidmain(){

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論