C++編程全套課件_第1頁(yè)
C++編程全套課件_第2頁(yè)
C++編程全套課件_第3頁(yè)
C++編程全套課件_第4頁(yè)
C++編程全套課件_第5頁(yè)
已閱讀5頁(yè),還剩613頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C/C++語(yǔ)言概述

1.1從C到C++的程序結(jié)構(gòu)

C++程序是由預(yù)處理命令、語(yǔ)句、函數(shù)、變量(對(duì)象)、輸入與輸出以及注釋等幾個(gè)基本部分組成的。#include<iostream.h>voidmain(){cout<<“Hello,world!!”<<endl;}1.1從C到C++的程序結(jié)構(gòu)代碼中的main表示主函數(shù),每一個(gè)C++程序都必須包含一個(gè)且只能包含一個(gè)main函數(shù)。main函數(shù)體是用一對(duì)花括號(hào)“{”和“}”括起來(lái)的.函數(shù)體中包括若干條語(yǔ)句,每一條語(yǔ)句都以分號(hào)“;”作為結(jié)束的標(biāo)志。C++用標(biāo)準(zhǔn)輸入輸出的頭文件iostream.h1.2程序書(shū)寫規(guī)范

標(biāo)識(shí)符命名

標(biāo)識(shí)符是用來(lái)標(biāo)識(shí)變量名、函數(shù)名、數(shù)組名、類名、對(duì)象名、類型名、文件名等的有效字符序列。標(biāo)識(shí)符命名需要遵守其合法性、有效性和易讀性的原則。

(1)合法性

C++規(guī)定標(biāo)識(shí)符由大小寫字母、數(shù)字字符(0~9)和下劃線組成,且第一個(gè)字符必須為字母或下劃線。 任何標(biāo)識(shí)符中都不能有空格、標(biāo)點(diǎn)符號(hào)、運(yùn)算符及其他非法字符。標(biāo)識(shí)符的大小寫是有區(qū)別的,并且不能和系統(tǒng)的關(guān)鍵字同名。關(guān)鍵字見(jiàn)課本p2想想為什么?1.2程序書(shū)寫規(guī)范(2)有效性

標(biāo)識(shí)符的長(zhǎng)度最好不要超過(guò)32個(gè),有的編譯系統(tǒng)只能識(shí)別前32個(gè)字符,前32個(gè)字符相同的兩個(gè)不同標(biāo)識(shí)符被有的系統(tǒng)認(rèn)為是同一個(gè)標(biāo)識(shí)符。

(3)易讀性 做到“見(jiàn)名知意”就可以達(dá)到易讀性的目的。許多程序員采用“匈牙利標(biāo)記法”來(lái)定義標(biāo)識(shí)符。1.2程序書(shū)寫規(guī)范縮進(jìn)和注釋縮進(jìn)和注釋非常重要,今后會(huì)反復(fù)強(qiáng)調(diào)。

程序在書(shū)寫時(shí)不要將程序的每一行都由第一列開(kāi)始,應(yīng)在語(yǔ)句前面加進(jìn)一些空格,稱為“縮進(jìn)”,或是在適當(dāng)?shù)牡胤郊舆M(jìn)一些空行,以提高程序的可讀性。每個(gè)花括號(hào)占一行,并與使用花括號(hào)的語(yǔ)句對(duì)齊?;ɡㄌ?hào)內(nèi)的語(yǔ)句采用縮進(jìn)書(shū)寫格式,縮進(jìn)量為四個(gè)字符(一個(gè)默認(rèn)的制表符)。1.2程序書(shū)寫規(guī)范注釋是為了提高程序的可讀性。注釋本身對(duì)編譯和運(yùn)行并不起作用。在程序中,凡是放在“/**/”之間或以“//”開(kāi)頭行尾的內(nèi)容都是注釋的內(nèi)容,其中,/**/注釋方式可以出現(xiàn)在程序中的任何位置。一般來(lái)說(shuō),注釋應(yīng)在編程的過(guò)程中進(jìn)行,且注釋內(nèi)容一般有:源程序的總體注釋、函數(shù)注釋及其他的少量注釋。一般不要陳述那些一目了然的內(nèi)容,以免影響注釋的效果。1.3數(shù)據(jù)類型

1.3.1基本數(shù)據(jù)類型

C/C++的基本數(shù)據(jù)類型有字符型(char)、整型(int)和浮點(diǎn)型(float、double)三種。這些基本數(shù)據(jù)類型還可用short、long、signed和unsigned來(lái)修飾。見(jiàn)課本p4

需要注意的是:

(1)

C++可以有布爾型(bool),在計(jì)算機(jī)內(nèi),編譯系統(tǒng)將true表示成整數(shù)1,false表示成整數(shù)0,因此也可把布爾型看成是一個(gè)整型。

(2)

無(wú)符號(hào)(unsigned)和有符號(hào)(signed)的區(qū)別在于數(shù)值最高位的含義。有符號(hào)類型最高位是符號(hào)位,其余各位表示數(shù)值大??;無(wú)符號(hào)類型的各個(gè)位都用來(lái)表示數(shù)值大小;相同基本數(shù)據(jù)類型的signed和unsigned的數(shù)值范圍是不同。例如,無(wú)符號(hào)字符型值的范圍為0~255,有符號(hào)字符型值的范圍為-128~-127。1.3數(shù)據(jù)類型

(3)char、short、int和long可統(tǒng)稱為整型。默認(rèn)時(shí),char、short、int和long本身是有符號(hào)(signed)的。1.3.2常量整型常量

整型常量可以用十進(jìn)制、八進(jìn)制和十六進(jìn)制來(lái)表示。十進(jìn)制整型常量即十進(jìn)制整數(shù);八進(jìn)制整型常量是以0開(kāi)頭的數(shù);十六進(jìn)制整型常量是以0x或0X開(kāi)頭的數(shù),它由0至9、A至F或a至f組成。

(0123,0x123,-0x11,0xb)

1.3數(shù)據(jù)類型注意:

(1)整型常量中的長(zhǎng)整型(long)要以L或小寫字母l作為結(jié)尾。

(2)整型常量中的無(wú)符號(hào)型(unsigned)要以U或u作為結(jié)尾。浮點(diǎn)型常量

浮點(diǎn)型常量即實(shí)數(shù),它有十進(jìn)制數(shù)或指數(shù)兩種表示形式。十進(jìn)制數(shù)形式是由整數(shù)部分和小數(shù)部分組成的(注意必須有小數(shù)點(diǎn))。指數(shù)形式采用科學(xué)表示法,它能表示出很大或很小的浮點(diǎn)數(shù)。注意字母E(或e)前必須有數(shù)字,且后面的指數(shù)必須是整數(shù)。(345e+2,-3.2e+5,.5e-2,e3,.e3,2.1e3.5)浮點(diǎn)型常量以F(或f)結(jié)尾的表示單精度類型(float),以L(或小寫字母l)結(jié)尾的,表示長(zhǎng)雙精度類型(longdouble)。若浮點(diǎn)型常量沒(méi)有任何說(shuō)明,表示雙精度類型(double)。字符常量字符常量是用單引號(hào)括起來(lái)的一個(gè)字符。C/C++可以用一個(gè)“\”開(kāi)頭的字符來(lái)表示特殊含義的字符常量。例如‘\n’,代表一個(gè)換行符,而不是表示字母n。這種將反斜杠(\)后面的字符轉(zhuǎn)換成另外意義的方法稱為轉(zhuǎn)義表示法,‘\n’稱為轉(zhuǎn)義字符。

字符串常量

C++可以使用字符串常量。字符串常量是一對(duì)雙引號(hào)括起來(lái)的字符序列。例如:“Hello,World!\n”。字符串常量中還可以包含空格、轉(zhuǎn)義字符或其他字符。并且必須在同一行書(shū)寫,若一行寫不下,則需要用‘\’來(lái)連接。例如:“ABCD\EFGHI”由于雙引號(hào)用作字符串的界限符,所以字符串中必須以轉(zhuǎn)義字符“\”“表示雙引號(hào),例如:”Pleaseenter\”good\””;字符常量和字符串常量主要的區(qū)別:(1)

字符常量用單引號(hào)括起來(lái)的,僅占一個(gè)字節(jié);字符串常量是用雙引號(hào)括起來(lái)的,至少占用兩個(gè)字節(jié)?!癮”是字符串常量,它的長(zhǎng)度不是1而是2,除字符a之外,末尾還有個(gè)‘\0’字符。每個(gè)字符串的末尾都有一個(gè)這樣的字符。(2)

字符常量實(shí)際上是整型常量的特殊形式,它可以參與常用的算術(shù)運(yùn)算;而字符串常量則不能。符號(hào)常量 在C++中,除了用C語(yǔ)言的#define定義符號(hào)常量外,還常常用const來(lái)定義符號(hào)常量。例:#definesize20//結(jié)尾不加分號(hào)

constintsize=20;1.3.3變量變量的定義

定義變量是用下面的格式:<類型><變量名列表>;(1)

可以將同類型的變量定義在一行語(yǔ)句中,不過(guò)變量名要用逗號(hào)(,)分隔。但在同一個(gè)程序塊中,不能有兩個(gè)相同的變量名。(2)

注意在C++中沒(méi)有字符串變量類型,字符串是用字符類型的數(shù)組或指針來(lái)定義的。(3)與C語(yǔ)言相比,C++變量的定義比較自由。

變量的初始化

程序中常需要對(duì)一些變量預(yù)先設(shè)置初值,這一過(guò)程稱為初始化。在C/C++中,可以在定義變量時(shí)同時(shí)使變量初始化。

C++變量的初始化還有另外一種形式,它與C語(yǔ)言不同。例如:

intnX(1),nY(3);

