目錄
一、函數(shù)簡介
1、函數(shù)的作用和目的
2、函數(shù)的基本概念
二、函數(shù)定義與聲明
1、函數(shù)定義的語法和結(jié)構(gòu)
2、函數(shù)原型
三、參數(shù)傳遞
1、值傳遞
2、引用傳遞
3、指針傳遞
4、參數(shù)傳遞的選擇
5.引用傳遞與指針傳遞的區(qū)別
四、返回值
1、返回類型
2、返回語句
一、函數(shù)簡介
1、函數(shù)的作用和目的
在 C++ 中,函數(shù)的主要作用和目的有以下幾點:
1)模塊化:函數(shù)使得我們可以將大型、復雜的程序拆分為更小、更易處理的模塊。這些模塊就是函數(shù),它們實現(xiàn)了程序的各個子任務(wù)。通過將復雜問題拆分成較小的、獨立的部分,我們可以更有效地組織和維護代碼。
2)提高代碼的可讀性:良好的函數(shù)命名能夠清楚地表達函數(shù)的目的和功能。這樣,在閱讀代碼時,我們可以從函數(shù)名快速理解代碼的作用,而不必詳細了解函數(shù)內(nèi)部的實現(xiàn)細節(jié)。良好組織的代碼使得閱讀和理解程序更為容易。
3)代碼重用:函數(shù)為代碼提供了重用性。將特定功能封裝到函數(shù)中,可以在不同部分的程序多次調(diào)用該函數(shù)。這有助于減少代碼冗余,使代碼更容易維護。如果需要修改某個功能,只需要修改該函數(shù)的實現(xiàn),而無需修改多處重復的代碼。
4)隔離代碼:通過在函數(shù)中封裝特定的功能,可以將實現(xiàn)細節(jié)與其他代碼隔離開,有利于排查錯誤和調(diào)試程序。函數(shù)中的局部變量和參數(shù)域可以確保函數(shù)的輸入和輸出在函數(shù)的調(diào)用之間是獨立的,這有助于減少程序中的相互依賴和潛在的錯誤。
5)調(diào)試和測試:與大的、復雜的代碼塊相比,獨立的函數(shù)更容易調(diào)試和測試。我們可以針對特定功能編寫測試用例,驗證函數(shù)是否正確實現(xiàn)了預期的功能。
通過充分利用函數(shù)的這些優(yōu)勢,我們可以編寫出更簡潔、易讀、高效且可維護的代碼。函數(shù)是編程中的基本構(gòu)建塊,熟練掌握函數(shù)的作用和目的是成為一名高效的程序員的關(guān)鍵。
2、函數(shù)的基本概念
函數(shù)具有以下基本概念:
1)函數(shù)名:每個函數(shù)都有一個唯一的標識符,稱為函數(shù)名。通過函數(shù)名進行函數(shù)調(diào)用以執(zhí)行其功能。
2)參數(shù)列表:參數(shù)列表是用于向函數(shù)發(fā)送輸入的一組變量。這些變量稱為形式參數(shù)。參數(shù)列表可以為空,表示函數(shù)無需輸入。形式參數(shù)可以是任意數(shù)據(jù)類型,并在調(diào)用時與實際參數(shù)關(guān)聯(lián)。
3)返回類型:函數(shù)可以返回一個值,稱為返回值。返回類型指定了該值的數(shù)據(jù)類型。如果沒有返回值,使用關(guān)鍵字?void
?表示。
4)函數(shù)體:函數(shù)體是用花括號?{}
?包圍的一組 C++ 語句,用于描述函數(shù)如何完成任務(wù)。函數(shù)體包括定義局部變量、執(zhí)行計算以及返回結(jié)果等操作。
5)調(diào)用:要執(zhí)行函數(shù)中的代碼,需要在程序的某個地方調(diào)用該函數(shù)。函數(shù)調(diào)用包括函數(shù)名和一組實際參數(shù)(如果有的話)。
函數(shù)既可以作為程序的基本構(gòu)造塊(如求和、搜索、排序等),也可以用于定義更復雜的功能(如在面向?qū)ο缶幊讨斜硎緦ο蟮男袨椋?。掌握函?shù)的基本概念可以幫助您更好地理解和應(yīng)用 C++ 函數(shù),從而使您的代碼更具組織性和可重用性。
二、函數(shù)定義與聲明
1、函數(shù)定義的語法和結(jié)構(gòu)
C++函數(shù)定義主要包括四個部分:返回類型、函數(shù)名、參數(shù)列表和函數(shù)體。我們可以通過以下示例來了解它們:
#include <iostream>
using?namespace?std;
// 函數(shù)原型聲明
int multiply(int a, int b);
int main()
{
int?x =?4;
int?y =?5;
int?result =?multiply(x, y);?// 函數(shù)調(diào)用
cout <<?"x * y = "?<< result << endl;
return?0;
}
// 函數(shù)定義
int multiply(int a, int b)
{
int?product = a * b;?// 函數(shù)體,執(zhí)行具體操作
return?product;?// 返回值
}
在這個示例中:
返回類型:int
?。該類型說明要從函數(shù)返回的值的數(shù)據(jù)類型。
函數(shù)名:multiply
?。這是一個唯一標識符,用于定義和調(diào)用函數(shù)。
參數(shù)列表:(int a, int b)
:這里,我們有兩個整型參數(shù),分別是a和b。參數(shù)列表為空時,我們用void。
函數(shù)體:在大括號 {} 中包含的代碼塊。這部分是實際執(zhí)行計算和操作的地方,在這里我們計算 a * b 的乘積,并將結(jié)果存儲在變量 product 中。最后,我們用 return 語句返回這個值。
2、函數(shù)原型
函數(shù)原型(又稱函數(shù)聲明)是C++中告知編譯器函數(shù)簽名的一種方式。它提供了有關(guān)函數(shù)的基本信息,包括函數(shù)名、返回類型和參數(shù)列表。在編譯過程中,編譯器根據(jù)這些信息為函數(shù)調(diào)用分配內(nèi)存和生成相應(yīng)的代碼。
下面的例子說明了C++中函數(shù)原型的定義:
#include <iostream>
using?namespace?std;
// 函數(shù)原型聲明(告知編譯器有關(guān)subtract函數(shù)的信息)
int subtract(int a, int b);
int main()
{
int?x =?10;
int?y =?5;
int?result =?subtract(x, y);?// 函數(shù)調(diào)用
cout <<?"x - y = "?<< result << endl;
return?0;
}
// 函數(shù)定義 (具體實現(xiàn)subtract函數(shù))
int subtract(int a, int b)
{
int?difference = a - b;?// 函數(shù)體,執(zhí)行具體操作
return?difference;?// 返回值
}
上述代碼中(在main函數(shù)之前)的部分?int subtract(int a, int b);?是函數(shù)原型,具有以下信息:
返回類型:int,表示此函數(shù)將返回一個整數(shù)值。
函數(shù)名:subtract,用于標識此函數(shù)。
參數(shù)列表:(int a, int b) 表示此函數(shù)接受兩個整數(shù)參數(shù) a 和 b。
函數(shù)原型有助于確保正確地使用函數(shù),尤其是在大型項目中,這可以提高源代碼的模塊化和可讀性。它使您可以先聲明函數(shù),然后在其他地方具體實現(xiàn)它們。
三、參數(shù)傳遞
1、值傳遞
值傳遞?是C++中最常見的參數(shù)傳遞方式,以傳值方式將實參傳遞給形參。在這種傳遞方式中,函數(shù)使用實參的副本(值的拷貝),而不是實際變量本身。因此,對形參進行的任何更改都不會影響到實際的實參。
下面的例子說明了值傳遞:
#include <iostream>
using?namespace?std;
// 函數(shù)原型聲明 (使用值傳遞)
void valuePass(int num);
int main()
{
int?x =?5;
cout <<?"Before function call, x = "?<< x << endl;
valuePass(x);?// 函數(shù)調(diào)用
cout <<?"After function call, x = "?<< x << endl;
return?0;
}
// 函數(shù)定義 (使用值傳遞)
void valuePass(int num)
{
num = num +?10;?// 修改形參
cout <<?"Inside function, num = "?<< num << endl;
}
輸出結(jié)果如下:
Before function call, x =?5
Inside function, num =?15
After function call, x =?5
這個例子展示了,當我們在main函數(shù)中調(diào)用valuePass(x)時,將?x?變量的值傳遞給函數(shù)?valuePass?中的形參?num。在?valuePass?函數(shù)內(nèi)部,我們對?num?進行了修改,但在函數(shù)調(diào)用之后,x?的值依然保持不變。這說明函數(shù)并未直接修改實參?x?的值,而是對它的一個副本進行修改。這就是值傳遞的特點。
2、引用傳遞
在C++中,除了值傳遞之外,我們還可以使用引用傳遞來傳遞函數(shù)參數(shù)。通過引用傳遞,函數(shù)使用實際參數(shù)的引用(別名)而不是其副本。因此,對形參的更改會直接影響實際參數(shù)。引用傳遞提供了一種有效的方法來修改實參的值,同時避免了實參拷貝的開銷。
下面的示例展示了引用傳遞:
#include <iostream>
using?namespace?std;
// 函數(shù)原型聲明(使用引用傳遞)
void referencePass(int &num);
int main()
{
int?x =?5;
cout <<?"Before function call, x = "?<< x << endl;
referencePass(x);?// 函數(shù)調(diào)用
cout <<?"After function call, x = "?<< x << endl;
return?0;
}
// 函數(shù)定義(使用引用傳遞)
void referencePass(int &num)
{
num = num +?10;?// 修改形參,實際也修改了實參
cout <<?"Inside function, num = "?<< num << endl;
}
輸出結(jié)果:
Before function call, x =?5
Inside function, num =?15
After function call, x =?15
在這個例子中,我們通過引用傳遞實參 x 給 referencePass 函數(shù)。在函數(shù)內(nèi),我們對形參 num進行了修改。當函數(shù)返回時,我們可以看到實參數(shù) x 的值也被更改了。這意味著對引用參數(shù)的修改直接改變了實際參數(shù)的值。這就是引用傳遞的一個顯著特點。
3、指針傳遞
在C++中,除了值傳遞和引用傳遞外,還可以使用指針傳遞來傳遞函數(shù)參數(shù)。通過指針傳遞,函數(shù)接收指向?qū)嶋H參數(shù)的指針,因此可以間接地訪問和修改實際參數(shù)。指針傳遞避免了實參的拷貝,并允許通過操作指針來修改實參。
以下示例展示了指針傳遞的用法:
#include <iostream>
using?namespace?std;
// 函數(shù)原型聲明(使用指針傳遞)
void pointerPass(int *num);
int main()
{
int?x =?5;
cout <<?"Before function call, x = "?<< x << endl;
pointerPass(&x);?// 函數(shù)調(diào)用時傳遞x的地址
cout <<?"After function call, x = "?<< x << endl;
return?0;
}
// 函數(shù)定義(使用指針傳遞)
void pointerPass(int *num)
{
*num = *num +?10;?// 通過指針修改實參的值
cout <<?"Inside function, *num = "?<< *num << endl;
}
輸出結(jié)果:
Before function call, x =?5
Inside function, *num =?15
After function call, x =?15
在這個示例中,我們通過指針傳遞實參 x 的地址給 pointerPass 函數(shù)。在函數(shù)內(nèi)部,我們使用指針 num 存取實參 x 的值并對其進行修改。當函數(shù)返回后,我們可以看到實參 x 的值已經(jīng)發(fā)生了改變。這表明通過指針對參數(shù)進行的修改可以改變實際參數(shù)的值,這是指針傳遞的一個主要特點。
4、參數(shù)傳遞的選擇
在C++中,根據(jù)不同的情況,我們可以選擇以下三種參數(shù)傳遞方式:值傳遞、引用傳遞和指針傳遞。以下是如何選擇合適的參數(shù)傳遞方式的簡要說明:
值傳遞:當你希望保證實參不被修改時,請選擇值傳遞。這通常用于傳遞基本數(shù)據(jù)類型(如int、float、char等)和小型自定義數(shù)據(jù)結(jié)構(gòu)。需要注意的是,由于值傳遞涉及到拷貝操作,因此在傳遞大型數(shù)據(jù)結(jié)構(gòu)時可能會導致性能下降。
pp
int function(int a){...}
引用傳遞:當您希望修改實參以及避免數(shù)據(jù)拷貝操作時,請選擇引用傳遞。這通常用于大型數(shù)據(jù)結(jié)構(gòu)、數(shù)組或類對象的傳遞。為了確保不會意外地修改參數(shù),可使用在參數(shù)前加上const
?關(guān)鍵字,顯式地表示引用參數(shù)是只讀的。
pp
void function(int &a){...}
void functionWithConst(const string &str){...}
指針傳遞:指針傳遞通常用于與現(xiàn)有C代碼庫互操作或為了向后兼容C風格實踐。同樣,我們可以借助指針傳遞實現(xiàn)間接訪問和修改實參。當在函數(shù)內(nèi)部使用動態(tài)內(nèi)存分配時,指針傳遞也是一個合適的選擇。在有些情況下,使用指針傳遞還可以表示可選參數(shù),當指針為nullptr
?時,表示參數(shù)未被傳遞。
pp
void function(int *a){...}
void functionWithOptional(int *a=nullptr){...}
5.引用傳遞與指針傳遞的區(qū)別
-
語法:引用傳遞使用引用符號(&),而指針傳遞使用指針符號(*)。
-
內(nèi)存操作:引用傳遞不會創(chuàng)建新的變量副本,而是直接操作原始變量。指針傳遞則會創(chuàng)建一個指向原始變量的指針,需要通過解引用操作才能訪問原始變量。
-
空值(null)處理:指針傳遞可以接受空指針(null),即指針可以指向空的內(nèi)存地址。而引用傳遞必須始終指向有效的對象,不能為 null。
-
傳遞方式:引用傳遞是一種隱式傳遞方式,函數(shù)參數(shù)聲明時使用引用類型即可。指針傳遞則需要顯式地傳遞指針作為參數(shù),需要在調(diào)用函數(shù)時手動取地址或創(chuàng)建指針。
-
參數(shù)修改:引用傳遞在函數(shù)內(nèi)部對參數(shù)的修改會影響到原始變量,而指針傳遞需要通過解引用操作才能修改原始變量。
總結(jié)來說,引用傳遞直接操作原始變量,不需要額外的語法和解引用操作,并且不允許為空;而指針傳遞則需要通過指針符號和解引用操作來操作原始變量,可以為空。選擇使用哪種方式取決于具體的需求和編程環(huán)境,需要考慮到內(nèi)存管理、空值處理以及函數(shù)參數(shù)修改等方面的因素。
四、返回值
1、返回類型
在C++中,函數(shù)返回值是通過返回類型來指定的。返回類型是在函數(shù)定義和聲明中指定的類型,用于告知編譯器和其他程序員該函數(shù)返回的值的數(shù)據(jù)類型。C++中的返回類型可以是任意的基本數(shù)據(jù)類型、用戶自定義數(shù)據(jù)類型、自定義類類型,甚至是指針或引用類型。以下是C++中不同返回類型的簡單描述:
1)基本數(shù)據(jù)類型:一個函數(shù)可以返回基本數(shù)據(jù)類型,如`int`、`float`、`double`、`bool`、`char`等。例如,一個函數(shù)可以返回兩個整數(shù)相加的結(jié)果。
int add(int a, int b)?
{
return?a + b;
}
2)用戶自定義數(shù)據(jù)類型:函數(shù)還可以返回結(jié)構(gòu)體、聯(lián)合體或枚舉類型等用戶自定義類型。例如,一個函數(shù)可以返回兩個結(jié)構(gòu)體對象中包含的數(shù)據(jù)之和。
struct?Point?{
int?x;
int?y;
};
Point addPoints(const Point& p1, const Point& p2)
{
Point sum;
sum.x = p1.x + p2.x;
sum.y = p1.y + p2.y;
return?sum;
}
3)自定義類類型:函數(shù)可以返回自定義類類型的對象。例如,一個函數(shù)可以返回字符串類的一個實例。
std::string concatenateStrings(const std::string& str1, const std::string& str2)?
{
return?str1 + str2;
}
4)指針類型:如果函數(shù)需要返回指針類型的數(shù)據(jù),可以使用指針類型作為返回類型。例如,一個函數(shù)可能需要返回動態(tài)分配的整數(shù)數(shù)組。
int* createDynamicArray(int size)?
{
int* arr =?new?int[size];
return?arr;
}
5)引用類型:當希望函數(shù)返回某對象的引用時,可以使用引用類型作為返回類型。這可以避免返回對象時的拷貝成本,但請確保引用的對象在函數(shù)返回之后仍然有效,避免返回局部變量的引用。
int& getElement(int *arr, int index)
{
return?arr[index];
}
6)void類型:當一個函數(shù)不需要返回任何值時,可以使用void
?作為返回類型。此時,函數(shù)只執(zhí)行操作,不返回任何結(jié)果,例如打印日志信息。
void printLogMessage(const std::string& msg)?
{
std::cout <<?"Log: "?<< msg << std::endl;
}
對于每個函數(shù),必須指定一個返回類型。在選擇返回類型時,請務(wù)必確保它與實際返回值匹配,以避免類型不匹配或未定義行為。如果需要返回多個值,則可以使用元組(tuple
?)或自定義數(shù)據(jù)結(jié)構(gòu)來組合多個值。
2、返回語句
在C++中,return 語句被用于函數(shù)中從函數(shù)體返回值并終止函數(shù)的執(zhí)行。當編譯器執(zhí)行到 return 語句時,它會停止當前函數(shù)的執(zhí)行并返回到調(diào)用它的代碼點。return 語句的使用取決于函數(shù)的返回類型,可以有以下幾種情況:
1)返回基本數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型:當函數(shù)返回類型為基本數(shù)據(jù)類型(如 int,float等)或用戶自定義數(shù)據(jù)類型(如結(jié)構(gòu)體、類對象)時,可以直接在 return 語句后跟上相應(yīng)類型的值或變量。
int add(int a, int b)?
{
int?result = a + b;
return?result;?// 返回整數(shù)類型的值
}
std::string getName()?
{
std::string name =?"John Doe";
return?name;?// 返回字符串類型的值
}
2)返回指針類型:當函數(shù)返回指針類型時,return
?語句后應(yīng)跟著相應(yīng)類型的指針。
int* getPointer(int &x)?
{
return?&x;?// 返回整數(shù)類型指針
}
3)返回引用類型:當函數(shù)返回引用類型時,return 語句后應(yīng)跟著相應(yīng)類型的引用。請注意避免返回局部變量的引用,因為這可能導致未定義行為。
int& getMax(int &a, int &b)?
{
return?(a > b) ? a : b;?// 返回整數(shù)類型引用
}
4)返回void類型:對于返回類型為void的函數(shù),可以使用return;語句提前終止函數(shù)執(zhí)行。在這種情況下,不能在return語句后跟任何值。如果函數(shù)執(zhí)行到末尾仍未遇到return語句,在大多數(shù)編譯器下,會自動插入一個return;語句。文章來源:http://www.zghlxwxcb.cn/news/detail-810044.html
void printInfo(int x)?
{
if?(x <?0) {
std::cout <<?"Error: negative number"?<< std::endl;
return;?// 提前終止函數(shù)執(zhí)行
}
std::cout <<?"Number: "?<< x << std::endl;
}
為了確保代碼的正確性和可讀性,請在函數(shù)中使用適當?shù)膔eturn語句,并始終與函數(shù)的預期返回類型保持一致。在不需要返回值的情況下,請使用void類型,不要隨意省略return語句。文章來源地址http://www.zghlxwxcb.cn/news/detail-810044.html
到了這里,關(guān)于C++ 從零基礎(chǔ)到入門(3)—— 函數(shù)基礎(chǔ)知識的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!