0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++基礎(chǔ)知識之函數(shù)1

jf_78858299 ? 來源:QStack ? 作者: 月下西樓 ? 2023-04-03 10:34 ? 次閱讀

函數(shù)是 C++ 中的一個(gè)重要概念,它可以讓我們將一段代碼封裝起來,然后在需要的時(shí)候調(diào)用它。C++ 中的函數(shù)有以下幾個(gè)特點(diǎn):

  • 函數(shù)可以有參數(shù)和返回值。
  • 函數(shù)可以被其他函數(shù)調(diào)用。
  • 函數(shù)可以被重載,即可以定義多個(gè)同名的函數(shù),只要它們的參數(shù)列表不同即可。

函數(shù)的定義和調(diào)用

在 C++ 中,函數(shù)的定義和調(diào)用都非常簡單。以下是一個(gè)簡單的函數(shù)的定義和調(diào)用的示例:

#include 

// 定義一個(gè)名為 add 的函數(shù),它有兩個(gè)參數(shù) x 和 y,返回值為 x + y
int add(int x, int y) {
    return x + y;
}

int main() {
    // 調(diào)用 add 函數(shù),并將返回值賦值給變量 z
    int z = add(1, 2);
    std::cout << "1 + 2 = " << z << std::endl;
    return 0;
}

在這個(gè)示例中,我們定義了一個(gè)名為 add 的函數(shù),它有兩個(gè)參數(shù) x 和 y,返回值為 x + y。然后在 main 函數(shù)中,我們調(diào)用了 add 函數(shù),并將返回值賦值給變量 z,最后輸出了 1 + 2 = 3。

函數(shù)的參數(shù)和返回值

在 C++ 中,函數(shù)可以有參數(shù)和返回值。以下是一個(gè)帶有參數(shù)和返回值的函數(shù)的示例:

#include 

// 定義一個(gè)名為 add 的函數(shù),它有兩個(gè)參數(shù) x 和 y,返回值為 x + y
int add(int x, int y) {
    return x + y;
}

int main() {
    // 調(diào)用 add 函數(shù),并將返回值賦值給變量 z
    int z = add(1, 2);
    std::cout << "1 + 2 = " << z <<
    std::endl;

// 調(diào)用 add 函數(shù),并將返回值賦值給變量 z
}

在這個(gè)示例中,我們定義了一個(gè)名為 add 的函數(shù),它有兩個(gè)參數(shù) x 和 y,返回值為 x + y。然后在 main 函數(shù)中,我們調(diào)用了 add 函數(shù)兩次,并將返回值分別賦值給變量 z,最后輸出了 1 + 2 = 3 和 3 + 4 = 7。

函數(shù)的重載

在 C++ 中,函數(shù)可以被重載,即可以定義多個(gè)同名的函數(shù),只要它們的參數(shù)列表不同即可。以下是一個(gè)函數(shù)重載的示例:

#include 

// 定義一個(gè)名為 add 的函數(shù),它有兩個(gè)參數(shù) x 和 y,返回值為 x + y
int add(int x, int y) {
    return x + y;
}

// 定義一個(gè)名為 add 的函數(shù),它有三個(gè)參數(shù) x、y 和 z,返回值為 x + y + z
int add(int x, int y, int z) {
    return x + y + z;
}

int main() {
    // 調(diào)用 add 函數(shù),并將返回值賦值給變量 z
    int z = add(1, 2);
    std::cout << "1 + 2 = " << z << std::endl;

    // 調(diào)用 add 函數(shù),并將返回值賦值給變量 z
    z = add(1, 2, 3);
    std::cout << "1 + 2 + 3 = " << z << std::endl;

    return 0;
}

在這個(gè)示例中,我們定義了兩個(gè)同名的函數(shù) add,它們的參數(shù)列表不同。這就是函數(shù)重載的一個(gè)例子。函數(shù)重載可以讓我們定義多個(gè)同名的函數(shù),只要它們的參數(shù)列表不同即可。這樣可以讓我們更方便地使用函數(shù),而不需要為每個(gè)函數(shù)取不同的名字。

