C++ Primer Plus(第6版)第二章 開始學(xué)習(xí) C++

2.1 進(jìn)入 C++

一個(gè)簡(jiǎn)單的入門程序如下:

// mytirst.cpp -- displays a message

#include <iostream>
int main() 
{
    using namespace std;
    cout << "Come up and C++ me some time.";
    cout << endl;
    cout << "You won't regret it!" << endl;
    return 0;
}
2.1.1 // mytirst.cpp -- displays a message

C++注釋以雙斜杠(11)打頭。注釋是程序員為讀者提供的說明狸捅,通常標(biāo)識(shí)程序的一部分或解釋代碼的某個(gè)方面匀借。編譯器忽略注釋,畢竟,它對(duì) C++ 的了解至少和程序員一樣,在任何情況下,它都不能理解注釋兴溜。對(duì)編譯器而言,程序就像沒有注釋一樣耻陕。C++注釋以 // 打頭拙徽,到行尾結(jié)束。注釋可以位于單獨(dú)的一行上诗宣,也可以和代碼位于同一行膘怕。在編寫程序的過程中,應(yīng)多使用注釋來說明程序召庞。程序越復(fù)雜岛心,注釋的價(jià)值越大来破。注釋不僅有助于他人理解這些代碼,也有助于程序員自己理解代碼忘古,特別是隔了一段時(shí)間沒有接觸該程序的情況下徘禁。

2.1.2 #include <iostream>

分為兩個(gè)部分來解釋:#include 是一個(gè)預(yù)處理指令。C++ 和 C 一樣髓堪,也使用一個(gè)預(yù)處理器送朱,該程序在進(jìn)行主編譯之前對(duì)源文件進(jìn)行處理(第1章介紹過,有些C++實(shí)現(xiàn)使用翻譯器程序?qū)++程序轉(zhuǎn)換為 C 程序干旁。雖然翻譯器也是一種預(yù)處理器驶沼,但這里不討論這種預(yù)處理器,而只討論這樣的預(yù)處理器争群,即它處理名稱以#開頭的編譯指令)回怜。不必執(zhí)行任何特殊的操作來調(diào)用該預(yù)處理器,它會(huì)在編譯程序時(shí)自動(dòng)運(yùn)行换薄。該編譯指令導(dǎo)致預(yù)處理器將 iostream 文件的內(nèi)容添加到程序中玉雾。這是一種典型的預(yù)處理器操作:在源代碼被編譯之前,替換或添加文本轻要。<iostream> 這樣的文件叫做包含文件 (include file)由于它們被包含在其他文件中抹凳;也叫頭文件 (header file) 由于它們被包含在文件起始處。C++ 編譯器自帶了很多頭文件伦腐,每個(gè)頭文件都支持一組特定的工具。C 語言的傳統(tǒng)是失都,頭文件使用擴(kuò)展名 .h柏蘑,將其作為一種通過名稱標(biāo)識(shí)文件類型的簡(jiǎn)單方式。例如粹庞,頭文件 math.h 支持各種 C 語言數(shù)學(xué)函數(shù)咳焚,C++ 的用法變了。現(xiàn)在庞溜,對(duì)老式 C 的頭文件保留了擴(kuò)展名 .h (C++ 程序仍可以使用這種文件)革半,而 C++ 頭文件則沒有擴(kuò)展名。有些 C 頭文件被轉(zhuǎn)換為 C++ 頭文件流码,這些文件被重新命名又官,去掉了擴(kuò)展名 h(使之成為 C++ 風(fēng)格的名稱),并在文件名稱前面加上前綴 c(表明來自 C 語言)漫试。例如六敬,C++ 版本的 math.h 為 cmath。有時(shí) C 頭文件的 C 版本和 C++ 版本相同驾荣,而有時(shí)候新版本做了一些修改外构。對(duì)于純粹的 C 十頭文件(如 iostream)來說普泡,去掉 .h 不只是形式上的變化,沒有 .h 的頭文件也可以包含名稱空間审编。本章的下一個(gè)主題撼班,表2.1對(duì)頭文件的命名約定進(jìn)行了總結(jié)。

