函數是一組接受輸入、執行某些特定計算的語句, 並產生輸出。這個想法是把一些常見的或重複的 一起完成任務以製作函數這樣我們就可以調用這個函數,而不是為不同的輸入一次又一次地編寫相同的代碼。
簡單來說,函數是僅在被調用時運行的代碼塊。
用法:
函數語法
例子:
C++
// C++ Program to demonstrate working of a function
#include <iostream>
using namespace std;
// Following function that takes two parameters 'x' and 'y'
// as input and returns max of two input numbers
int max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
// main function that doesn't receive any parameter and
// returns integer
int main()
{
int a = 10, b = 20;
// Calling above function to find max of 'a' and 'b'
int m = max(a, b);
cout << "m is " << m;
return 0;
}
m is 20
時間複雜度:O(1)
空間複雜度:O(1)
為什麽我們需要函數?
- 函數可以幫助我們減少代碼冗餘。如果函數在軟件中的多個位置執行,那麽我們不必一次又一次地編寫相同的代碼,而是創建一個函數並在各處調用它。這也有助於維護,因為如果我們將來更改函數,我們隻需在一處進行更改。
- 函數生成代碼模塊化的。考慮一個包含多行代碼的大文件。如果代碼被分成函數,那麽閱讀和使用代碼就會變得非常簡單。
- 函數提供抽象。例如,我們可以使用庫函數而不用擔心它們的內部工作。
函數聲明
函數聲明告訴編譯器參數的數量、參數的數據類型以及函數的返回類型。在函數聲明中寫入參數名稱是可選的,但必須將它們放在定義中。下麵是函數聲明的示例。 (以下聲明中不存在參數名稱)
函數聲明
例子:
C++
// C++ Program to show function that takes
// two integers as parameters and returns
// an integer
int max(int, int);
// A function that takes an int
// pointer and an int variable
// as parameters and returns
// a pointer of type int
int* swap(int*, int);
// A function that takes
// a char as parameter and
// returns a reference variable
char* call(char b);
// A function that takes a
// char and an int as parameters
// and returns an integer
int fun(char, int);
函數類型
C++ 中的函數類型
用戶定義函數
用戶定義函數是 user/customer-defined 專門定製的代碼塊,以降低大程序的複雜性。它們也被俗稱為“tailor-made函數” 的構建隻是為了滿足用戶麵臨問題的情況,同時降低整個程序的複雜性。
庫函數
庫函數也稱為“內置函數”。這些函數是已定義的編譯器包的一部分,由具有特殊和不同含義的特殊函數組成。內置函數為我們提供了一個優勢,因為我們可以直接使用它們而無需定義它們,而在用戶定義函數中我們必須在使用它們之前聲明並定義一個函數。
例如:sqrt()、setw()、strcat()等
參數傳遞給函數
傳遞給函數的參數被調用實際參數。例如,在下麵的程序中,5和10是實際參數。
函數接收到的參數被調用形式參數。例如,在上麵的程序中,x和y是形式參數。
形式參數和實際參數
有兩種最流行的參數傳遞方式:
- 按值傳遞:在這種參數傳遞方法中,實際參數的值被複製到函數的形式參數中。實際參數和形式參數存儲在不同的內存位置,因此函數中所做的任何更改都不會反映在調用者的實際參數中。
- 通過參考傳遞:實際參數和形式參數都引用相同的位置,因此函數內部所做的任何更改都會反映在調用者的實際參數中。
函數定義
按值傳遞用於未使用函數 fun() 修改 x 值的情況。
C++
// C++ Program to demonstrate function definition
#include <iostream>
using namespace std;
void fun(int x)
{
// definition of
// function
x = 30;
}
int main()
{
int x = 20;
fun(x);
cout << "x = " << x;
return 0;
}
x = 20
時間複雜度:O(1)
空間複雜度:O(1)
使用指針的函數
函數 fun() 需要一個指向整數(或整數的地址)的指針 ptr。它修改地址 ptr 處的值。解引用運算符*用於訪問地址處的值。在語句‘*ptr = 30’中,地址ptr處的值變為30。地址運算符&用於獲取任何數據類型的變量的地址。在函數調用語句‘fun(&x)’中,傳遞了x的地址,以便可以使用它的地址來修改x。
C++
// C++ Program to demonstrate working of
// function using pointers
#include <iostream>
using namespace std;
void fun(int* ptr) { *ptr = 30; }
int main()
{
int x = 20;
fun(&x);
cout << "x = " << x;
return 0;
}
x = 30
時間複雜度:O(1)
空間複雜度:O(1)
C++ 中按值調用和按引用調用的區別
按值調用 | 通過參考調用 |
---|---|
該值的副本被傳遞給函數 | 值的地址被傳遞給函數 |
函數內部所做的更改不會 反映在其他職能上 |
函數內部所做的更改會得到反映 也在函數之外 |
實際和正式的論點將在 不同的內存位置 |
實際和正式的論點將在 相同的內存位置。 |
關於 C++ 中的函數需要記住的要點
1. 大多數 C++ 程序都有一個名為 main() 的函數,當用戶運行程序時操作係統會調用該函數。
2.每個函數都有一個返回類型。如果函數不返回任何值,則使用 void 作為返回類型。此外,如果函數的返回類型是void,我們仍然可以在函數定義體中使用return語句,隻要不指定任何常量、變量等,隻需提及“return;”語句即可象征著函數的終止,如下圖:
C++
void function name(int a)
{
....... // Function Body
return; // Function execution would get terminated
}
3.要聲明一個隻能在沒有任何參數的情況下調用的函數,我們應該使用“無效的樂趣(無效)”。附帶說明一下,在 C++ 中,空列表意味著隻能在不帶任何參數的情況下調用函數。在 C++ 中,void fun() 和 void fun(void) 是相同的。
主函數
main函數是一個特殊函數。每個 C++ 程序都必須包含一個名為 main 的函數。它作為程序的入口點。計算機將從 main 函數的開頭開始運行代碼。
主要函數類型
1. 不帶參數:
CPP
// Without Parameters
int main() { ... return 0; }
2.帶參數:
CPP
// With Parameters
int main(int argc, char* const argv[]) { ... return 0; }
main函數有參數選項的原因是為了允許從命令行輸入。當您使用帶有參數的 main 函數時,它將程序名稱後麵的每組字符(以空格分隔)保存為名為的數組中的元素精液.
由於 main 函數的返回類型為int,程序員必須始終在代碼中包含 return 語句。返回的數字用於通知調用程序該程序的執行結果是什麽。返回 0 表示沒有問題。
C++ 遞歸
當函數在同一個函數內調用時,在 C++ 中稱為遞歸。調用同一個函數的函數稱為遞歸函數。
調用自身並且在函數調用後不執行任何任務的函數稱為尾遞歸。在尾遞歸中,我們通常使用 return 語句調用相同的函數。
用法:
C++
recursionfunction()
{
recursionfunction(); // calling self function
}
想了解更多請看本文.
C++ 將數組傳遞給函數
在 C++ 中,為了重用數組邏輯,我們可以創建一個函數。要將數組傳遞給 C++ 中的函數,我們隻需提供數組名稱。
function_name(array_name[]); //passing array to function
示例:打印給定數組中的最小數字。
C++
#include <iostream>
using namespace std;
void printMin(int arr[5]);
int main()
{
int ar[5] = { 30, 10, 20, 40, 50 };
printMin(ar); // passing array to function
}
void printMin(int arr[5])
{
int min = arr[0];
for (int i = 0; i < 5; i++) {
if (min > arr[i]) {
min = arr[i];
}
}
cout << "Minimum element is: " << min << "\n";
}
// Code submitted by Susobhan Akhuli
Minimum element is: 10
時間複雜度:O(n) 其中 n 是數組的大小
空間複雜度:O(n),其中 n 是數組的大小。
C++ 重載(函數)
如果我們創建兩個或多個具有相同名稱但參數數量或類型不同的成員,則稱為 C++ 重載。在C++中,我們可以重載:
- 方法,
- 構造函數和
- 索引屬性
C++ 中的重載類型有:
- 函數重載
- 運算符重載
C++ 函數重載
函數重載被定義為具有相同名稱但不同參數的兩個或多個函數的過程。在函數重載中,通過使用不同類型或數量的參數來重新定義函數。隻有通過這些差異,編譯器才能區分函數。
函數重載的優點是它增加了程序的可讀性,因為您不需要對同一操作使用不同的名稱。
示例:更改 add() 方法的參數數量
C++
// program of function overloading when number of arguments
// vary
#include <iostream>
using namespace std;
class Cal {
public:
static int add(int a, int b) { return a + b; }
static int add(int a, int b, int c)
{
return a + b + c;
}
};
int main(void)
{
Cal C; // class object declaration.
cout << C.add(10, 20) << endl;
cout << C.add(12, 20, 23);
return 0;
}
// Code Submitted By Susobhan Akhuli
30 55
時間複雜度:O(1)
空間複雜度:O(1)
示例:當參數類型不同時。
C++
// Program of function overloading with different types of
// arguments.
#include <iostream>
using namespace std;
int mul(int, int);
float mul(float, int);
int mul(int a, int b) { return a * b; }
float mul(double x, int y) { return x * y; }
int main()
{
int r1 = mul(6, 7);
float r2 = mul(0.2, 3);
cout << "r1 is : " << r1 << endl;
cout << "r2 is : " << r2 << endl;
return 0;
}
// Code Submitted By Susobhan Akhuli
r1 is : 42 r2 is : 0.6
時間複雜度:O(1)
空間複雜度:O(1)
函數重載和二義性
當編譯器無法決定在重載函數中調用哪個函數時,這種情況稱為函數重載歧義。
當編譯器顯示歧義錯誤時,編譯器不會運行該程序。
歧義的原因:
- 類型轉換。
- 具有默認參數的函數。
- 與pass-by-reference 一起使用。
類型轉換:-
C++
#include <iostream>
using namespace std;
void fun(int);
void fun(float);
void fun(int i) { cout << "Value of i is : " << i << endl; }
void fun(float j)
{
cout << "Value of j is : " << j << endl;
}
int main()
{
fun(12);
fun(1.2);
return 0;
}
// Code Submitted By Susobhan Akhuli
上麵的例子顯示了一個錯誤“重載的“fun(double)”的調用不明確”。 fun(10) 將調用第一個函數。 fun(1.2) 根據我們的預測調用第二個函數。但是,這並不像 C++ 中那樣引用任何函數,所有浮點常量都被視為 double 而不是 float。如果我們將 float 替換為 double,程序就可以運行。因此,這是從float到double的類型轉換。
帶默認參數的函數:-
C++
#include <iostream>
using namespace std;
void fun(int);
void fun(int, int);
void fun(int i) { cout << "Value of i is : " << i << endl; }
void fun(int a, int b = 9)
{
cout << "Value of a is : " << a << endl;
cout << "Value of b is : " << b << endl;
}
int main()
{
fun(12);
return 0;
}
// Code Submitted By Susobhan Akhuli
上麵的例子顯示了一個錯誤“重載的“fun(int)”的調用不明確”。 fun(int a, int b=9) 可以通過兩種方式調用:第一種是使用一個參數調用函數,即 fun(12),另一種方法是使用兩個參數調用函數,即 fun (4,5)。 fun(int i) 函數通過一個參數調用。因此,編譯器無法在 fun(int i) 和 fun(int a,int b=9) 之間進行選擇。
通過引用傳遞的函數:-
C++
#include <iostream>
using namespace std;
void fun(int);
void fun(int&);
int main()
{
int a = 10;
fun(a); // error, which fun()?
return 0;
}
void fun(int x) { cout << "Value of x is : " << x << endl; }
void fun(int& b)
{
cout << "Value of b is : " << b << endl;
}
// Code Submitted By Susobhan Akhuli
上麵的例子顯示了一個錯誤“重載的“fun(int&)”調用不明確”。第一個函數采用一個整數參數,第二個函數采用引用參數作為參數。在這種情況下,編譯器不知道用戶需要哪個函數,因為 fun(int) 和 fun(int &) 之間沒有語法差異。
好友函數
- 友元函數是 C++ 中的一種特殊函數,盡管它不是類的成員函數,但它具有訪問類的私有和受保護數據的特權。
- 友元函數是類的非成員函數或普通函數,在類內部使用關鍵字“friend”聲明。通過將函數聲明為友元,所有訪問權限都授予該函數。
- 關鍵字“friend”僅放置在函數聲明中,而不放置在函數定義中。
- 當調用友元函數時,既不使用對象名稱,也不使用點運算符。但是,它可以接受對象作為要訪問其值的參數。
- 友元函數可以在類的任何部分聲明,即公共、私有或受保護的。
C++中友元函數的聲明
用法:
class <class_name> {
friend <return_type> <function_name>(argument/s);
};
示例_1:使用 Friend 函數求兩個數中最大的一個
C++
#include <iostream>
using namespace std;
class Largest {
int a, b, m;
public:
void set_data();
friend void find_max(Largest);
};
void Largest::set_data()
{
cout << "Enter the first number : ";
cin >> a;
cout << "\nEnter the second number : ";
cin >> b;
}
void find_max(Largest t)
{
if (t.a > t.b)
t.m = t.a;
else
t.m = t.b;
cout << "\nLargest number is " << t.m;
}
int main()
{
Largest l;
l.set_data();
find_max(l);
return 0;
}
輸出
Enter the first number : 789
Enter the second number : 982
Largest number is 982
相關用法
- C++ 函數用法及代碼示例
- C++ Function Pointer用法及代碼示例
- C++ Function Overloading用法及代碼示例
- C++ Function Overriding用法及代碼示例
- C++ Forward_list forward_list()用法及代碼示例
- C++ Forward_list assign()用法及代碼示例
- C++ Forward_list before_begin()用法及代碼示例
- C++ Forward_list begin()用法及代碼示例
- C++ Forward_list cbefore_begin()用法及代碼示例
- C++ Forward_list cbegin()用法及代碼示例
- C++ Forward_list cend()用法及代碼示例
- C++ Forward_list clear()用法及代碼示例
- C++ Forward_list emplace_after()用法及代碼示例
- C++ Forward_list emplace_front()用法及代碼示例
- C++ Forward_list empty()用法及代碼示例
- C++ Forward_list end()用法及代碼示例
- C++ Forward_list erase_after()用法及代碼示例
- C++ Forward_list front()用法及代碼示例
- C++ Forward_list get_allocator()用法及代碼示例
- C++ Forward_list insert_after()用法及代碼示例
- C++ Forward_list max_size()用法及代碼示例
- C++ Forward_list merge()用法及代碼示例
- C++ Forward_list pop_front()用法及代碼示例
- C++ Forward_list push_front()用法及代碼示例
- C++ Forward_list remove()用法及代碼示例
注:本文由純淨天空篩選整理自佚名大神的英文原創作品 Functions in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。