參數(shù)傳遞

在 C++ 中,函數(shù)的參數(shù)傳遞有兩種方式:值傳遞和引用傳遞。

值傳遞

值傳遞是指將參數(shù)的值復(fù)制一份,然后將這份復(fù)制傳遞給函數(shù)。在函數(shù)內(nèi)部,對參數(shù)的修改不會影響到原始的參數(shù)。以下是一個(gè)值傳遞的示例:

#include 

// 定義一個(gè)名為 add 的函數(shù),它有兩個(gè)參數(shù) x 和 y,返回值為 x + y
int add(int x, int y) {
    x = x + 1;
    y = y + 1;
    return x + y;
}

int main() {
    int a = 1;
    int b = 2;
    int c = add(a, b);
    std::cout << "a = " << a << std::endl; // 輸出 a = 1
    std::cout << "b = " << b << std::endl; // 輸出 b = 2
    std::cout << "c = " << c << std::endl; // 輸出 c = 5
    return 0;
}

在這個(gè)示例中,我們定義了一個(gè)名為 add 的函數(shù),它有兩個(gè)參數(shù) x 和 y,返回值為 x + y。然后在 main 函數(shù)中,我們定義了三個(gè)變量 a、b 和 c,并將 a 和 b 的值分別賦為 1 和 2。然后我們調(diào)用了 add 函數(shù),并將 a 和 b 作為參數(shù)傳遞給它。在 add 函數(shù)內(nèi)部,我們對 x 和 y 的值進(jìn)行了修改,但是這些修改不會影響到 a 和 b 的值。

引用傳遞

引用傳遞是指將參數(shù)的引用傳遞給函數(shù)。在函數(shù)內(nèi)部,對參數(shù)的修改會影響到原始的參數(shù)。以下是一個(gè)引用傳遞的示例:

#include 

// 定義一個(gè)名為 add 的函數(shù),它有兩個(gè)參數(shù) x 和 y,返回值為 x + y
int add(int& x, int& y) {
    x = x + 1;
    y = y + 1;
    return x + y;
}

int main() {
    int a = 1;
    int b = 2;
    int c = add(a, b);
    std::cout << "a = " << a << std::endl; // 輸出 a = 2
    std::cout << "b = " << b << std::endl; // 輸出 b = 3
    std::cout << "c = " << c << std::endl; // 輸出 c = 6
    return 0;
}

在這個(gè)示例中,我們定義了一個(gè)名為 add 的函數(shù),它有兩個(gè)參數(shù) x 和 y,返回值為 x + y。然后在 main 函數(shù)中,我們定義了三個(gè)變量 a、b 和 c,并將 a 和 b 的值分別賦為 1 和 2。然后我們調(diào)用了 add 函數(shù),并將 a 和 b 的引用作為參數(shù)傳遞給它。在 add 函數(shù)內(nèi)部,我們對 x 和 y 的值進(jìn)行了修改,這些修改會影響到 a 和 b 的值。

選擇哪種方式

在選擇參數(shù)傳遞方式時(shí),需要考慮以下幾個(gè)因素:

  • 如果參數(shù)是一個(gè)較小的基本類型(如 int、double 等),可以使用值傳遞。
  • 如果參數(shù)是一個(gè)較大的結(jié)構(gòu)體或類,可以使用引用傳遞,這樣可以避免復(fù)制大量的數(shù)據(jù)。
  • 如果需要在函數(shù)內(nèi)部修改參數(shù)的值,并且希望這些修改能夠影響到原始的參數(shù),可以使用引用傳遞。

函數(shù)匹配