頭文件命名約定

由于 C 使用不同的文件擴(kuò)展名來表示不同文件類型垒酬,因此用一些特殊的擴(kuò)展名(如.hpp或.hxx) 表示 C++ 頭文件是有道理的砰嘁,ANSIISO 委員會(huì)也這樣認(rèn)為。問題在于究竟使用哪種擴(kuò)展名伤溉,因此最終他們一致同意不使用任何擴(kuò)展名般码。

2.1.3 int main()

C++ 要求 main 函數(shù)的定義以函數(shù)頭 int main() 開始。后面將詳細(xì)討論函數(shù)頭語法乱顾,這里先簡(jiǎn)單預(yù)習(xí)一下板祝。int,C++ 函數(shù)可以給調(diào)用函數(shù)返回一個(gè)值走净,這個(gè)值叫做返回值 (return value)券时。在這里,從關(guān)鍵字 int 可知伏伯,main 函數(shù)返回一個(gè)整數(shù)值橘洞。main,代表該函數(shù)的名字叫 main说搅,這里之所以將程序中的函數(shù)命名為 main炸枣,原因是必須這樣做。通常弄唧,C++ 程序必須包含名為 main 的函數(shù)(不是Main适肠、MAIN 或 mian)。記住候引,大小寫和拼寫都要正確)侯养。由于該程序只有一個(gè)函數(shù),因此該函數(shù)必須擔(dān)負(fù)起 main 的責(zé)任澄干。在運(yùn)行 C++ 程序時(shí)逛揩,通常從 main 函數(shù)開始執(zhí)行。因此麸俘,如果沒有 main 函數(shù)辩稽,程序?qū)⒉煌暾幾g器將會(huì)報(bào)錯(cuò)指出未定義 main 函數(shù)从媚。存在一些例外情況搂誉。例如,在 Windows 編程中,可以編寫一個(gè)動(dòng)態(tài)鏈接庫 (DLL) 模塊炭懊,這是其他 Windows 程序可以使用的代碼并级。由于 DLL模塊不是獨(dú)立的程序,因此不需要 main 函數(shù)侮腹。()嘲碧, C++ 函數(shù)在調(diào)用另一個(gè)函數(shù)時(shí),可以將信息傳遞給該函數(shù)父阻∮空括號(hào)意味著 main 函數(shù)不接受任何信息,或者 main 不接受任何參數(shù)加矛。簡(jiǎn)而言之履婉,該函數(shù)名稱是 main 函數(shù)可以給調(diào)用它的函數(shù)返回一個(gè)整數(shù)值,且不從調(diào)用它的函數(shù)那里獲得任何信息斟览。

2.1.4 using namespace std;

這叫做 using 編譯指令毁腿。最簡(jiǎn)單的辦法是,現(xiàn)在接受這個(gè)編譯指令苛茂,以后再考慮它 (例如已烤,到第9章再考慮它)。但這里還是簡(jiǎn)要地介紹它妓羊,以免您一頭霧水胯究。名稱空間支持是一項(xiàng) C++ 特性,旨在讓您編寫大型程序以及將多個(gè)廠商現(xiàn)有的代碼組合起來的程序時(shí)更容易躁绸,它還有助于組織程序裕循。一個(gè)潛在的問題是,可能使用兩個(gè)己封裝好的產(chǎn)品净刮,而它們都包含一個(gè)名為 wanda 的函數(shù)剥哑。這樣,使用 wanda() 函數(shù)時(shí)庭瑰,編譯器將不知道指的是哪個(gè)版本。名稱空間讓廠商能夠?qū)⑵洚a(chǎn)品封裝在一個(gè)叫做名稱空間的單元中弹灭,這樣就可以用名稱空間的名稱來指出想使用哪個(gè)廠 商的產(chǎn)品揪垄,因此,Microflop Industries 可以將其定義放到一個(gè)名為 Microflop 的名稱空間中饥努。這樣捡鱼,其 wanda() 函數(shù)的全稱為 Microflop: wanda() 同樣,Piscine 公司的 wanda() 版本可以表示為 Piscine: wanda()驾诈。這樣,程序就可以使用名稱空間來區(qū)分不同的版本了:

Microflop::wanda("go dancing? ");         // use Microflop namespace version
Piscine::wanda("a fish named Desire");    // use Piscine namespace version

按照這種方式乍迄,類管引、函數(shù)和變量便是 C++編譯器的標(biāo)準(zhǔn)組件,它們現(xiàn)在都被放置在名稱空間 std 中闯两,僅當(dāng)頭文件沒有擴(kuò)展名 .h 時(shí),情況才是如此漾狼。這意味著在 iostream 中定義的用于輸出的 cout 變量實(shí)際上是 std::cout,而 endl 實(shí)際上是 std::endl似踱。因此志衣,可以省略編譯指令 using,以下述方式進(jìn)行編碼:

std::cout << "Come up and C++ me some time.";
std::cout << endl;

然而念脯,多數(shù)用戶并不喜歡將引入名稱空間之前的代碼(使用 iostream.h 和 cout)轉(zhuǎn)換為名稱空間代碼(使用 iostream 和 std::cout),除非他們可以不費(fèi)力地完成這種轉(zhuǎn)換吉懊。于是假勿,using 編譯指令應(yīng)運(yùn)而生。下面的一行代碼表明转培,可以使用std 名稱空間中定義的名稱,而不必使用 std:: 前綴:

using namespace std;

這個(gè)using編譯指令使得 std 名稱空間中的所有名稱都可用惨寿。這是一種偷懶的做法删窒,在大型項(xiàng)目中一個(gè)潛在的問題。更好的方法是肌索,只使所需的名稱可用,這可以通過使用 using 聲明來實(shí)現(xiàn):

using std::cout;   // make cout available
using std::endl;   // make endl available
using std::cin;    //make cin available

用這些編譯指令替換下述代碼后晕换,便可以使用 cin 和cout午乓,而不必加上std::前綴:

using namespace std;   // lazy approach, all names available

然而,要使用 iostream 中的其他名稱届巩,必須將它們分別加到 using 列表中硅瞧。本書首先采用這種偷懶的方法,其原因有兩個(gè)恕汇。首先腕唧,對(duì)于簡(jiǎn)單程序而言瘾英,采用何種名稱空間管理方法無關(guān)緊要;其次但惶,本書的重點(diǎn)是介紹C++的基本方面湿蛔。本書后面將采用其他名稱空間管理技術(shù)。

2.1.5 cout << "Come up and C++ me some time.";

它將字符串 “Come up and Ct+ me some time.” 插入到輸出流中添谊。雙引號(hào)括起的部分是要打印的消息察迟。在 C++ 中,用雙引號(hào)括起的一系列字符叫做字符串所踊,因?yàn)樗怯扇舾勺址M合而成的概荷。<< 符號(hào)功能該語句將把這個(gè)字符串發(fā)送給 cout;該符號(hào)指出了信息流動(dòng)的路徑继薛。cout 是什么呢雷厂?它是一個(gè)預(yù)定義的對(duì)象叠殷,知道如何顯示字符串、數(shù)字和單個(gè)字符等∠窦現(xiàn)在我們還不理解什么是對(duì)象,后面章節(jié)會(huì)詳細(xì)講到缕题。學(xué)到后面我們會(huì)知道 << 其實(shí)是一個(gè)運(yùn)算符重載烟零,最終會(huì)調(diào)用對(duì)象的一個(gè)重載函數(shù),現(xiàn)在理解起來比較困難锨阿,后面也會(huì)詳細(xì)講到運(yùn)算符重載墅诡。

2.1.6 cout << endl;

