C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)
每個 C++ 程序都至少有一個函數(shù),即主函數(shù) main() ,所有簡單的程序都可以定義其他額外的函數(shù)。
1. 函數(shù)聲明
函數(shù)聲明告訴編譯器函數(shù)的名稱、返回類型和參數(shù)。函數(shù)聲明包括以下幾個部分:
return_type function_name( parameter list );
函數(shù)聲明示例:
int max(int num1, int num2);
在函數(shù)聲明中,參數(shù)的名稱并不重要,只有參數(shù)的類型是必需的,因此下面也是有效的聲明:
int max(int, int);
函數(shù)可接受用逗號分隔的多個參數(shù),但只能有一種返回類型。編寫不需要返回任何值的函數(shù)時,可將其返回類型指定為 void 。
當在一個源文件中定義函數(shù)且在另一個文件中調(diào)用函數(shù)時,函數(shù)聲明是必需的。在這種情況下,應(yīng)該在調(diào)用函數(shù)的文件頂部聲明函數(shù)。
2. 函數(shù)定義
函數(shù)定義提供了函數(shù)的實際主體。 C++ 中的函數(shù)定義的一般形式如下:
return_type function_name( parameter list )
{body of the function
}
在 C++ 中,函數(shù)由一個函數(shù)頭和一個函數(shù)主體組成。下面列出一個函數(shù)的所有組成部分:
- 返回類型:一個函數(shù)可以返回一個值。
return_type是函數(shù)返回的值的數(shù)據(jù)類型。有些函數(shù)執(zhí)行所需的操作而不返回值,在這種情況下,return_type是關(guān)鍵字void。 - 函數(shù)名稱:這是函數(shù)的實際名稱。函數(shù)名和參數(shù)列表一起構(gòu)成了函數(shù)簽名。
- 參數(shù):參數(shù)就像是占位符。當函數(shù)被調(diào)用時,您向參數(shù)傳遞一個值,這個值被稱為實際參數(shù)。參數(shù)列表包括函數(shù)參數(shù)的類型、順序、數(shù)量。參數(shù)是可選的,也就是說,函數(shù)可能不包含參數(shù)。
- 函數(shù)主體:函數(shù)主體包含一組定義函數(shù)執(zhí)行任務(wù)的語句。
3. 函數(shù)調(diào)用
當程序調(diào)用函數(shù)時,程序控制權(quán)會轉(zhuǎn)移給被調(diào)用的函數(shù)。被調(diào)用的函數(shù)執(zhí)行已定義的任務(wù),當函數(shù)的返回語句被執(zhí)行時,或到達函數(shù)的結(jié)束括號時,會把程序控制權(quán)交還給主程序。
調(diào)用函數(shù)時,傳遞所需參數(shù),如果函數(shù)返回一個值,則可以存儲返回值。例如:
#include <iostream>
using namespace std;// 函數(shù)聲明
int max(int num1, int num2);int main ()
{// 局部變量聲明int a = 100;int b = 200;int ret;// 調(diào)用函數(shù)來獲取最大值ret = max(a, b);cout << "Max value is : " << ret << endl;return 0;
}// 函數(shù)返回兩個數(shù)中較大的那個數(shù)
int max(int num1, int num2)
{return (num1 > num2)? num1:num2;
}
3.1 傳值
傳值調(diào)用是把參數(shù)的實際值復制給函數(shù)的形式參數(shù)。默認情況下, C++ 使用傳值調(diào)用方法來傳遞參數(shù)。一般來說,這意味著函數(shù)內(nèi)的代碼不會改變用于調(diào)用函數(shù)的實際參數(shù)。
一個函數(shù) f() 的參數(shù)實際上是 f() 中的局部變量, 每次 f() 被調(diào)用時都會初始化 。
// 傳值方式 (將待傳值拷貝一份, 交給函數(shù) )
// 傳值方式非常直接 , 其代價就是復制值的開銷
int f(int x)
{x = x + 1;return x;
}int main ()
{int a = 0;std::cout << f(a) << std::endl; // 1std::cout << a << std::endl; // 0 f() 不 改 變 aint b = 10;std::cout << f(b) << std::endl; // 11 std::cout << b << std::endl; // 10 f() 不 改 變 b
}
3.2 傳常量引用
傳常量引用,不會有復制值開銷,其中符號 & 表示 “ 引用 ”,而此處的 const 用來阻止在函數(shù) f 中修改傳入的參數(shù)。如果修改傳入的參數(shù)則會報錯 assignment of read-only reference ‘x’。
int f(const int& x)
{std::cout << "in f function x is " << x << std::endl;// x = x + 1; error: assignment of read-only reference ‘x’return x;
}int main ()
{int a = 0;std::cout << f(a) << std::endl; // 0 int b = 10;std::cout << f(b) << std::endl; // 10
}
3.3 傳引用
如果我們確實希望函數(shù)修改其參數(shù),那么傳引用方式把參數(shù)的引用賦值給形式參數(shù)。在函數(shù)內(nèi),該引用用于訪問調(diào)用中要用到的實際參數(shù)。這意味著,修改形式參數(shù)會影響實際參數(shù)。
// 傳引用
int f(int& x)
{ x = x + 1; std::cout << "in f function x is " << x << std::endl;return x;
}int main ()
{int a = 0;std::cout << f(a) << std::endl; // 1 std::cout << a << std::endl; // 1 int b = 10;std::cout << f(b) << std::endl; // 11 std::cout << b << std::endl; // 11
}
這里 , 我們希望 f 函數(shù)修改參數(shù) x ,因此我們沒有使用傳值參數(shù) ( 拷貝參數(shù)值 ) , 也沒有使用傳常量引用參數(shù) ( 不允許修改參數(shù) ) ,只是將實際參數(shù)的 “ 簡單引用 ” 傳遞給形參 。
示例 2
int main ()
{int i = 7;int& r = i; // r 是 i 的引用,也就是說 , 任何對 r 的使用實際上使用的是 ir = 9;std::cout << i << std::endl; // 9 i = 10;std::cout << r << std::endl; // 10
}
3.4 指針調(diào)用
該方法把參數(shù)的地址賦值給形式參數(shù)。在函數(shù)內(nèi),該地址用于訪問調(diào)用中要用到的實際參數(shù)。這意味著,修改形式參數(shù)會影響實際參數(shù)。
#include <iostream>void swap(int *x, int *y)
{int temp;temp = *x;*x = *y;*y = temp;
}int main()
{int a = 1;int b = 2;std::cout << "交換前 a is " << a << " b is " << b << std::endl;/* 調(diào)用函數(shù)來交換值* &a 表示指向 a 的指針,即變量 a 的地址 * &b 表示指向 b 的指針,即變量 b 的地址 */swap(&a, &b);std::cout << "交換后 a is " << a << " b is " << b << std::endl;return 0;
}
輸出結(jié)果:
交換前 a is 1 b is 2
交換后 a is 2 b is 1
3.5 傳值、傳常量引用、傳引用、傳指針使用原則
- 使用傳值方式傳遞非常小的對象;
- 使用傳常量引用方式傳遞你不需修改的大對象;
- 讓函數(shù)返回一個值,而不是修改通過引用參數(shù)傳遞來的對象;
- 只有迫不得已時才使用傳引用方式;
第三條規(guī)則表達的是, 當你想用函數(shù)改變一個變量的值時, 實際上你還有另一種選擇 。
考慮如下代碼 :
int incr1(int a) { return a + 1; // 返回新的值作為結(jié)果}void incr2(int& a) { ++a; //通過傳引用修改對象} int x = 7;x = incrl(x); // 意義非常明顯incr2(x); //相當晦澀難懂
那么我們?yōu)槭裁催€需要非常量引用傳遞方式呢 ? 因為有時候這種參數(shù)傳遞方式是必要的 。
- 用于操作容器 ( 比如
vector) 和其他大的對象 。 - 用于改變多個對象的函數(shù)(函數(shù)只能有一個返回值) 。
4. 函數(shù)參數(shù)默認值
定義函數(shù)時可以為參數(shù)列表中后邊的每一個參數(shù)指定默認值。調(diào)用函數(shù)時,如果未傳遞參數(shù)的值,則會使用默認值,如果指定了值,則會忽略默認值,使用傳遞的值。請看下面的實例:
#include <iostream>
using namespace std;int mySum(int, int y);int mySum(int x, int y= 100)
{return x + y;
}int main()
{int a = 10;int b = 20;cout << "not default value result: "<<mySum(a, b) << endl;cout << "use default value result: "<<mySum(a) << endl;return 0;
}
參考:
https://blog.csdn.net/kanglongyao/article/details/47184593?utm_source=blogxgwz6
5. 函數(shù)重載
名稱和返回類型相同,但參數(shù)不同的函數(shù)被稱為重載函數(shù)。在應(yīng)用程序中,如果需要使用不同的參數(shù)調(diào)用具有特定名稱和返回類型的函數(shù),重載函數(shù)將很有用。
假設(shè)您需要編寫一個計算圓和圓柱的面積的應(yīng)用程序。計算圓面積的函數(shù)需要一個參數(shù)—半徑,而計算圓柱面積的函數(shù)除了需要圓柱的半徑外,還需要圓柱的高度。這兩個函數(shù)需要返回的數(shù)據(jù)類型相同,都是面積。C++ 讓您能夠定義兩個重載的函數(shù),它們都叫 Area,都返回double,但一個接受半徑作為參數(shù),另一個接受半徑和高度作為參數(shù)。
#include <iostream>
using namespace std;const double Pi = 3.14159265;
double Area(double radius); // for circle
double Area(double radius, double height); // for cylinder// for circle
double Area(double radius)
{return Pi * radius * radius;
}// overloaded for cylinder
double Area(double radius, double height)
{
// reuse the area of circlereturn 2 * Area (radius) + 2 * Pi * radius * height;
}int main()
{cout << "圓面積是 " << Area(3) << endl;cout << "圓柱面積是 " << Area(3,5) << endl;return 0;
}
總結(jié)
以上是生活随笔為你收集整理的C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好听的炒鸡名字大全集
- 下一篇: 2022-2028年中国餐具行业市场研究