表示nX和nY是整型變量,它們的初值分別為1和3。1.3數(shù)據(jù)類型1.3.4數(shù)據(jù)類型轉(zhuǎn)換

自動(dòng)轉(zhuǎn)換

自動(dòng)轉(zhuǎn)換是將數(shù)據(jù)類型從低到高的順序進(jìn)行轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換

強(qiáng)制類型轉(zhuǎn)換是在程序中通過(guò)指定數(shù)據(jù)類型來(lái)改變圖所示的類型轉(zhuǎn)換順序,將一個(gè)變量從其定義的類型改變?yōu)榱硪环N新的類型。強(qiáng)制類型轉(zhuǎn)換有兩種格式:(<類型名>)<表達(dá)式> <類型名>(<表達(dá)式>)

這里的“類型名”是任何合法的C/C++數(shù)據(jù)類型,通過(guò)類型的強(qiáng)制轉(zhuǎn)換可以將“表達(dá)式”轉(zhuǎn)換成指定的類型。

1.3數(shù)據(jù)類型1.3.5數(shù)組

數(shù)組的定義 定義一個(gè)數(shù)組可按下列格式進(jìn)行:

<類型><數(shù)組名>[<常量表達(dá)式1>][<常量表達(dá)式2>]... <數(shù)組名>后面的常量表達(dá)式用于確定數(shù)組的維數(shù)和大小。 一般表示某維大小的常量表達(dá)式中不能包含變量,但可以包括常量和符號(hào)常量,其值必須是一個(gè)確定的整型數(shù)值,且數(shù)值大于1。

引用格式:

<數(shù)組名>[<下標(biāo)>]...

數(shù)組的賦值數(shù)組中的元素既可以在數(shù)組定義的同時(shí)賦初值,也可以在定義后賦值。如:數(shù)組元素的引用

intb[5]={1,2};

有時(shí),在對(duì)全部數(shù)組元素賦初值時(shí),可以不指定數(shù)組的長(zhǎng)度,如:

intc[]={1,2,3,4,5};對(duì)于二維或多維數(shù)組也可同樣進(jìn)行初始化,需要說(shuō)明的是:

(1)初始化數(shù)組的值的個(gè)數(shù)不能多于數(shù)組元素個(gè)數(shù),初始化數(shù)組的值也不能通過(guò)跳過(guò)逗號(hào)的方式來(lái)省略。 如:intf[5]={1,,3,4,5};//錯(cuò)誤

intg[5]={1,2,3,};//在VC++中正確,它忽略最后一個(gè)值的逗號(hào)。

inth[5]={}; //語(yǔ)法格式錯(cuò)誤

(2)對(duì)于二維數(shù)組來(lái)說(shuō),如果對(duì)全部元素都賦初值,則定義數(shù)組時(shí)對(duì)第一維的大小可以忽略,但第二維的大小不能省。

如:intk[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

(3)只對(duì)部分元素賦初值,可有兩種說(shuō)明方式:一種是以“行”為單位,依次列出部分元素的值;另一種是以數(shù)組元素的排列順序依次列出前面部分元素的值。 例如:intm[3][4]={{1,2},{3},{4,5,6}};沒(méi)有明確列舉元素值的元素,其值均為0。

(例Ex_ArraySort)字符數(shù)組

C/C++語(yǔ)言中,一個(gè)字符串是用一個(gè)以空字符‘\0’作為結(jié)束符的字符串來(lái)表示的。例如:

charch[]={“hello!”};或

charch[]=“hello!”;或

charch[]={‘h’,’e’,’l’,’l’,’o’,’!’,’\0’};

上述定義的字符數(shù)組沒(méi)有指定數(shù)組長(zhǎng)度的目的是,避免在初始化時(shí),字符串中的字符個(gè)數(shù)大于數(shù)組長(zhǎng)度,產(chǎn)生語(yǔ)法錯(cuò)誤;如果指定數(shù)組長(zhǎng)度大于字符串中的字符個(gè)數(shù),那么其余的元素將被系統(tǒng)默認(rèn)為空字符‘\0’。

charch[6]=“Hello!”;//數(shù)組超界錯(cuò)誤對(duì)于二維字符數(shù)組,其初始化也可依上進(jìn)行,如:

charstr[][4]={“How”,”are”,”you”};

這時(shí),數(shù)組元素str[0][0]表示一個(gè)字符,值為‘H’;str[0]表示一個(gè)字符串“How”,因?yàn)閟tr[0]是一個(gè)一維字符數(shù)組。1.3數(shù)據(jù)類型1.3.6結(jié)構(gòu)體定義結(jié)構(gòu)體

結(jié)構(gòu)體定義的格式為:struct<結(jié)構(gòu)體名>{ <成員定義1>;

<成員定義2>;

... <成員定義n>;

}[結(jié)構(gòu)變量名列表];

結(jié)構(gòu)體定義是以關(guān)鍵字struct作為標(biāo)志的,<結(jié)構(gòu)體名>應(yīng)是一個(gè)有效的標(biāo)識(shí)符。在結(jié)構(gòu)體中的每個(gè)成員都必須通過(guò)“成員定義”來(lái)確定成員名及其類型。

structPERSON { char name[25]; int age; char sex; }family_member;

可以在結(jié)構(gòu)體定義后再定義結(jié)構(gòu)體變量,如:structPERSONsister;//struct關(guān)鍵字可以省略PERSONyou,me,he;注意:結(jié)構(gòu)體的成員變量類型既可以是基本數(shù)據(jù)類型,也可以是其他合法的類型。例如:structSTUDENT { PERSON one; //用已定義的結(jié)構(gòu)體類型聲明成員

floateng,phy,math,poli;//英語(yǔ)、物理、數(shù)學(xué)和政治的成 績(jī)

};1.3數(shù)據(jù)類型1.3.6結(jié)構(gòu)體結(jié)構(gòu)體變量的初始化和引用

結(jié)構(gòu)體變量的初始化的一般形式是在變量后面加上:={<初值列表>};

例如:

structPOINT { intx; inty; }spot={20,40}; //依次使spot中的x為20,y為40

POINTpt1={100,200}; //使pt1中的x為100,y為200 POINTpt2={100}; //只是使pt2中的x為100

當(dāng)一個(gè)結(jié)構(gòu)體變量定義之后,就可引用這個(gè)變量。使用時(shí),遵循下列規(guī)則:

(1)只能引用結(jié)構(gòu)體變量中的成員變量,使用格式:<結(jié)構(gòu)體變量名>.<成員變量名>。

例如:cout<<spot.x<<spot.y;

“.”是成員運(yùn)算符,它的優(yōu)先級(jí)是最高的。(2)若成員本身又是一個(gè)結(jié)構(gòu)體變量,引用時(shí)需要用多個(gè)成員運(yùn)算符一級(jí)一級(jí)地找到要訪問(wèn)的成員。例如:

structRECT { POINTptLeftTop; POINTptRightDown; }rc={{10,20},{40,50}};

1.3數(shù)據(jù)類型1.3.7共用體共用體和結(jié)構(gòu)體最大的區(qū)別是:共用體在任一時(shí)刻只有一個(gè)成員處于活動(dòng)狀態(tài),且共用體變量所占的內(nèi)存長(zhǎng)度等于各個(gè)成員中最長(zhǎng)成員的長(zhǎng)度,而結(jié)構(gòu)體變量所占的內(nèi)存長(zhǎng)度等于各個(gè)成員的長(zhǎng)度之和。共用體中各個(gè)成員所占內(nèi)存的字節(jié)數(shù)各不相同,但都是從同一地址開(kāi)始的,使用覆蓋的方式共享存儲(chǔ)單元。這種多個(gè)成員變量共用一個(gè)內(nèi)存區(qū)的技術(shù),能有效地降低程序所占的內(nèi)存空間。定義一個(gè)共用體可用下列格式:

union<共用體名> { <成員定義1>;

<成員定義2>;

... <成員定義n>;

}[共用體變量名列表]; //注意最后的分號(hào)不要忘記。共用體除了關(guān)鍵字(union)不同外,其使用方法均與結(jié)構(gòu)體相同。

1.3數(shù)據(jù)類型1.3.8枚舉類型

枚舉類型是一系列有標(biāo)識(shí)符的整型常量的集合,增加程序代碼的可讀性。格式:

enum<枚舉類型名>{<枚舉常量列表>}[枚舉變量]; //注意最后的分號(hào)不要忘記。enum是關(guān)鍵字,枚舉常量表中的枚舉常量名之間要用逗號(hào)分隔。默認(rèn)時(shí),系統(tǒng)為每一個(gè)枚舉常量都對(duì)應(yīng)一個(gè)整數(shù),并從0開(kāi)始,逐個(gè)增1。例如:enumColors{Black,Blue,Green=4,Cyan,Red=8,Yellow,White}one;則各枚舉常量對(duì)應(yīng)的整數(shù)依次為0,1,4,5,8,9,10。枚舉變量最終的值只能等于該枚舉類型中的某個(gè)枚舉常量,而不能用一個(gè)整型數(shù)值直接賦值,并且不要在定義枚舉類型的同時(shí),再對(duì)枚舉常量、枚舉變量及枚舉類型名重新定義。例:

ColorsMyColor;MyColor=Green;

1.3.9用typedef定義類型 使用關(guān)鍵字typedef可以將已有的類型名用新的類型名來(lái)代替,格式:

typedef <已有的類型名><類型別名>;

例如:

typedef float FLOAT; typedef char CH10[10];

這里,F(xiàn)LOAT表示float類型,CH10表示具有10個(gè)元素的字符數(shù)組類型,這樣,在以后的代碼中,就可以使用這些類型名定義新的變量,如:

FLOAT x,y; CH10 a,b//a,b都是具有10個(gè)元素的字符數(shù)組等價(jià)于:

float x,y; char x[10],y[10];1.4運(yùn)算符和表達(dá)式

1.4.1算術(shù)運(yùn)算符

算術(shù)運(yùn)算符包括雙目的加減乘除四則運(yùn)算符、求余運(yùn)算符以及單目的正負(fù)運(yùn)算符。算術(shù)運(yùn)算符如下所示:

+ (正號(hào)運(yùn)算符,如+4,+1.23等) - (負(fù)號(hào)運(yùn)算符,如-4,-1.23等) * (乘法運(yùn)算符,如6*8,1.4*3.56等) / (除法運(yùn)算符,如6/8,1.4/3.56等) % (模運(yùn)算符或求余運(yùn)算符,如40%11等) + (加法運(yùn)算符,如6+8,1.4+3.56等) - (減法運(yùn)算符,如6-8,1.4-3.56等)

注意:(1)

兩個(gè)整數(shù)相除,將保留整數(shù)部分,不是四舍五入;進(jìn)行浮點(diǎn)數(shù)除法,結(jié)果是浮點(diǎn)型。如7/5.0、7.0/5、7.0/5.0的結(jié)果都是1.4。(2)求余運(yùn)算要求參與運(yùn)算的兩個(gè)操作數(shù)都是整型,其結(jié)果是兩個(gè)數(shù)相除的余數(shù)。例如40%5的結(jié)果是0,40%11的結(jié)果是7。要理解負(fù)值的求余運(yùn)算,例如40%-11結(jié)果是7,-40%11結(jié)果是-7,-40%-11結(jié)果也是-7。

1.4運(yùn)算符和表達(dá)式1.4.2賦值運(yùn)算符復(fù)合賦值

10種復(fù)合賦值運(yùn)算符:+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=

注意:

(1)

在復(fù)合賦值運(yùn)算符之間不能有空格。(2)復(fù)合運(yùn)算符的優(yōu)先級(jí)和賦值符的優(yōu)先級(jí)一樣,在C/C++的所有運(yùn)算符中只高于逗號(hào)運(yùn)算符,而且復(fù)合賦值運(yùn)算符的結(jié)合性也是從右至左的。

如:a*=b-4/c+d;等價(jià)于a=a*(b-4/c+d);多重賦值

多重賦值是指在一個(gè)賦值表達(dá)式中出現(xiàn)兩個(gè)或更多的賦值符(“=”)

例如:

nNum1=nNum2=nNum3=100;

賦值符的結(jié)合性是從右至左的,上述的賦值是這樣的過(guò)程:首先對(duì)賦值表達(dá)式nNum3=100求值,即將100賦值給nNum3,同時(shí)該賦值表達(dá)式取得值100;然后將該值賦給nNum2,這是第二個(gè)賦值表達(dá)式,該賦值表達(dá)式也取得值100;最后將100賦給nNum1。

1.4運(yùn)算符和表達(dá)式1.4.3關(guān)系運(yùn)算符

“關(guān)系運(yùn)算”是比較兩個(gè)操作數(shù)是否符合給定的條件。符合條件,則關(guān)系表達(dá)式的值為“真”,否則為“假”。在C++編譯系統(tǒng)中,往往將“真”表示為“true”或1,將“假”表示為“false”或0。而任何不為0的數(shù)被認(rèn)為是“真”,0被認(rèn)為是“假”。關(guān)系運(yùn)算需要兩個(gè)操作數(shù),所以關(guān)系運(yùn)算符都是雙目運(yùn)算符。

C++提供了下列6種關(guān)系運(yùn)算符:

<,<=,>,>=,==(相等于),!=(不等于)前4種的優(yōu)先級(jí)相同且高于后面的兩種。例:a==b>c等效于a==(b>c)

關(guān)系運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符。1.4.4邏輯運(yùn)算符

用于將多個(gè)關(guān)系表達(dá)式或邏輯量(“真”或“假”)組成一個(gè)邏輯表達(dá)式。提供3種邏輯運(yùn)算符:

! 邏輯非(單目)將“真”變“假”,“假”變“真”。

&& 邏輯與(雙目)當(dāng)兩個(gè)操作數(shù)都是“真”時(shí),結(jié)果才為“真”,否則為“假”。

|| 邏輯或(雙目)當(dāng)兩個(gè)操作數(shù)中有一個(gè)是“真”時(shí),結(jié)果就為“真”,而只有當(dāng)它們都為“假”時(shí),結(jié)果才為“假”。

“邏輯非”、“邏輯與”和“邏輯或”的優(yōu)先級(jí)依次從高到低,“邏輯非”的優(yōu)先級(jí)比算術(shù)運(yùn)算符和關(guān)系運(yùn)算符高,“邏輯與”和“邏輯或”的優(yōu)先級(jí)比關(guān)系運(yùn)算符要低。

1.4運(yùn)算符和表達(dá)式1.4.5位運(yùn)算符

對(duì)操作數(shù)按其在計(jì)算機(jī)內(nèi)表示的二制數(shù)逐位地進(jìn)行邏輯運(yùn)算或移位運(yùn)算,參與運(yùn)算的操作數(shù)只能是整型常量或變量。提供了六種位運(yùn)算符:

~ (按位求反,單目運(yùn)算符)將一個(gè)二進(jìn)制數(shù)的每一位求反。

<< (左移,雙目運(yùn)算符)將左操作數(shù)的二進(jìn)制值向左移動(dòng)指定的位數(shù)。左移后,低位 補(bǔ)0,移出的高位舍棄。

例:表達(dá)式4<<2的結(jié)果是16(二進(jìn)制00010000),其中4時(shí)操作數(shù),2是左移的位數(shù)

>> (右移,雙目運(yùn)算符)將左操作數(shù)的二進(jìn)制值向右移動(dòng)指定的位數(shù)。右移后,移出的低位舍棄。如果是無(wú)符號(hào)數(shù)則高位補(bǔ)0;如果是有符號(hào)數(shù),則高位補(bǔ)符號(hào)位或補(bǔ)0,不同的編譯系統(tǒng)對(duì)此有不同的處理方法。

& (按位與,雙目運(yùn)算符)將兩個(gè)操作數(shù)對(duì)應(yīng)的每個(gè)二進(jìn)制位分別進(jìn)行邏輯與操作。 ^ (按位異或,雙目運(yùn)算符)將兩個(gè)操作數(shù)對(duì)應(yīng)的每個(gè)二進(jìn)制位分別進(jìn)行異或操作。

| (按位或,雙目運(yùn)算符)將兩個(gè)操作數(shù)對(duì)應(yīng)的每個(gè)二進(jìn)制位分別進(jìn)行邏輯或操作。1.4.6三目運(yùn)算符

唯一的三目運(yùn)算符是條件運(yùn)算符,格式:<條件表達(dá)式>?<表達(dá)式1>:<表達(dá)式2>。

注意:只有在表達(dá)式2后面才能出現(xiàn)分號(hào)結(jié)束符,“表達(dá)式1”和“表達(dá)式2”中都不能有分號(hào)。

例:nNum=(a>b)?10:81.4運(yùn)算符和表達(dá)式1.4.7增1和減1運(yùn)算符

++和--可放在變量的左邊也可在變量的右邊,分別稱前綴運(yùn)算符和后綴運(yùn)算符。 注意:若前綴運(yùn)算符和后綴運(yùn)算符僅用于某個(gè)變量的增1和減1,則這兩個(gè)都是等價(jià)的,但如果將這兩個(gè)運(yùn)算符和其他運(yùn)算符組合在一起,在求值次序上就會(huì)產(chǎn)生根本的不同:(1)

如果用前綴運(yùn)算符對(duì)一個(gè)變量增1(減1),則在將該變量增1(減1)后,用新的值在表達(dá)式中進(jìn)行其他的運(yùn)算。(2)

如果用后綴運(yùn)算符對(duì)一個(gè)變量增1(減1),則用該變量的原值在表達(dá)式進(jìn)行其他的運(yùn)算后,再將該變量增1(減1)。例:a=8; a=8;b=++a-1;//a=a+1,b=a-1 b=a++-1//b=a-1,a=a+11.4.8逗號(hào)運(yùn)算符

逗號(hào)運(yùn)算符是優(yōu)先級(jí)最低的運(yùn)算符,它可以使多個(gè)表達(dá)式放在一行上。計(jì)算時(shí),從左至右逐個(gè)計(jì)算每個(gè)表達(dá)式,最終整個(gè)表達(dá)式的結(jié)果是最后計(jì)算的那個(gè)表達(dá)式的類型和值。例如:

j=(i=12,i+8);

式中,i=12,i+8是含逗號(hào)運(yùn)算符的表達(dá)式,計(jì)算次序是先計(jì)算表達(dá)式i=12,然后再計(jì)算i+8,整個(gè)表達(dá)式的值是最后一個(gè)表達(dá)式的值,即i+8的值20,

從而j的結(jié)果是20。

1.4運(yùn)算符和表達(dá)式1.4.9sizeof運(yùn)算符

sizeof的目的是返回操作數(shù)所占的內(nèi)存空間大小(字節(jié)數(shù)),具有兩種格式:

sizeof(<表達(dá)式>) sizeof(<數(shù)據(jù)類型>)

同一類型的操作數(shù)在不同的計(jì)算機(jī)中占用的存儲(chǔ)字節(jié)數(shù)可能不同,因此sizeof的結(jié)果有可能不一樣。例如sizeof(int)的值可能是4,也可能是2。

1.4.10new和delete

運(yùn)算符new返回指定類型的一個(gè)指針,分配失敗則返回0。例如:

double*p; p=newdouble;