endl 是一個(gè)特殊的C++符號(hào),表示一 個(gè)重要的概念:重起一行末早。在輸出流中插入 endl 將導(dǎo)致屏幕光標(biāo)移到下一行開頭然磷。諸如 endl 等對(duì)于 cout 來說有特殊含義的特殊符號(hào)被稱為控制符 (manipulator)。和 cout一樣样屠,endl 也是在頭文件 iostream 中定義的,且位于名稱空間 std 中悦穿。打印字符串時(shí),cout 不會(huì)自動(dòng)移到下一行箩绍,因此在開頭程序中,第一條 cout 語句將光標(biāo)留在輸出字符串的后面。每條 cout 語句的輸出從前一個(gè)輸出的末尾開始逛钻,因此如果省略最開頭程序中的 endl锰提,得到的輸出將如下:

Come up and C++ me some time. You won' t regret it !

從上述輸出可知芳悲,Y 緊跟在句點(diǎn)后面边坤。下面來看另一個(gè)例子,假設(shè)有如下代碼:

cout << "The Good, the"
cout << "Bad,"
cout << "and the Ukulele"

其輸出將如下:

The Good, theBad,and the Ukulele

2.2 C++ 語句

C++程序是一組函數(shù)肮韧,而每個(gè)函數(shù)又是一組語句旺订。C++ 有好幾種語句,下面介紹其中的一些桩蓉。程序清單 2.2 提供了兩種新的語句劳闹。聲明語句創(chuàng)建變量,賦值語句給該變量提供一個(gè)值业汰。

// 程序清單 2.2 carrot.cpp
// carrots. cpp -- food processing program
// uses and displays a variable

#include <iostream>
int main(){
    using namespace std;

    int carrots;

    carrots = 25;
    cout << "I have ";
    cout << carrots;
    cout << " carrots.";
    cout << endl;
    carrots = carrots - 1;
    cout << "Crunch, crunch. Now I have " << carrots << " carrtos." << endl;
    return 0;
}

下面是該程序的輸出:

I have 25 carrots
Crunch, crunch. Now I have 24 carrots

我們來探討一下這個(gè)程序菩颖。

2.2.1 int carrots;

計(jì)算機(jī)是一種精確的晦闰、有條理的機(jī)器。要將信息項(xiàng)存儲(chǔ)在計(jì)算機(jī)中呻右,必須指出信息的存儲(chǔ)位置和所需的內(nèi)存空間声滥。在 C++ 中,完成這種任務(wù)的一種相對(duì)簡(jiǎn)便的方法落塑,是使用聲明語句來指出存儲(chǔ)類型并提供位置標(biāo)簽憾赁。這條語句提供了兩項(xiàng)信息:需要的內(nèi)存以及該內(nèi)存單元的名稱。具體地說龙考,這條語句指出程序需要足夠的存儲(chǔ)空間來存儲(chǔ)一個(gè)整數(shù),在 C++ 中用 int 表示整數(shù)颓芭。編譯器負(fù)責(zé)分配和標(biāo)記內(nèi)存的細(xì)節(jié)柬赐。C++ 可以處理多種類型的數(shù)據(jù)肛宋,而 int 是最基本的數(shù)據(jù)類型。它表示整數(shù)沒有小數(shù)部分的數(shù)字酝陈。C++ 的 int 類型可以為正沉帮,也可以為負(fù),但是大小范圍取決于實(shí)現(xiàn)穆壕。第 3 章將詳細(xì)介紹 int 和其他基本類型喇勋。完成的第二項(xiàng)任務(wù)是給存儲(chǔ)單元指定名稱。在這里川背,該聲明語句指出熄云,此后程序?qū)⑹褂妹Q carrots 來標(biāo)識(shí)存儲(chǔ)在該內(nèi)存單元中的值。carrots 被稱為變量缴允,因?yàn)樗闹悼梢孕薷陌┐弧T?C++ 中,所有變量都必須聲明踢俄。如果省略了carrots.cpp 中的聲明都办,則當(dāng)程序試圖使用 carrots 時(shí)虑稼,編譯器將指出錯(cuò)誤势木。

2.2.2 carrots = 25;