在C++中,函數(shù)匹配是指編譯器在調(diào)用函數(shù)時(shí),根據(jù)實(shí)參的類型和數(shù)量,從函數(shù)的重載集合中選擇一個(gè)最佳的匹配函數(shù)的過程。函數(shù)匹配是C++中的一個(gè)重要概念,它決定了程序調(diào)用哪個(gè)函數(shù),因此對于C++程序員來說,了解函數(shù)匹配的規(guī)則和原理是非常重要的。C++中的函數(shù)匹配規(guī)則比較復(fù)雜,主要包括以下幾個(gè)方面:

  • 實(shí)參類型的精確匹配
  • 實(shí)參類型的標(biāo)準(zhǔn)類型轉(zhuǎn)換
  • 實(shí)參類型的用戶自定義類型轉(zhuǎn)換
  • 函數(shù)模板的匹配
實(shí)參類型的精確匹配

如果函數(shù)的形參類型和實(shí)參類型完全一致,那么這個(gè)函數(shù)就是一個(gè)精確匹配。例如,下面的代碼中,foo函數(shù)的形參類型和實(shí)參類型完全一致,因此它是一個(gè)精確匹配:

void foo(int x, double y) {
    // ...
}

int main() {
    int a = 1;
    double b = 2.0;
    foo(a, b); // 精確匹配
    return 0;
}
實(shí)參類型的標(biāo)準(zhǔn)類型轉(zhuǎn)換

如果函數(shù)的形參類型和實(shí)參類型不一致,但是可以通過標(biāo)準(zhǔn)類型轉(zhuǎn)換(如整型提升、算術(shù)類型轉(zhuǎn)換、指針類型轉(zhuǎn)換等)將實(shí)參類型轉(zhuǎn)換為形參類型,那么這個(gè)函數(shù)就是一個(gè)標(biāo)準(zhǔn)類型轉(zhuǎn)換匹配。 實(shí)例如,下面的代碼中,foo函數(shù)的形參類型是int, 而實(shí)參類型是short,但是可以通過整型提升將short類型轉(zhuǎn)換為int類型,因此foo函數(shù)是一個(gè)標(biāo)準(zhǔn)類型轉(zhuǎn)換匹配:

void foo(int x, double y) {
    // ...
}

int main() {
    short a = 1;
    double b = 2.0;
    foo(a, b); // 標(biāo)準(zhǔn)類型轉(zhuǎn)換匹配
    return 0;
}
實(shí)參類型的用戶自定義類型轉(zhuǎn)換

如果函數(shù)的形參類型和實(shí)參類型不一致,且不能通過標(biāo)準(zhǔn)類型轉(zhuǎn)換將實(shí)參類型轉(zhuǎn)換為形參類型,但是可以通過用戶自定義類型轉(zhuǎn)換將實(shí)參類型轉(zhuǎn)換為形參類型,那么這個(gè)函數(shù)就是一個(gè)用戶自定義類型轉(zhuǎn)換匹配。例如,下面的代碼中,foo函數(shù)的形參類型是double,而實(shí)參類型是int,但是可以通過用戶自定義類型轉(zhuǎn)換將int類型轉(zhuǎn)換為double類型,因此foo函數(shù)是一個(gè)用戶自定義類型轉(zhuǎn)換匹配:

class A {
public:
    operator double() const {
        return 0.0;
    }
};

void foo(double x) {
    // ...
}

int main() {
    A a;
    foo(a); // 用戶自定義類型轉(zhuǎn)換匹配
    return 0;
}

在上面的例子中,foo函數(shù)的形參類型是double,而實(shí)參類型是A,但是可以通過用戶自定義類型轉(zhuǎn)換將A類型轉(zhuǎn)換為double類型。具體來說,A類定義了一個(gè)類型轉(zhuǎn)換函數(shù)operator double(),該函數(shù)將A類型轉(zhuǎn)換為double類型。當(dāng)我們調(diào)用foo函數(shù)時(shí),編譯器會自動調(diào)用A類的類型轉(zhuǎn)換函數(shù),將A類型轉(zhuǎn)換為double類型,然后將轉(zhuǎn)換后的double類型作為實(shí)參傳遞給foo函數(shù)。