系統(tǒng)自動(dòng)根據(jù)double類型的空間大小開(kāi)辟一個(gè)內(nèi)存單元,并將地址放在指針p中。運(yùn)算符delete操作是釋放new請(qǐng)求到的內(nèi)存。例如:deletep;

需要注意的是:(1)

運(yùn)算符delete必須用于先前new分配的有效指針。如果使用了未定義的其它任何類型的指針,就會(huì)帶來(lái)嚴(yán)重問(wèn)題,如系統(tǒng)崩潰。(2)用new也可指定分配的內(nèi)存大小。

如: int*p; p=newint[60] //為p分配60個(gè)int類型的內(nèi)存單元

(3)new可以為數(shù)組分配內(nèi)存,當(dāng)釋放時(shí),必須告訴delete數(shù)組有多少個(gè)元素。如:

int*p;p=newint[10];……. delete[10]p;(4)用new可以對(duì)指定分配的內(nèi)存進(jìn)行初始化

int*p;p=newint(0);1.5基本語(yǔ)句

1.5.1表達(dá)式語(yǔ)句、空語(yǔ)句和復(fù)合語(yǔ)句

表達(dá)式語(yǔ)句、空語(yǔ)句及復(fù)合語(yǔ)句是一些系統(tǒng)順序執(zhí)行的語(yǔ)句又稱為順序語(yǔ)句。任何一個(gè)表達(dá)式加上分號(hào)就是一個(gè)表達(dá)式語(yǔ)句。如果表達(dá)式是一個(gè)空表達(dá)式,那么構(gòu)成的語(yǔ)句稱為空語(yǔ)句??照Z(yǔ)句僅為語(yǔ)法的需要而設(shè)置,并不執(zhí)行任何動(dòng)作。復(fù)合語(yǔ)句是由兩條或兩條以上的語(yǔ)句組成的,并由一對(duì)花括號(hào)({})括起來(lái)的語(yǔ)句。又稱塊語(yǔ)句。復(fù)合語(yǔ)句中的語(yǔ)句可以是單條語(yǔ)句(包括空語(yǔ)句),也可以再包含復(fù)合語(yǔ)句。注意:在復(fù)合語(yǔ)句中定義的變量只作用于該復(fù)合語(yǔ)句的范圍,而在復(fù)合語(yǔ)句外,這些變量卻不能被調(diào)用。1.5.2選擇語(yǔ)句

條件語(yǔ)句

格式:

if(<表達(dá)式>)<語(yǔ)句1> [else <語(yǔ)句2>]注意:(1)

條件語(yǔ)句中的表達(dá)式一般為邏輯表達(dá)式或關(guān)系表達(dá)式。表達(dá)式的類型也可以是任意的數(shù)值類型(包括整型、浮點(diǎn)型、字符型等)。(2)

適當(dāng)添加一些花括號(hào)(“{}”)來(lái)增加程序的可讀性。(3)

條件語(yǔ)句中的語(yǔ)句1和語(yǔ)句2也可是if條件語(yǔ)句,這就形成了if語(yǔ)句的嵌套。

else總是和其前面最近的if配套的。

1.5基本語(yǔ)句開(kāi)關(guān)語(yǔ)句

開(kāi)關(guān)語(yǔ)句switch能很好地解決嵌套太多這種問(wèn)題,它具有下列形式:

switch(<表達(dá)式>) { case<常量表達(dá)式1> :[語(yǔ)句1] case<常量表達(dá)式2> :[語(yǔ)句2] ... case<常量表達(dá)式n> :[語(yǔ)句n] [default :語(yǔ)句n+1]}

當(dāng)表達(dá)式的值與case中某個(gè)表達(dá)式的值相等時(shí),就執(zhí)行該case中“:”號(hào)后面的所有語(yǔ)句。若case中所有表達(dá)式的值都不等于表達(dá)式的值,則執(zhí)行default:后面的語(yǔ)句,若default不存在,則跳出switch結(jié)構(gòu)。

注意:

(1)

switch后面的表達(dá)式可以是整型、字符型或枚舉型的表達(dá)式,而case后面的常量表達(dá)式的類型必須與其匹配。

(2)

多個(gè)case可以共有一組執(zhí)行語(yǔ)句。

(3)

若同一個(gè)case后面的語(yǔ)句是復(fù)合語(yǔ)句,則這些語(yǔ)句可以不用花括號(hào)(“{}”)括起來(lái)。

(4)

case語(yǔ)句起標(biāo)號(hào)作用,因此每一個(gè)case常量表達(dá)式的值必須互不相同,否則會(huì)出現(xiàn)編譯錯(cuò)誤。

(5) 合理使用break語(yǔ)句使其跳出switch結(jié)構(gòu),以保證結(jié)果的正確性;若沒(méi)有break語(yǔ)句,則后面的語(yǔ)句繼續(xù)執(zhí)行,直到switch結(jié)構(gòu)的最后一個(gè)花括號(hào)(“}”)為止才跳出該結(jié)構(gòu)。

1.5基本語(yǔ)句1.5.3循環(huán)語(yǔ)句while循環(huán)語(yǔ)句 語(yǔ)句格式:

while(<表達(dá)式>) <語(yǔ)句> <語(yǔ)句>是循環(huán)體,可以是一條語(yǔ)句,也可以是復(fù)合語(yǔ)句。當(dāng)表達(dá)式為非0時(shí)便開(kāi)始執(zhí)行while循環(huán)體中的語(yǔ)句,然后反復(fù)執(zhí)行,每次執(zhí)行都會(huì)判斷表達(dá)式是否為非0,若等于0,則終止循環(huán)。

注意:循環(huán)體中應(yīng)有使循環(huán)趨向結(jié)束的語(yǔ)句。(例Ex_SumWhile)do...while循環(huán)語(yǔ)句 語(yǔ)句格式:

do<語(yǔ)句> while(<表達(dá)式>)

當(dāng)語(yǔ)句執(zhí)行到while時(shí),將判斷表達(dá)式是否為非0值,若是,則繼續(xù)執(zhí)行循環(huán)體,直到下一次表達(dá)式等于0為止。(例Ex_SumDoWhile)1.5基本語(yǔ)句for循環(huán)語(yǔ)句

語(yǔ)句格式:

for([表達(dá)式1];[表達(dá)式2];[表達(dá)式3])<語(yǔ)句>

一般情況下,[表達(dá)式1]用作循環(huán)變量的初始化,[表達(dá)式2]是循環(huán)體的判斷條件,當(dāng)?shù)扔诜?時(shí),開(kāi)始執(zhí)行循環(huán)體,再計(jì)算[表達(dá)式3],再判斷表達(dá)式2的值是否為非0,若是,再執(zhí)行循環(huán)體,再計(jì)算表達(dá)式3,如此反復(fù),直到表達(dá)式2等于0為止。

注意:表達(dá)式1、2、3都可以省略,分號(hào)“;”不能省略。省略表達(dá)式1,不影響正確執(zhí)行,但所需要的一些變量及其相關(guān)的數(shù)值要在for語(yǔ)句之前定義。省略表達(dá)式2,則表達(dá)式2的值被認(rèn)為是“真”,

循環(huán)無(wú)終止地進(jìn)行下去,應(yīng)在循環(huán)體中使用break語(yǔ)句。省略表達(dá)式3,應(yīng)在設(shè)計(jì)循環(huán)結(jié)構(gòu)時(shí)保證表達(dá)式2的值有等于0的可能,以便能終止循環(huán)。下面幾種方式,其作用和結(jié)果都是一樣的:

方式1:

intnNum=1,nTotal=0; for(;nNum<=50;nNum++) { nTotal+=nNum; }方式2: ` 方式3:

intnNum=1,nTotal=0; intnNum=1,nTotal=0; for(;nNum<=50;) for(;;) { { nTotal+=nNum; nTotal+=nNum; nNum++; nNum++; } if(nNum>50)break; }(2)

表達(dá)式1和表達(dá)3可以是一個(gè)簡(jiǎn)單的表達(dá)式,也可以是逗號(hào)表達(dá)式,即包含兩個(gè)或兩個(gè)以上的簡(jiǎn)單表達(dá)式,中間用逗號(hào)分隔。甚至還可以定義變量。例如:

intnTotal=0; for(intnNum=1;nNum<=50;nNum++)nTotal+=nNum;(3)

由于循環(huán)體是由任何類型的語(yǔ)句組成的,因此在循環(huán)體內(nèi)還可以包含前面的幾種循環(huán)語(yǔ)句,這樣就形成了循環(huán)的嵌套。1.5.4break、continue語(yǔ)句

跳出循環(huán)結(jié)構(gòu)或重新開(kāi)始循環(huán),就得使用break和continue語(yǔ)句,格式如下:

break; //可以從一個(gè)循環(huán)體跳出,也可以跳出switch結(jié)構(gòu)。

break語(yǔ)句只能用于循環(huán)語(yǔ)句和switch-case語(yǔ)句中,有兩個(gè)用途:

1)在switch語(yǔ)句中用來(lái)使流程跳出swith結(jié)構(gòu),繼續(xù)執(zhí)行switch語(yǔ)句后面的語(yǔ)句。

2)在循環(huán)體內(nèi),迫使所在循環(huán)立即終止,即跳出本層循環(huán)體,執(zhí)行循環(huán)體后面的語(yǔ)句。注意:break語(yǔ)句只能結(jié)束包含它的最內(nèi)層循環(huán),而不能跳出多重循環(huán)。

for() { … while() { if() break;

… } }continue; //用于依靠條件判斷而進(jìn)行循環(huán)的循環(huán)語(yǔ)句,如for、 while語(yǔ)句。對(duì)于for語(yǔ)句來(lái)說(shuō),continue的目的是將流程轉(zhuǎn)到for語(yǔ)句的表達(dá)2和表達(dá)式3。(例(Ex_Continue)Continue與break的區(qū)別:Continue只結(jié)束本次循環(huán),而不是終止整個(gè)循環(huán)語(yǔ)句的執(zhí)行,break則是終止整個(gè)循環(huán)語(yǔ)句的執(zhí)行,跳出所在循環(huán)體,轉(zhuǎn)到循環(huán)語(yǔ)句外的下一條語(yǔ)句去執(zhí)行1.6函數(shù)1.6.1函數(shù)的定義和調(diào)用

函數(shù)的定義格式

定義的格式如下:

<函數(shù)類型><函數(shù)名>(<形式參數(shù)表>) {<若干語(yǔ)句> }

函數(shù)名后面必須跟一對(duì)圓括號(hào)“()”以區(qū)別變量名及其他用戶定義的標(biāo)識(shí)名。形參寫在括號(hào)內(nèi),參數(shù)可以是0,表示沒(méi)有參數(shù),但圓括號(hào)不能省略。也可以是一個(gè)或多個(gè),多個(gè)參數(shù)間要用逗號(hào)分隔。 函數(shù)的函數(shù)體由在一對(duì)花括號(hào)中的若干條語(yǔ)句組成,用于實(shí)現(xiàn)這個(gè)函數(shù)執(zhí)行的動(dòng)作。C/C++不允許在一個(gè)函數(shù)體中再定義函數(shù)。

函數(shù)的聲明

聲明函數(shù)格式:

<函數(shù)類型><函數(shù)名>(<形式參數(shù)表>);

形參的變量名可以省略。但注意,函數(shù)聲明的內(nèi)容應(yīng)和函數(shù)的定義相同。

intsum(intx,inty);和intsum(int,int);是等價(jià)的。 函數(shù)的聲明必須在函數(shù)定義前進(jìn)行或在調(diào)用前進(jìn)行。函數(shù)的調(diào)用

函數(shù)調(diào)用格式為:

<函數(shù)名>(<實(shí)際參數(shù)表>);

實(shí)參與形參相對(duì)應(yīng),是實(shí)際調(diào)用函數(shù)時(shí)所給定的常量、變量或表達(dá)式,必須有確定的值。

1.6函數(shù)1.6.2帶默認(rèn)形參值的函數(shù)

C++允許在函數(shù)的聲明或定義時(shí)給一個(gè)或多個(gè)參數(shù)制訂默認(rèn)值。這樣在調(diào)用時(shí),可以不給出參數(shù),而按指定的默認(rèn)值進(jìn)行傳遞。例如:

例Ex_Default

#include<iostream.h> voiddisplay(inta,intb=2,intc=3) { cout<<“a=“<<a<<“,b=“<<b<<“,c=“<<c<<“\n”; }

voidmain() { display(1); display(1,5); display(1,7,9); }注意:

(1)

當(dāng)函數(shù)既有聲明又有定義后,不能在函數(shù)定義中指定默認(rèn)參數(shù)。

(2)

默認(rèn)參數(shù)值可以是全局變量、全局常量、一個(gè)函數(shù)。不可以是局部變量,因?yàn)槟J(rèn)參數(shù)的函數(shù)調(diào)用是在編譯時(shí)確定的,局部變量的值在編譯時(shí)無(wú)法確定。

(3)一個(gè)函數(shù)中有多個(gè)默認(rèn)參數(shù)時(shí),則形參分布中,默認(rèn)參數(shù)應(yīng)從右到左逐漸定義。函數(shù)調(diào)用時(shí),系統(tǒng)按從左到右的順序?qū)?shí)參與形參結(jié)合,當(dāng)實(shí)參的數(shù)目不足時(shí),系統(tǒng)將按同樣的順序用聲明或定義中的默認(rèn)值來(lái)補(bǔ)齊所缺少的參數(shù)。

1.6.3函數(shù)的遞歸調(diào)用

C++允許在調(diào)用一個(gè)函數(shù)的過(guò)程中出現(xiàn)直接地或間接地調(diào)用函數(shù)本身,這種情況稱為函數(shù)的“遞歸”調(diào)用,相應(yīng)的函數(shù)稱為遞歸函數(shù)。(例Ex_Factorial)

遞歸函數(shù)中必須要有結(jié)束遞歸過(guò)程的條件,否則遞歸會(huì)無(wú)限制地進(jìn)行下去。 遞歸調(diào)用編寫的程序簡(jiǎn)潔清晰,但每次調(diào)用函數(shù)時(shí),都需要分配內(nèi)存來(lái)保存現(xiàn)場(chǎng)和返回地址,內(nèi)存空間開(kāi)銷很大,有時(shí)會(huì)引起棧內(nèi)存溢出。1.6函數(shù)1.6.4內(nèi)聯(lián)函數(shù)

程序的執(zhí)行過(guò)程中,調(diào)用函數(shù)時(shí)先要保存主調(diào)函數(shù)的現(xiàn)場(chǎng)和返回地址,然后程序轉(zhuǎn)移到被調(diào)函數(shù)的起始地址繼續(xù)執(zhí)行。被調(diào)函數(shù)執(zhí)行結(jié)束后,先恢復(fù)主調(diào)函數(shù)的現(xiàn)場(chǎng),取出返回地址并將返回值賦給函數(shù)調(diào)用本身,最后在返回地址處開(kāi)始繼續(xù)執(zhí)行。當(dāng)函數(shù)體比較小時(shí),且執(zhí)行的功能比較簡(jiǎn)單時(shí),這種函數(shù)調(diào)用方式的系統(tǒng)開(kāi)銷相對(duì)較大。內(nèi)聯(lián)函數(shù)把函數(shù)體的代碼直接插入到調(diào)用處,將調(diào)用函數(shù)的方式改為順序執(zhí)行直接插入的程序代碼,這樣可以減少程序的執(zhí)行時(shí)間,但同時(shí)需要更多的內(nèi)存空間。

內(nèi)聯(lián)函數(shù)的定義方法是在函數(shù)定義時(shí),在函數(shù)的類型前增加關(guān)鍵字inline。(例Ex_Inline)

注意:

(1)

內(nèi)聯(lián)函數(shù)也要遵循定義在前,調(diào)用在后的原則。

(2)

需要定義成的內(nèi)聯(lián)函數(shù)不能含有循環(huán)、switch和復(fù)雜嵌套的if語(yǔ)句。

(3)

遞歸函數(shù)是不能被用來(lái)做內(nèi)聯(lián)函數(shù)的。 編譯器是否將用戶定義成的內(nèi)聯(lián)函數(shù)作為真正的內(nèi)聯(lián)函數(shù)處理由它自行決定。

1.6函數(shù)1.6.5函數(shù)的重載

它允許多個(gè)同名的函數(shù)存在,但同名的各個(gè)函數(shù)的形參必須有區(qū)別:形參的個(gè)數(shù)不同,或者形參的個(gè)數(shù)相同,但參數(shù)類型有所不同。

(例Ex_OverLoad)需要說(shuō)明的是:(1)

重載函數(shù)必須具有不同的參數(shù)個(gè)數(shù)或不同的參數(shù)類型,若只有返回值的類型不同是不行的。 如:inttest(inta,intb); doubletest(inta,intb);(2)

當(dāng)函數(shù)的重載帶有默認(rèn)參數(shù)時(shí),應(yīng)該注意避免二義性。 例如:

intfun(inta,intb=0); intfun(inta);

是錯(cuò)誤的。因?yàn)槿绻泻瘮?shù)調(diào)用fun(2)時(shí),編譯器無(wú)法準(zhǔn)確地確定應(yīng)調(diào)用哪個(gè)函數(shù)。

1.7指針和引用

1.7.1指針和指針變量

指針變量不同于其它類型的變量,它是用來(lái)專門存放地址的。 指針變量格式定義:

<類型名>*<指針變量名1>[,*<指針變量名2>,...];

“*”是一個(gè)定義指針變量的說(shuō)明符,指針變量前面都需這樣的“*”標(biāo)明。例如:

int *pInt1,*pInt2; //pInt1,pInt2是指向整型變量的指針

float *pFloat; //指向浮點(diǎn)型變量

char *pChar //指向字符型變量的指針,通常用來(lái)處理 字符串1.7.2&和*運(yùn)算符

&(取地址運(yùn)算符)、*(取值運(yùn)算符)運(yùn)算符“&”只能對(duì)變量操作,作用是取該變量的地址。對(duì)于常量,表達(dá)式以及寄存器變量不能取地址,不允許以下形式:

&3,&(i+4),registerintx;

這些常量、表達(dá)式、寄存器變量的值都不是存放在內(nèi)存某個(gè)存儲(chǔ)單元中,而是放在寄存器里,寄存器無(wú)地址。且,在程序中取一個(gè)變量的地址必須在定義變量后才可進(jìn)行。運(yùn)算符“*”用于指針類型的變量操作,作用是取該指針?biāo)竷?nèi)存單元中存儲(chǔ)的內(nèi)容。例如:

inta=3; //整型變量,初值為3int*p=&a; //指向整形變量的指針,其值等于a的地 址

intb=*p; //將指針?biāo)傅牡刂分械膬?nèi)容賦值給b,值為3說(shuō)明:

(1)在使用指針變量前,一定要對(duì)其進(jìn)行初始化或使其有確定的地址數(shù)值。

(2)指針變量只能賦以一個(gè)指針的值,若給指針變量賦了一個(gè)變量的值而不是該變量的地址或者賦了一個(gè)常量的值,則系統(tǒng)會(huì)以這個(gè)值作為地址。根據(jù)這個(gè)“地址”讀寫的結(jié)果將是致命的。

(3)兩個(gè)指針變量進(jìn)行賦值,必須使這兩個(gè)指針變量類型相同。

(4)給指針變量賦值實(shí)際上是“間接”給指針?biāo)赶虻淖兞抠x值1.7指針和引用1.7.3指針和數(shù)組

數(shù)組中所有元素都是依次存儲(chǔ)在內(nèi)存單元中的,每個(gè)元素都有相應(yīng)的地址。數(shù)組名代表數(shù)組中第一個(gè)元素的地址,即數(shù)組的首地址。 指針變量和數(shù)組的數(shù)組名在本質(zhì)上是一樣,因此指向數(shù)組的指針變量實(shí)際上也可像數(shù)組變量那樣使用下標(biāo),而數(shù)組變量又可像指針變量那樣使用指針。例如:pi[i]與*(pi+i)及a[i]是等價(jià)的,*(a+i)與*(pi+i)是等價(jià)的。

#include<iostream.h>voidmain() { inta[]={2,4,6,8,10}; int*pa=a; intresult=0; for(inti=0;i<5;i++) { result+=*pa; pa++; }

cout<<“result=“<<result<<“\n”; }指針與字符數(shù)組 用字符指針可以指向字符串中的字符。如:

char*s1=“Hello,World!”;

在C++中,字符串常量是按字符數(shù)組處理的,實(shí)際上在內(nèi)存中開(kāi)辟了一個(gè)字符數(shù)組來(lái)存放字符串常量,并將字符串的首地址賦給字符指針變量s1,該語(yǔ)句等價(jià)為:

char*s1; S1=“Hello,World!”; //字符串常量是地址例Ex_PString1.7.4指針和結(jié)構(gòu)體

指針也可指向結(jié)構(gòu)體類型變量,一個(gè)結(jié)構(gòu)體變量保存的是結(jié)構(gòu)體的存儲(chǔ)空間的首地址。結(jié)構(gòu)體指針定義的一般形式為

struct 結(jié)構(gòu)體類型名*結(jié)構(gòu)體指針變量名例;structstudent { longintnum; charname[20]; charsex; }st;

Structstudent*p; p=&st;

訪問(wèn)結(jié)構(gòu)體成員的方法有三種:

1)結(jié)構(gòu)體變量名.成員名

2)(*結(jié)構(gòu)體指針).成員名

3)結(jié)構(gòu)體指針-〉成員名

若將結(jié)構(gòu)體變量看成一個(gè)整體,那么指向結(jié)構(gòu)體變量數(shù)組的指針操作和指向數(shù)組的指針操作是一樣的。例如若有:

PERSON many[10],*pp; pp=many; //等價(jià)于pp=&many[0];

則pp+i與many+i是等價(jià)的,(pp+i)->name與many[i].name是等價(jià)的,等等。1.7指針和引用1.7.5函數(shù)的指針傳遞

如果函數(shù)的某個(gè)參數(shù)是指針,對(duì)這函數(shù)的調(diào)用就是按地址傳遞的,由于函數(shù)形參指針和實(shí)參指針指向同一個(gè)地址,因此形參內(nèi)容的改變必將影響實(shí)參。(例Ex_SwapUsePointer)1.7.6引用 引用是給一個(gè)已定義的變量起一個(gè)別名,系統(tǒng)不為引用類型變量分配內(nèi)存空間,只是使引用類型變量與其相關(guān)聯(lián)的變量使用同一個(gè)內(nèi)存空間。

引用類型變量定義格式:

<類型>&<引用名>=<變量名>或<類型>&<引用名>(<變量名>)

其中,變量名必須是一個(gè)已定義過(guò)的變量。例如:

inta=3; int&ra=a;

這樣,ra就是一個(gè)引用,它是變量a的別名,所有對(duì)引用ra的操作,實(shí)質(zhì)上就是對(duì)a的操作。例如;ra=ra+2;

實(shí)質(zhì)上是a加2,a的結(jié)果為5;引用與指針的最大區(qū)別是: 指針是一個(gè)變量,可以把它再賦值成指向別處的地址,而引用一旦初始化后,其地址不會(huì)再改變。在使用引用時(shí),還要注意的是:

(1)

定義引用類型變量時(shí),必須將其初始化。而且引用變量類型必須與為它初始化的變量類型相同。例如:

inta=3;float&fval=a;//錯(cuò)誤

(2)

當(dāng)引用類型變量的初始化值是常數(shù)的,則必須將該引用定義成const類型。 例如:constint&ref=2(3)

不能引用一個(gè)數(shù)組,這是因?yàn)閿?shù)組是某個(gè)數(shù)據(jù)類型元素的集合,數(shù)組名表示該元素集合空間的起始地址,它自己不是一個(gè)真正的數(shù)據(jù)類型。例如:

inta[10]; int&ra=a; //錯(cuò)誤:不能建立數(shù)組的引用

(4)

可以引用一個(gè)結(jié)構(gòu)體。 引用本身不是一種數(shù)據(jù)類型,所以沒(méi)有引用的引用,也沒(méi)有引用的指針。1.7指針和引用1.7.7函數(shù)的引用傳遞

指針作為函數(shù)的參數(shù)時(shí),形參改變后相應(yīng)的實(shí)參也會(huì)改變。但如果以引用作為參數(shù),則既可以實(shí)現(xiàn)指針?biāo)鶐?lái)的功能,而且更加簡(jiǎn)便自然。 一個(gè)函數(shù)能使用引用傳遞的方式是在函數(shù)定義時(shí)將形參前加上引用運(yùn)算符“&”。

#include<iostream.h> voidswap(int&x,int&y); voidmain() { inta(7),b(11); swap(a,b); cout<<"a="<<a<<",b="<<b<<"\n";}voidswap(int&x,int&y) { inttemp; temp=x;x=y;y=temp; cout<<"x="<<x<<",y="<<y<<"\n"; }

結(jié)果是:

x=11,y=7 a=11,b=7 swap中的&x和&y就是形參的引用說(shuō)明。執(zhí)行swap(a,b);時(shí),實(shí)際上是將實(shí)參a、b的地址存放到系統(tǒng)為形參分配的內(nèi)存空間中,形參的任何操作都會(huì)改變相應(yīng)的實(shí)參的數(shù)值。 引用除了可作為函數(shù)的參數(shù)外,還可作為函數(shù)的返回值。1.8作用域和存儲(chǔ)類型

1.8.1作用域

塊作用域 塊就是塊語(yǔ)句。在塊中聲明的標(biāo)識(shí)符,其作用域從聲明處開(kāi)始,一直到結(jié)束塊的花括號(hào)為止。具有塊作用域的標(biāo)識(shí)符稱作局部標(biāo)識(shí)符,塊作用域也稱作局部作用域。 說(shuō)明:

(1)當(dāng)標(biāo)識(shí)符的作用域完全相同時(shí),不允許出現(xiàn)相同的標(biāo)識(shí)符名。而當(dāng)標(biāo)識(shí)符具有不同的作用域時(shí),允許標(biāo)識(shí)符同名。(2)VisualC++中,在for語(yǔ)句中聲明的標(biāo)識(shí)符,其作用域是包含for語(yǔ)句的那個(gè)內(nèi)層塊,而不是僅僅作用于for語(yǔ)句,這與標(biāo)準(zhǔn)C++不一樣。

函數(shù)原型作用域 在聲明函數(shù)原型所指定的參數(shù)標(biāo)識(shí)符的作用范圍。這個(gè)作用范圍是在函數(shù)原型聲明中的左、右括號(hào)之間。在函數(shù)原型中聲明的標(biāo)識(shí)符可以與函數(shù)定義中說(shuō)明的標(biāo)識(shí)符名稱不同。所聲明的標(biāo)識(shí)符與該函數(shù)的定義及調(diào)用無(wú)關(guān),可以在函數(shù)原型聲明中只作參數(shù)的類型聲明,而省略參數(shù)名。1.8作用域和存儲(chǔ)類型函數(shù)作用域

只有g(shù)oto語(yǔ)句中的標(biāo)號(hào)標(biāo)識(shí)符具有函數(shù)作用域。具有函數(shù)作用域的標(biāo)識(shí)符在聲明它的函數(shù)內(nèi)隨處可見(jiàn),但在此函數(shù)之外不可見(jiàn)。由于goto語(yǔ)句的濫用導(dǎo)致程序流程無(wú)規(guī)則、可讀性差。因此現(xiàn)代程序設(shè)計(jì)方法不主張使用goto語(yǔ)句。

voidf() { gotoA; intb; cin>>b;if(b>0) {A:; gotoB; }

B:cout<<“Alldone”<<endl;}if(b>0) {A:; gotoB; }

B:cout<<“Alldone”<<endl;}1.8作用域和存儲(chǔ)類型文件作用域

在函數(shù)或類之外定義的標(biāo)識(shí)符或用extern說(shuō)明的標(biāo)識(shí)符稱為全局標(biāo)識(shí)符。全局標(biāo)識(shí)符的作用域稱為文件作用域,它從聲明之處開(kāi)始,直到文件結(jié)束一直是可見(jiàn)的。如果一個(gè)標(biāo)識(shí)符出現(xiàn)在頭文件中,則該標(biāo)識(shí)符的作用域擴(kuò)展到包含了這個(gè)頭文件的程序。 在同一個(gè)作用域中,不能對(duì)同名的標(biāo)識(shí)符作多種不同的聲明。而當(dāng)塊作用域內(nèi)的標(biāo)識(shí)符與全局標(biāo)識(shí)符同名時(shí),局部標(biāo)識(shí)符優(yōu)先,且在塊作用域內(nèi)使用作用域運(yùn)算符“::”來(lái)引用與局部標(biāo)識(shí)符同名的全局標(biāo)識(shí)符。1.8.2變量的存儲(chǔ)類型

規(guī)定了變量的生存期。無(wú)論是全局變量還是局部變量,編譯系統(tǒng)往往根據(jù)其存儲(chǔ)方式定義、分配和釋放相應(yīng)的內(nèi)存空間。全局變量是指其作用域是文件作用域的變量,局部變量是指其作用域小于文件作用域的變量。自動(dòng)類型(auto)

一般用自動(dòng)存儲(chǔ)類型聲明的變量都是限制在某個(gè)程序范圍內(nèi)使用的。從系統(tǒng)角度來(lái)說(shuō),自動(dòng)存儲(chǔ)類型變量是采用堆棧方式分配內(nèi)存空間。當(dāng)程序執(zhí)行到超出該變量的作用域時(shí),就釋放它所占用的內(nèi)存空間,其值也隨之消失了。

聲明一個(gè)自動(dòng)存儲(chǔ)類型的變量是在變量類型前面加上關(guān)鍵字auto。若自動(dòng)存儲(chǔ)類型的變量是在函數(shù)內(nèi)或語(yǔ)句塊中聲明的,則可省略關(guān)鍵字auto。靜態(tài)類型(static)

靜態(tài)類型的變量也是一種局部變量。靜態(tài)類型變量在內(nèi)存中是以固定地址存放的,不是以堆棧方式存放的。只要程序在繼續(xù)執(zhí)行,它的值就有效,不會(huì)隨它所在的函數(shù)或語(yǔ)句塊的結(jié)束而消失。 聲明一個(gè)靜態(tài)類型的變量是在變量類型前面加上關(guān)鍵字static。需要說(shuō)明的是:

(1)靜態(tài)類型的變量均有確定的初值,當(dāng)聲明變量時(shí)沒(méi)有指定其初值,則編譯器將其初值置為0。

(2)程序中聲明的全局變量是靜態(tài)存儲(chǔ)類型,若在全局變量前加一個(gè)static,使該變量只在這個(gè)源程序文件內(nèi)使用,稱之為全局靜態(tài)變量或靜態(tài)全局變量。若一個(gè)程序由一個(gè)文件組成,在聲明全局變量時(shí),有無(wú)static并沒(méi)有區(qū)別,但若多個(gè)文件組成一個(gè)程序時(shí),加與不加static,其作用完全不同。靜態(tài)全局變量對(duì)組成該程序的其他源文件是無(wú)效的,它能很好地解決在程序多文件組織中全局變量的重名問(wèn)題。

(3)靜態(tài)函數(shù)是在某個(gè)函數(shù)聲明前加上static,它的目的是使該函數(shù)只在聲明的源文件中使用,對(duì)于其他源文件則無(wú)效。

(例Ex_Static)1.8作用域和存儲(chǔ)類型寄存器類型(register)

一般情況下,變量的值存放在內(nèi)存中,只有程序指令需要時(shí),才從內(nèi)存中讀取到CPU內(nèi)。C++允許將頻繁使用的變量存放在CPU內(nèi)部的寄存器中,從而加快程序的運(yùn)行速度。但有時(shí)在使用這種聲明時(shí),若系統(tǒng)寄存器已經(jīng)被其他數(shù)據(jù)占據(jù)時(shí),寄存器類型的變量就會(huì)被系統(tǒng)自動(dòng)默認(rèn)為auto變量。

注意:只有自動(dòng)變量和形參可以作為“寄存器變量”,而其他變量(全局變量,局部靜態(tài)變量)不可以。外部類型(extern)

使用extern聲明的變量稱為外部變量,一般指定義在本程序外部的變量。某個(gè)變量被聲明成外部變量時(shí),不必再次為它分配內(nèi)存就可以在本程序中引用這個(gè)變量。只有在兩種情況下要使用外部變量:在同一個(gè)源文件中,若定義的變量使用在前,聲明在后,這時(shí)在使用前要聲明為外部變量。當(dāng)由多個(gè)文件組成一個(gè)完整的程序時(shí),在一個(gè)源程序文件中完全定義的變量要被其他若干個(gè)源文件引用時(shí),引用的文件中要使用extern聲明外部變量。 外部變量對(duì)不同源文件中或函數(shù)之間的數(shù)據(jù)傳遞特別有用。這種能被許多函數(shù)共享的外部變量,其數(shù)據(jù)值的任何一次改變,都將影響到所有引用此變量的函數(shù)的執(zhí)行結(jié)果,其危險(xiǎn)性是顯而易見(jiàn)的。

1.9預(yù)處理

宏定義命令

用#define可以定義一個(gè)符號(hào)常量,如:#define PI3.141593 #define就是宏定義命令,它的作用是將3.141593用PI代替;PI稱為宏名。需要注意的是:

(1)

#define、PI和3.141593之間一定要有空格,且一般將宏名定義成大寫,以便與普通標(biāo)識(shí)符相區(qū)別。

(2)

宏被定義后,使用下列命令后可重新定義:#undef 宏名

(3)

一個(gè)定義過(guò)的宏名可以用來(lái)定義其它新的宏。

(4)

宏還可以帶參數(shù)。

#defineMAX(a,b)((a)>(b)?(a):(b))文件包含命令

所謂“文件包含”是指將另一個(gè)源文件的內(nèi)容合并到源程序中。C/C++語(yǔ)言提供了#include命令用來(lái)實(shí)現(xiàn)文件包含的操作,它有下列兩種格式:

#include<文件名> #include“文件名”

文件名一般是以.h為擴(kuò)展名,因而稱它為“頭文件”,如前面的程序中iostream.h是頭文件的文件名。文件包含的兩種格式中,第一種格式是將文件名用尖括號(hào)“<>”括起來(lái)的,用來(lái)包含那些由系統(tǒng)提供的并放在指定子目錄中的頭文件。第二種格式是將文件名用雙引號(hào)括起來(lái)的,用來(lái)包含那些由用戶定義的放在當(dāng)前目錄或其他目錄下的頭文件或其他源文件。1.9預(yù)處理?xiàng)l件編譯命令

有時(shí)希望根據(jù)一定的條件去編譯源文件的不同部分,就是“條件編譯”。條件編譯使得同一源程序在不同的編譯條件下得到不同的目標(biāo)代碼。有幾種常用的形式:

(1)

第一種形式

#ifdef<標(biāo)識(shí)符> <程序段1> [#else <程序段2>] #endif

<程序段>是由若干條預(yù)處理命令或語(yǔ)句組成的。含義是:如果標(biāo)識(shí)符已被#define命令定義過(guò),則編譯<程序段1>,否則編譯<程序段2>(2)

第二種形式

#ifndef<標(biāo)識(shí)符> <程序段1> [#else <程序段2>] #endif

與前一種形式的區(qū)別僅在于,如果標(biāo)識(shí)符沒(méi)有被#define命令定義過(guò),則編譯<程序段1>,否則就編譯<程序段2>。

2.1類和對(duì)象

2.1.1從結(jié)構(gòu)到類

2.1.2類的定義

一般地分為聲明部分和實(shí)現(xiàn)部分。聲明部分是用來(lái)聲明該類中的成員,含數(shù)據(jù)成員和成員函數(shù)的聲明。成員函數(shù)是用來(lái)對(duì)數(shù)據(jù)成員進(jìn)行操作的。實(shí)現(xiàn)部分是用來(lái)對(duì)成員函數(shù)的定義。聲明部分將告訴使用者“干什么”,而實(shí)現(xiàn)部分是告訴使用者“怎么干”。

定義類的一般格式如下:

class<類名> {private: [<私有數(shù)據(jù)和函數(shù)>] public: [<公有數(shù)據(jù)和函數(shù)>]};

<各個(gè)成員函數(shù)的實(shí)現(xiàn)>class的后面是用戶定義的類名,類中的數(shù)據(jù)和函數(shù)是類的成員,分別稱為數(shù)據(jù)成員和成員函數(shù)。由于數(shù)據(jù)成員是用變量來(lái)描述的,因此數(shù)據(jù)成員又可稱為“成員變量”。

public和private聲明了類中的成員和程序其他部分的關(guān)系。對(duì)于public類成員來(lái)說(shuō),它們是公有的,能被外面的程序訪問(wèn);對(duì)于private類成員來(lái)說(shuō),它們是私有的,只能由類中的函數(shù)所使用,而不能被外面的程序所訪問(wèn)。

<各個(gè)成員函數(shù)的實(shí)現(xiàn)>是類定義中的實(shí)現(xiàn)部分,包含所有在類體中聲明的函數(shù)的定義。如果一個(gè)成員函數(shù)在類體中定義,實(shí)現(xiàn)部分將不出現(xiàn)。如果所有的成員函數(shù)都在類體中定義,則實(shí)現(xiàn)部分可以省略。當(dāng)類的成員函數(shù)的函數(shù)體在類的外部定義時(shí),必須由作用域運(yùn)算符“::”來(lái)通知編譯系統(tǒng)該函數(shù)所屬的類。

2.1類和對(duì)象

定義類時(shí)還應(yīng)注意:(1)

在“public:”或“private:”后面定義的所有成員都是公有或私有的,直到下一個(gè)“public:”或“private:”出現(xiàn)為止。若成員前面沒(méi)有類似“public:”或“private:”,則所定義的成員是private(私有),這是類的默認(rèn)設(shè)置。(2)

關(guān)鍵字public和private可以在類中出現(xiàn)多次,且前后的順序沒(méi)有關(guān)系。但最好先聲明公有成員,后聲明私有成員,因?yàn)閜ublic成員是用戶最關(guān)心的。(3)

除了public和private外,關(guān)鍵字protected(保護(hù))也可修飾成員的類型,它與private兩者基本相似,但在類的繼承時(shí)有所不同。(4)

數(shù)據(jù)成員的類型可以是任意的,包含整型、浮點(diǎn)型、字符型、數(shù)組、指針等,也可以是另一個(gè)類的對(duì)象,但不允許對(duì)所定義的成員變量進(jìn)行初始化。

(5)盡量將類單獨(dú)存放在一個(gè)文件中或?qū)㈩惖穆暶鞣旁?h文件中而將成員函數(shù)的實(shí)現(xiàn)放在與.h文件同名的.cpp文件中。以后將會(huì)看到,VisualC++6.0為用戶創(chuàng)建的應(yīng)用程序框架中都是將各個(gè)類以.h和同名的.cpp文件來(lái)組織的。

2.1類和對(duì)象2.1.3對(duì)象的定義

一個(gè)類定義后,就可以定義該類的對(duì)象,格式: <類名><對(duì)象名列表>

類名是用戶已定義過(guò)的類的標(biāo)識(shí)符,對(duì)象名可以有一個(gè)或多個(gè),多個(gè)時(shí)要用逗號(hào)分隔。被定義的對(duì)象既可以是一個(gè)普通對(duì)象,也可以是一個(gè)數(shù)組對(duì)象或指針對(duì)象。一個(gè)對(duì)象的成員就是該對(duì)象的類所定義的成員,引用(訪問(wèn))時(shí)可用下列方式:

<對(duì)象名>.<成員名> <對(duì)象名>.<成員名>(<參數(shù)表>)。前者用來(lái)表示引用數(shù)據(jù)成員,后者用來(lái)表示引用成員函數(shù)?!?”是一個(gè)成員運(yùn)算符,用來(lái)引用對(duì)象的成員對(duì)于指針對(duì)象的成員引用可用下列方式:

<對(duì)象指針名>-><成員名> <對(duì)象指針名>-><成員名>(<參數(shù)表>)“->”與“.”運(yùn)算符的區(qū)別是:“->”用來(lái)訪問(wèn)指針對(duì)象的成員,“.”用來(lái)訪問(wèn)一般對(duì)象的成員。需要說(shuō)明的是,下面的兩種表示是等價(jià)的:

<對(duì)象指針名>-><成員名> (*<對(duì)象指針名>).<成員名>

這對(duì)于成員函數(shù)也適用,例如two->GetAverage()和(*two).GetAverage()是等價(jià)的,由于成員運(yùn)算符“.”的優(yōu)先級(jí)比取內(nèi)容運(yùn)算符“*”高。若結(jié)構(gòu)成員前面沒(méi)有“public:”或“private:”,則所定義的成員是public(公有)。

2.2類的成員及特性

2.2.1構(gòu)造函數(shù)

使用構(gòu)造函數(shù)能給數(shù)據(jù)成員自動(dòng)設(shè)置某些初始值。它的最大特點(diǎn)是在對(duì)象建立時(shí)它會(huì)被自動(dòng)執(zhí)行,因此用于變量、對(duì)象的初始化代碼一般放在構(gòu)造函數(shù)中。構(gòu)造函數(shù)必須與相應(yīng)的類同名,可以帶參數(shù),可以不帶參數(shù),而且可以重載。但不能指定函數(shù)返回值的類型,也不能指定為void類型。例如:classCStuScore { public: CStuScore(charstr[12]) //第一個(gè)構(gòu)造函數(shù)

{ strcpy(strName,str); } CStuScore(charstr[12],charstrNO[9]) //第二個(gè)構(gòu)造函數(shù)

{ strcpy(strName,str); strcpy(strStuNO,strNO);} char strName[12]; //姓名

char strStuNO[9]; //學(xué)號(hào)

...}

(1)

程序中的strcpy是一個(gè)庫(kù)函數(shù),用來(lái)復(fù)制字符串,使用時(shí)要頭文件string.h。

(2)

類定義時(shí),如沒(méi)有定義任何構(gòu)造函數(shù),編譯器自動(dòng)為類生成一個(gè)不帶任何參數(shù)的默認(rèn)構(gòu)造函數(shù)。

(3)

由于構(gòu)造函數(shù)的參數(shù)只能在定義對(duì)象時(shí)指定。

2.2類的成員及特性2.2.2析構(gòu)函數(shù)

與構(gòu)造函數(shù)相對(duì)應(yīng)的另一種特殊的C++成員函數(shù)是析構(gòu)函數(shù),它的功能是用來(lái)釋放一個(gè)對(duì)象,在對(duì)象刪除前,用它來(lái)做一些清理工作,它與構(gòu)造函數(shù)的功能正好相反。 析構(gòu)函數(shù)也要與相應(yīng)的類同名,并在名稱前面加上一個(gè)“~”符號(hào)。每一個(gè)類只有唯一的一個(gè)析構(gòu)函數(shù),沒(méi)有任何參數(shù),也不返回任何值,也不能被重載。例如:

classCStuScore { public: ... ~CStuScore() { } //析構(gòu)函數(shù)

...}

同樣,如果一個(gè)類中沒(méi)有定義析構(gòu)函數(shù)時(shí),則編譯系統(tǒng)也會(huì)為類自動(dòng)生成一個(gè)默認(rèn)析構(gòu)函數(shù),其格式如下(以類CStuScore為例):

~CStuScore() //默認(rèn)析構(gòu)函數(shù)的形式

{}需要說(shuō)明的是,析構(gòu)函數(shù)只有在下列兩種情況下才會(huì)被自動(dòng)調(diào)用:

(1)

當(dāng)對(duì)象定義在一個(gè)函數(shù)體中,該函數(shù)調(diào)用結(jié)束后,析構(gòu)函數(shù)被自動(dòng)調(diào)用。

(2)

用new為對(duì)象分配動(dòng)態(tài)內(nèi)存后,當(dāng)使用delete釋放對(duì)象時(shí),析構(gòu)函數(shù)被自動(dòng)調(diào)用。

2.2類的成員及特性2.2.3對(duì)象成員初始化 構(gòu)造函數(shù)定義格式:

<類名>::<構(gòu)造函數(shù)名>(形參表):對(duì)象1(參數(shù)表),對(duì)象2(參數(shù)表),…,對(duì)象n(參數(shù)表) {…… }

對(duì)象1、對(duì)象2、…、對(duì)象n就是該類使用的其他類的對(duì)象,冒號(hào)“:”后面的列表稱為成員初始化列表。說(shuō)明:(1)

類的對(duì)象成員必須初始化,但不能將對(duì)象成員直接在構(gòu)造函數(shù)體內(nèi)進(jìn)行初始化,例如下面的初始化是不可以的:

CRect(intleft,inttop,intright,intbottom) { ptCenter=CPoint((left+right)/2,(top+bottom)/2); size=CSize(right-left,bottom-top);}(2)

對(duì)象成員初始化時(shí),必須有相應(yīng)的構(gòu)造函數(shù),且多個(gè)對(duì)象成員的構(gòu)造次序不是按初始化成員列表的順序,而是按各類聲明的先后次序進(jìn)行的,從上例的運(yùn)行結(jié)果可以得到證明。(3)

對(duì)象成員初始化也可在類構(gòu)造函數(shù)定義時(shí)進(jìn)行。(4)事實(shí)上,成員初始化列表也可用于類中的普通數(shù)據(jù)成員的初始化。

2.2類的成員及特性2.2.4常類型

常對(duì)象 常對(duì)象是指對(duì)象常量,定義格式:<類名>const<對(duì)象名>

定義常對(duì)象時(shí)要進(jìn)行初始化,并且該對(duì)象不能再被更新,修飾符const可以放在類名后面,也可以放在類名前面。

常成員函數(shù)

使用const關(guān)鍵字進(jìn)行聲明的成員函數(shù)。只有常成員函數(shù)才有資格操作常量或常對(duì)象。說(shuō)明格式: <類型說(shuō)明符><函數(shù)名>(<參數(shù)表>)const;

const是加在函數(shù)聲明后面的類型修飾符,它是函數(shù)類型的一個(gè)組成部分,因此在函數(shù)實(shí)現(xiàn)部分也要帶const關(guān)鍵字。常成員函數(shù)還可以理解為一個(gè)“只讀”函數(shù),它不能更改數(shù)據(jù)成員的值,也不能調(diào)用那些引起數(shù)據(jù)成員值變化的成員函數(shù),只能調(diào)用const成員函數(shù)。

常數(shù)據(jù)成員 類型修飾符const不僅可以說(shuō)明成員函數(shù),也可以說(shuō)明數(shù)據(jù)成員。由于const類型對(duì)象必須被初始化,并且不能更新,因此,在類中聲明const數(shù)據(jù)成員后,只能通過(guò)構(gòu)造函數(shù)成員初始化方式來(lái)對(duì)常數(shù)據(jù)成員初始化。

2.2類的成員及特性2.2.5this指針

類中總有一個(gè)特殊的指針this,它指向類自己。該指針可以在類中訪問(wèn)類的成員變量和成員函數(shù)。但在實(shí)際運(yùn)用中,一般不需要顯式地使用this指針來(lái)引用成員。

[例Ex_This]this指針的使用。

#include<iostream.h> classCOne { public: COne() {x=y=0;} COne(inta,intb) {x=a; y=b;} //對(duì)象引用作函數(shù)參數(shù)

voidcopy(COne&a); voidprint() {cout<<x<<","<<y<<endl;} private: intx,y;}; voidCOne::copy(COne&a) { if(this==&a)return; *this=a;}

voidmain() { COneone,two(3,4); one.print(); one.copy(two); one.print();}

運(yùn)行結(jié)果:

0,0 3,4

函數(shù)copy代碼中,*this=a;是將形參a獲

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論