這是賦值語句將值賦給存儲(chǔ)單元。這條語句將整數(shù) 25 賦給變量 carrots 表示的內(nèi)存單元溯壶,符號(hào) = 叫做賦值運(yùn)算符甫男。

2.2.3 carrots = carrots - 1;

這條賦值語句表明,可以對(duì)變量的值進(jìn)行修改又跛。賦值運(yùn)算符右邊的表達(dá)式 carrots -1 是一個(gè)算術(shù)表達(dá)式若治。計(jì)算機(jī)將變量 carrots 的值 25 減去1,得到 24菌仁。然后静暂,賦值運(yùn)算符將這個(gè)新值存儲(chǔ)到變量 carrots 對(duì)應(yīng)的內(nèi)存單元中。

2.3 其他 C++ 語句

再來看一個(gè) C+語句的例子摹迷。程序清單 2.3 中的程序?qū)η耙粋€(gè)程序進(jìn)行了擴(kuò)展郊供,要求在程序運(yùn)行時(shí)輸入一個(gè)值。為實(shí)現(xiàn)這項(xiàng)任務(wù)鲫寄,它使用了 cin 這是與 cout 進(jìn)行對(duì)應(yīng)的用于輸入的對(duì)象疯淫。

// 程序清單 2.3 getinfo.cpp
// getinfo.cpp -- input and output

#include <iostream>
int main() {
    using namespace std;
    int carrots;
    cout << "How many carrots do you have?" << endl;
    cin >> carrots;
    cout << "Here are two more.";
    carrots = carrots + 2;
    cout << "Now you have " << carrots << " carrots." << endl;
    return 0;
}

下面是該程序的運(yùn)行情況:

How many carrots do you have:
12
Here are two more. Now you have 14 carrots
2.3.1 cin >> carrots;

上面的輸出表明熙掺,從鍵盤輸入的值(12)最終被賦給變量 carrots。從這條語句可知蜡秽,信息從 cin 流向 carrots。顯然试浙,對(duì)這一過程有更為正式的描述寞蚌。就像 C++ 將輸出看作是流出程序的字符流一樣,它也將輸入看作是流入程序的字符流睬澡。iostream 文件將 cin 定義為一個(gè)表示這種流的對(duì)象煞聪。輸出時(shí)逝慧,<< 運(yùn)算符將字符串插入到輸出流中;輸入時(shí)云稚,cin 使用 >> 運(yùn)算符從輸入流中抽取字符沈堡。通常,需要在運(yùn)算符右側(cè)提供一個(gè)變量鲸拥,以接收抽取的信息(符號(hào) << 和 >> 被選擇用來指示信息流的方向)僧免,與 cout 一樣,cin 也是一個(gè)智能對(duì)象撞叨。它可以將通過鍵盤輸入的一系列字符(即輸入)轉(zhuǎn)換為接收信息的變量能夠接受的形式浊洞。在這個(gè)例子中,程序?qū)?carrots 聲明為一個(gè)整型變量劣领,因此輸入被轉(zhuǎn)換為計(jì)算機(jī)用來存儲(chǔ)整數(shù)的數(shù)字形式铁材。

2.4 函數(shù)

由于兩數(shù)用于創(chuàng)建 C++ 程序的模塊,對(duì) C++ 的 OOP 定義至關(guān)重要村生,因此必須熟悉它。函數(shù)的某些方面屬于高級(jí)主題辽话,將在第 7 章和第 8 章重點(diǎn)討論函數(shù)∥啦。現(xiàn)在我們可以先了解函數(shù)的一些基本特征,將使得在以后的函數(shù)學(xué)習(xí)中更加得心應(yīng)手益咬。本章剩余的內(nèi)容將介紹函數(shù)的一些基本知識(shí)帜平。C++ 函數(shù)分兩種:有返回值的和沒有返回值的裆甩。在標(biāo)準(zhǔn) C++ 函數(shù)庫中可以找到這兩類函數(shù)的例子,您也可以自己創(chuàng)建這兩種類型的函數(shù)嗤栓。下面首先來看一個(gè)有返回值的庫函數(shù)茉帅,然后介紹如何編寫簡(jiǎn)單的函數(shù)。