函數(shù)模版匹配

在C++中,函數(shù)模板匹配是通過模板參數(shù)推導(dǎo)來實(shí)現(xiàn)的。當(dāng)我們調(diào)用一個(gè)函數(shù)模板時(shí),編譯器會根據(jù)實(shí)參的類型推導(dǎo)出模板參數(shù)的類型,然后根據(jù)模板參數(shù)的類型來匹配函數(shù)模板。具體來說,編譯器會根據(jù)實(shí)參的類型推導(dǎo)出模板參數(shù)的類型,然后將模板參數(shù)的類型與函數(shù)模板的形參類型進(jìn)行匹配。如果匹配成功,則使用該函數(shù)模板來生成對應(yīng)的函數(shù)實(shí)例;否則,編譯器會報(bào)錯(cuò)。

?需要注意的是,函數(shù)模板匹配是一種非常靈活的機(jī)制,它可以根據(jù)實(shí)參的類型來推導(dǎo)出模板參數(shù)的類型,從而實(shí)現(xiàn)類型自動推導(dǎo)。但是,由于函數(shù)模板匹配是在編譯時(shí)進(jìn)行的,因此需要滿足一定的語法規(guī)則和限制。例如,函數(shù)模板的形參類型不能是引用類型,否則會導(dǎo)致模板參數(shù)推導(dǎo)失??;函數(shù)模板的形參類型不能是void類型,否則會導(dǎo)致編譯錯(cuò)誤等。 下面是一個(gè)函數(shù)模板匹配的例子:

?

template <typename T>
void foo(T x) {
    std::cout << x << std::endl;
}

int main() {
    foo(1); // T = int
    foo(1.0); // T = double
    foo("hello"); // T = const char*
    return 0;
}