2.4.1 使用有返回值的庫函數(shù)

有返回值的函數(shù)將生成一個(gè)值摔敛,而這個(gè)值可賦給變量或在其他表達(dá)式中使用全封。例如,標(biāo)準(zhǔn) C/C++ 庫包含一個(gè)名為 sqrt() 的函數(shù)行楞,它返回平方根土匀。假設(shè)要計(jì)算 6.25 的平方根,并將這個(gè)值賦給變量 x证杭,則可以在程序中使用下面的語句:

X = sqrt (6.25); // returns the value 2.5 and assigns it to x

表達(dá)式 sqrt(6.25) 將調(diào)用 sqrt() 函數(shù)。表達(dá)式 sqrt(6.25) 被稱為兩數(shù)調(diào)用镇饺,被調(diào)用的函數(shù)叫做被調(diào)用函數(shù)(called function)送讲,包含函數(shù)調(diào)用的函數(shù)叫做調(diào)用函數(shù)(calling function,參見圖 2.6)监右。圓括號(hào)中的值(這里為6.25)是發(fā)送給函數(shù)的信息异希,這被稱為傳遞給函數(shù)宠互。以這種方式發(fā)送給函數(shù)的值叫做參數(shù)椭坚。(參見圖 2.7。)函數(shù) sqrt() 得到的結(jié)果為 2.5券册,并將這個(gè)值發(fā)送給調(diào)用函數(shù)垂涯,發(fā)送回去的值叫做函數(shù)的返回值(return value)〗居可以這么認(rèn)為操骡,函數(shù)執(zhí)行完畢后,語句中的函數(shù)調(diào)用部分將被替換為返回的值岔激。因此是掰,這個(gè)例子將返回值賦給變量 x。簡(jiǎn)而言之炫彩,參數(shù)是發(fā)送給函數(shù)的信息媒楼,返回值是函數(shù)中發(fā)送回去的值。


圖 2.6 調(diào)用函數(shù)

圖 2.7 函數(shù)調(diào)用的語法
// 程序清單 2.4 sqrt.cpp
// sqrt. cpp -- using the sqrt () function

#include <iostream>
#include <cmath>
int main() {
    using namespace std;
    double area;
    cout << "Enter the floor area, in square feet, of your home: ";
    cin >> area;
    double side;
    side = sqrt(area);
    cout << "That's the equivalent of a square " << side << " feet to the side." << endl;
    cout << "How fascinating!" << endl;
    return 0;
}

下面是該程序的運(yùn)行情況:

Enter the floor area, in square feet, of your home: 123
That's the equivalent of a square 11.0905 feet to the side.
How fascinating!
2.4.2 函數(shù)變體

有些函數(shù)需要多項(xiàng)信息。這些函數(shù)需要傳遞多個(gè)參數(shù)夺颤,參數(shù)間用逗號(hào)分開。例如独旷,數(shù)學(xué)函數(shù) pow() 接受兩個(gè)參數(shù)寥裂,返回值為以第一個(gè)參數(shù)為底封恰,第二個(gè)參數(shù)為指數(shù)的冪。該兩數(shù)的原型如下:

double pow (double, double);    // prototype of a function with two arguments

要計(jì)算 5 的 8 次方诺舔,可以這樣使用該函數(shù):

answer = pow (5.0, 8.0) ;      //  function call with a list of arguments

另外一些兩數(shù)不接受任何參數(shù)低飒。例如,有一個(gè)C庫(與cstdlib 或 stdlib.h 頭文件相關(guān)的庫)包含一個(gè) rand() 函數(shù)糕档,該函數(shù)不接受任何參數(shù)拌喉,并返回一個(gè)隨機(jī)整數(shù)。該函數(shù)的原型如下:

int rand (void) ;   // prototype of a function that takes no arguments

關(guān)鍵宇 void 明確指出琅坡,該函數(shù)不接受任何參數(shù)残家。如果省略 void,讓括號(hào)為空茴晋,則 C++ 將其解釋為一個(gè)不接受任何參數(shù)的隱式聲明∈行洌可以這樣使用該函數(shù):

myGuess = rand();     // function call with no arguments

注意烁涌,與其他一些計(jì)算機(jī)語言不同撮执,在 C++ 中,兩數(shù)調(diào)用中必須包括括號(hào)蜓肆,即使沒有參數(shù)谋币,還有一些函數(shù)沒有返回值。例如早芭,假設(shè)編寫了一個(gè)函數(shù)凡简,它按美元精肃、美分格式顯示數(shù)宇司抱。當(dāng)向它傳遞參數(shù) 23.5 時(shí),它將在屏幕上顯示 $23.50匀谣。由于這個(gè)函數(shù)把值發(fā)送給屏幕资溃,而不是調(diào)用程序,因此不需要返
回值宝恶。可以在原型中使用關(guān)鍵字 void 來指定返回類型霹疫,以指出兩數(shù)沒有返回值:

void bucks (double) ;   // prototype for function with no return value

由于它不返回值综芥,因此不能將該兩數(shù)調(diào)用放在賦值語句或其他表達(dá)式中。相反屠阻,應(yīng)使用一條純粹的函數(shù)調(diào)用語句:

bucks (1234.56) :      //  function call. no return value

在有些語言中额各,有返回值的兩數(shù)被稱為兩數(shù)(function):沒有返回值的函數(shù)被稱為過程 (procedure) 或子程序 (subroutine)臊泰。但 C++ 與 C 一樣,這兩種變體都被稱為函數(shù)针饥。

2.4.3 用戶定義的函數(shù)

標(biāo)準(zhǔn) C 庫提供了 140 多個(gè)預(yù)定義的函數(shù)需频。如果其中的西數(shù)能滿足要求,則應(yīng)使用它們苞七。但用戶經(jīng)常需要編寫自己的函數(shù)挪丢,尤其是在設(shè)計(jì)類的時(shí)候乾蓬。無論如何,設(shè)計(jì)自己的函數(shù)很有意思任内,下面來介紹這一過程死嗦。前面已經(jīng)使用過好幾個(gè)用戶定義的兩數(shù),它們都叫 main() 每個(gè) C++程序都必須有一個(gè) main()函數(shù)节腐,用戶必須對(duì)它進(jìn)行定義。假設(shè)需要添加另一個(gè)用戶定義的函數(shù)门怪。和庫西數(shù)一樣锅纺,也可以通過函數(shù)名來調(diào)用用戶定義的兩數(shù)。對(duì)于庫函數(shù)坦弟,在使用之前必須提供其原型官地,通常把原型放到 main() 定義之前。但現(xiàn)在您必須提供新函數(shù)的源代碼赤炒。最簡(jiǎn)單的方法是亏较,將代碼放在main( )的后面莺褒。程序清單 2.5 演示了這些元素。

// 程序清單 2.5 ourfunc.cpp
// ourfunc.cpp--defining your own tunctior

#include <iostream>

void simon(int n){
    using namespace std;
    cout << "Simon says touch your toes " << n << " times." << endl;
}

int main() {
    using namespace std;
    simon(3);
    cout << "Pick an intecer: ";
    int count;
    cin >> count;
    simon(count);
    cout << "Done!" << endl;
    return 0;
}

main() 兩數(shù)兩次調(diào)用 simon() 函數(shù)雪情,一次的參數(shù)為 3遵岩,另一次的參數(shù)為變量 count。在這兩次調(diào)用之間巡通,用戶輸入一個(gè)整數(shù)尘执,用來設(shè)置 count 的值。這個(gè)例子沒有在 cout 提示消息中使用換行符宴凉。這樣將導(dǎo)致用戶輸入與提示出現(xiàn)在同一行中。下面是運(yùn)行情況:

Simon says touch your toes 3 times
Pick an integer: 512
Simon says touch your toes 512 times
Done
2.4.4 用戶定義的有返回值的函數(shù)

我們?cè)偕钊胍徊焦蚪猓帉懸粋€(gè)使用返回語句的函數(shù)炉旷。main() 函數(shù)已經(jīng)揭示了有返回值的函數(shù)的格式:在函數(shù)頭中指出返回類型签孔,在函數(shù)體結(jié)尾處使用return 叉讥。可以用這種形式為在英國(guó)觀光的人解決重量的問題饥追。在英國(guó)图仓,很名浴室都以英石(stone)為單位,不像美國(guó)以磅或公斤為單位但绕。一英石等于14磅救崔,程序清單 2.6 使用一個(gè)函數(shù)來完成這樣的轉(zhuǎn)換惶看。

// 程序清單 2.6 convert.cpp
// convert. cpp -- converts stone to pounds

#include <iostream>

int stonetolb(int);

int main() {
    using namespace std;
    int stone;
    cout << "Enter the weight in stone: ";
    cin >> stone;
    int pounds = stonetolb(stone);
    cout << stone << " stone = ";
    cout << pounds << " pounds." << endl;
    return 0;
}

int stonetolb(int stone) {
    return 14 * stone;
}

下面是該程序的運(yùn)行情況:

Enter the weight in stone: 15
15 stone = 210 pounds.

在 main() 中,程序使用 cin 來給整型變量 stone 提供一個(gè)值六孵。這個(gè)值被作為參數(shù)傳遞給 stonetolb( ) 函數(shù)在該函數(shù)中纬黎,這個(gè)值被賦給變量 stone。然后劫窒,
stonetolb() 用關(guān)鍵字return 將 14*stone 返回給 main()本今。這表明 return 后面并非一定得跟一個(gè)簡(jiǎn)單的數(shù)字。這里通過使用較為復(fù)雜的表達(dá)式主巍,避免了創(chuàng)建一個(gè)新變量冠息,將結(jié)果賦給該變量,然后將它返回孕索。程序?qū)⒂?jì)算表達(dá)式的值(這里為210)逛艰,并將其返回。如果返回表達(dá)式的值很麻煩搞旭,可以采取更復(fù)雜的方式:

int stonetolb(int stone) {
    int bounds = 14 * stone:
    return pounds;
}

視頻鏈接: pan.baidu.com/s/1wWTcf7NqiWW_N-EQyev3Ig
視頻密碼: r88b

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末散怖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肄渗,更是在濱河造成了極大的恐慌杭抠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恳啥,死亡現(xiàn)場(chǎng)離奇詭異偏灿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钝的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門翁垂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人硝桩,你說我怎么就攤上這事沿猜。” “怎么了碗脊?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵啼肩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我衙伶,道長(zhǎng)祈坠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任矢劲,我火速辦了婚禮赦拘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芬沉。我一直安慰自己躺同,他們只是感情好阁猜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蹋艺,像睡著了一般剃袍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捎谨,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天笛园,我揣著相機(jī)與錄音,去河邊找鬼侍芝。 笑死研铆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的州叠。 我是一名探鬼主播棵红,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼咧栗!你這毒婦竟也來了逆甜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤致板,失蹤者是張志新(化名)和其女友劉穎交煞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斟或,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡素征,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萝挤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片御毅。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怜珍,靈堂內(nèi)的尸體忽然破棺而出端蛆,到底是詐尸還是另有隱情,我是刑警寧澤酥泛,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布今豆,位于F島的核電站,受9級(jí)特大地震影響柔袁,放射性物質(zhì)發(fā)生泄漏呆躲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一瘦馍、第九天 我趴在偏房一處隱蔽的房頂上張望歼秽。 院中可真熱鬧,春花似錦情组、人聲如沸燥筷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肆氓。三九已至,卻和暖如春底瓣,著一層夾襖步出監(jiān)牢的瞬間谢揪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工捐凭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拨扶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓茁肠,卻偏偏與公主長(zhǎng)得像患民,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垦梆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容