在上面的代碼中,我們定義了一個(gè)函數(shù)模板foo,它有一個(gè)模板參數(shù)T和一個(gè)形參x。當(dāng)我們調(diào)用foo函數(shù)時(shí),編譯器會根據(jù)實(shí)參的類型推導(dǎo)出模板參數(shù)的類型,然后將模板參數(shù)的類型與函數(shù)模板的形參類型進(jìn)行匹配。例如,當(dāng)我們調(diào)用foo(1)時(shí),編譯器會推導(dǎo)出T為int,從而使用foo來生成對應(yīng)的函數(shù)實(shí)例。當(dāng)我們調(diào)用foo(1.0)時(shí),編譯器會推導(dǎo)出T為double,從而使用foo來生成對應(yīng)的函數(shù)實(shí)例。當(dāng)我們調(diào)用foo("hello")時(shí),編譯器會推導(dǎo)出T為const char,從而使用foo來生成對應(yīng)的函數(shù)實(shí)例。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 封裝
    +關(guān)注

    關(guān)注

    125

    文章

    7592

    瀏覽量

    142138
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4235

    瀏覽量

    61964
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73301
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67760
收藏 人收藏

    評論

    相關(guān)推薦

    學(xué)51單片機(jī)C51基礎(chǔ)知識

    帶您從零學(xué)51單片機(jī)C51基礎(chǔ)知識 C51基礎(chǔ)知識1 單片機(jī)的匯編(ASM)和
    發(fā)表于 02-10 14:30 ?109次下載

    C++C/C++程序設(shè)計(jì)教程_C/C++概述

    C++基礎(chǔ)知識,簡要介紹了C++的一些簡單知識,概念,函數(shù)
    發(fā)表于 12-25 10:15 ?0次下載

    C++語言基礎(chǔ)知識講解

    C++語言基礎(chǔ)知識講解,喜歡的朋友可以下載來學(xué)習(xí)。
    發(fā)表于 01-14 15:30 ?21次下載

    Visual C++教程之C++基礎(chǔ)知識介紹

    本文檔的主要內(nèi)容詳細(xì)介紹的是Visual C++教程之C++基礎(chǔ)知識介紹主要內(nèi)容包括了:1 類和對象,2 類的成員及特性,3 繼承和派生類
    發(fā)表于 02-15 15:59 ?9次下載
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的<b class='flag-5'>基礎(chǔ)知識</b>介紹

    C++程序設(shè)計(jì)教程之基礎(chǔ)知識資料概述

    本文檔詳細(xì)介紹的是C++程序設(shè)計(jì)教程之基礎(chǔ)知識資料概述主要內(nèi)容包括了:1.程序設(shè)計(jì)語言 ,2.C++前史 ,3.C++,4.
    發(fā)表于 02-28 11:11 ?13次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之<b class='flag-5'>基礎(chǔ)知識</b>資料概述

    C++程序設(shè)計(jì)的基礎(chǔ)知識初步了解C++的資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++程序設(shè)計(jì)的基礎(chǔ)知識初步了解C++的資料免費(fèi)下載包括了:1 認(rèn)識C++,2
    發(fā)表于 06-10 08:00 ?25次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)的<b class='flag-5'>基礎(chǔ)知識</b>初步了解<b class='flag-5'>C++</b>的資料免費(fèi)下載

    C++函數(shù)模板的概念及意義

    一、函數(shù)模板的引出:1c++中有幾種交換變量的方法:(1)定義宏代碼塊(2)定義函數(shù)代碼版本一:#include <iostream>#i
    的頭像 發(fā)表于 12-24 15:58 ?774次閱讀

    C++重載函數(shù)學(xué)習(xí)總結(jié)

    函數(shù)重載是c++c的一個(gè)重要升級;函數(shù)重載通過參數(shù)列表區(qū)分不同的同名函數(shù);extern關(guān)鍵字能夠?qū)崿F(xiàn)c
    的頭像 發(fā)表于 12-24 17:10 ?727次閱讀

    C++基礎(chǔ)語法inline 內(nèi)聯(lián)函數(shù)

    上節(jié)我們分析了C++基礎(chǔ)語法的const,static以及 this 指針,那么這節(jié)內(nèi)容我們來看一下 inline 內(nèi)聯(lián)函數(shù)吧! inline 內(nèi)聯(lián)函數(shù) 特征 相當(dāng)于把內(nèi)聯(lián)函數(shù)里面的內(nèi)
    的頭像 發(fā)表于 09-09 09:38 ?2049次閱讀

    C++核心編程基礎(chǔ)知識大全免費(fèi)下載

    C++核心編程基礎(chǔ)知識大全免費(fèi)下載
    發(fā)表于 12-03 18:06 ?2次下載

    C/C++基礎(chǔ)知識匯總

    這是一篇五萬字的C/C++知識點(diǎn)總結(jié),包括答案。
    的頭像 發(fā)表于 06-12 15:10 ?2232次閱讀

    C++基礎(chǔ)知識

    C++基礎(chǔ)知識
    的頭像 發(fā)表于 01-12 11:00 ?1270次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>基礎(chǔ)知識</b>

    深度解析C++中的虛函數(shù)

    函數(shù)作為C++的重要特性,讓人又愛又怕,愛它功能強(qiáng)大,但又怕駕馭不好,讓它反咬一口,今天我們用CPU的角度,撕掉語法的偽裝,重新認(rèn)識一下虛函數(shù)。 虛函數(shù)
    的頭像 發(fā)表于 02-15 11:14 ?738次閱讀
    深度解析<b class='flag-5'>C++</b>中的虛<b class='flag-5'>函數(shù)</b>

    C++基礎(chǔ)知識函數(shù)2

    C++中,我們可以使用inline關(guān)鍵字來定義內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)是一種特殊的函數(shù),它在編譯時(shí)會被直接嵌入到調(diào)用它的代碼中,從而避免了函數(shù)調(diào)
    的頭像 發(fā)表于 04-03 10:34 ?448次閱讀

    C++語言基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?6次下載