C++ の関数

C++ の関数

関数は、入力を受け取り、特定の計算を実行する一連のステートメントです。 そして出力を生成します。アイデアは、いくつかを共通または繰り返し配置することです 一緒にタスクを完了して、 関数 これにより、異なる入力に対して同じコードを何度も記述する代わりに、この関数を呼び出すことができます。
簡単に言えば、関数は呼び出されたときにのみ実行されるコードのブロックです。

構文:

関数の構文

関数の構文

例:

C++




// C++ Program to demonstrate working of a function> #include> 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>や)>> > 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 

時間計算量: ○(1)

空間の複雑さ: ○(1)

なぜ関数が必要なのでしょうか?

  • 関数は私たちを助けます コードの冗長性を減らす 。ソフトウェア内の複数の場所で機能が実行される場合、同じコードを何度も書くのではなく、関数を作成し、それをあらゆる場所で呼び出します。これは、将来機能に変更を加える場合に 1 か所だけを変更するだけで済むため、メンテナンスにも役立ちます。
  • 関数がコードを作成する モジュラー 。多くのコード行が含まれる大きなファイルを考えてみましょう。コードを関数に分割すると、コードを読んだり使用したりするのが非常に簡単になります。
  • 提供する機能 抽象化 。たとえば、内部の動作を気にせずにライブラリ関数を使用できます。

関数の宣言

関数宣言は、パラメーターの数、パラメーターのデータ型、関数の戻り値の型をコンパイラーに伝えます。関数宣言でのパラメータ名の記述はオプションですが、定義にはパラメータ名を含める必要があります。以下に関数宣言の例を示します。 (パラメータ名は以下の宣言には存在しません)

C++ での関数宣言

関数の宣言

例:

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++ の関数の種類

C++ の関数の種類

ユーザー定義関数

ユーザー定義関数は、大規模なプログラムの複雑さを軽減するために特別にカスタマイズされたユーザー/顧客定義のコード ブロックです。それらは一般に次のようにも知られています カスタマイズされた機能 これらは、プログラム全体の複雑さを軽減しながら、ユーザーが問題に直面している条件を満たすためだけに構築されています。

ライブラリ関数

ライブラリ関数も呼び出されます 組み込み関数 。これらの関数は、すでに定義されているコンパイラ パッケージの一部であり、特別な異なる意味を持つ特別な関数で構成されています。組み込み関数では、関数を定義せずに直接使用できるため、利点が得られます。一方、ユーザー定義関数では、関数を使用する前に関数を宣言して定義する必要があります。
例えば: sqrt()、setw()、strcat()など。

関数に渡すパラメータ

関数に渡されるパラメータは次のように呼ばれます。 実際のパラメータ 。たとえば、以下のプログラムでは、5 と 10 が実際のパラメータです。
関数で受け取ったパラメータは次のように呼ばれます。 仮パラメータ 。たとえば、上記のプログラムでは、x と y は仮パラメータです。

C++の仮パラメータと実パラメータ

仮パラメータと実パラメータ

パラメータを渡す最も一般的な方法は 2 つあります。

  1. 値渡し: このパラメータ渡しメソッドでは、実パラメータの値が関数の仮パラメータにコピーされます。実際のパラメータと仮パラメータは異なるメモリ場所に格納されるため、関数内で行われた変更は呼び出し元の実際のパラメータには反映されません。
  2. 参照渡し: 実パラメータと仮パラメータはどちらも同じ場所を参照するため、関数内で行われた変更は呼び出し元の実パラメータに反映されます。

関数の定義

値渡し x の値が関数 fun() を使用して変更されない場合に使用されます。

C++




// C++ Program to demonstrate function definition> #include> 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 

時間計算量: ○(1)

空間の複雑さ: ○(1)

ポインタを使用した関数

関数 fun() は、整数 (または整数のアドレス) へのポインター ptr を期待します。アドレス ptr の値を変更します。逆参照演算子 * アドレスの値にアクセスするために使用されます。ステートメント「*ptr = 30」では、アドレス ptr の値が 30 に変更されます。アドレス演算子 & は、任意のデータ型の変数のアドレスを取得するために使用されます。関数呼び出しステートメント「fun(&x)」では、x のアドレスが渡されるため、そのアドレスを使用して x を変更できます。

C++




// C++ Program to demonstrate working of> // function using pointers> #include> using> namespace> std;> void> fun(> int> * ptr) { *ptr = 30; }> int> main()> {> > int> x = 20;> > fun(&x);> > cout < <> 'x = '> < < x;> > return> 0;> }>

出力

x = 30 

時間計算量: ○(1)

空間の複雑さ: ○(1)

C++ における値による呼び出しと参照による呼び出しの違い

値による呼び出し 参照による呼び出し
値のコピーが関数に渡されます。 value のアドレスが関数に渡されます
関数内で行われた変更は、
他の機能にも反映される
関数内での変更が反映される
機能外でも
実際の引数と形式的な引数は次の場所で作成されます。
異なる記憶場所
実際の引数と形式的な引数は次の場所で作成されます。
同じ記憶場所。

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関数の戻り値の型は次のとおりです。 整数 、プログラマはコード内に常に return ステートメントを含める必要があります。返された数値は、プログラムの実行結果を呼び出し側プログラムに通知するために使用されます。 0 を返すと、問題がなかったことを示します。

C++ 再帰

同じ関数内で関数が呼び出される場合、C++ では再帰と呼ばれます。同じ関数を呼び出す関数を再帰関数といいます。
関数自体を呼び出し、関数呼び出し後にタスクを実行しない関数は、末尾再帰として知られています。末尾再帰では、通常、return ステートメントで同じ関数を呼び出します。
構文:

C++




recursionfunction()> {> > recursionfunction();> // calling self function> }>

さらに詳しく知りたい場合は、を参照してください この記事

C++ 配列を関数に渡す

C++ では、配列ロジックを再利用するために関数を作成できます。 C++ で配列を関数に渡すには、配列名のみを指定する必要があります。

function_name(array_name[]);   //passing array to function 

例: 指定された配列内の最小数を出力します。

C++




#include> 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>到着[i]) {>> > min = arr[i];> > }> > }> > cout < <> 'Minimum element is: '> < < min < <> ' '> ;> }> // Code submitted by Susobhan Akhuli>

出力

Minimum element is: 10 

時間計算量: O(n) (n は配列のサイズ)
空間の複雑さ: O(n) ここで、n は配列のサイズです。

C++ オーバーロード (関数)

同じ名前を持つがパラメーターの数またはタイプが異なる 2 つ以上のメンバーを作成する場合、これは C++ オーバーロードとして知られています。 C++ では、以下をオーバーロードできます。

  • メソッド、
  • コンストラクターと
  • インデックス付きプロパティ

C++ におけるオーバーロードの種類は次のとおりです。

  • 関数のオーバーロード
  • 演算子のオーバーロード

C++ 関数のオーバーロード

関数のオーバーロードは、名前は同じだがパラメーターが異なる 2 つ以上の関数を持つプロセスとして定義されます。関数のオーバーロードでは、異なる型または引数の数を使用して関数が再定義されます。コンパイラはこれらの違いによってのみ関数を区別できます。
関数のオーバーロードの利点は、同じアクションに異なる名前を使用する必要がないため、プログラムの可読性が向上することです。

例: add()メソッドの引数の数を変更する

C++




// program of function overloading when number of arguments> // vary> #include> 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 

時間計算量: ○(1)
空間の複雑さ: ○(1)

例: 引数の型が異なる場合。

C++




// Program of function overloading with different types of> // arguments.> #include> 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 

時間計算量: ○(1)
空間の複雑さ: ○(1)

関数の多重定義とあいまいさ

コンパイラがオーバーロードされた関数の中からどの関数を呼び出すかを決定できない場合、この状況は次のように呼ばれます。 関数のオーバーロードの曖昧さ。
コンパイラがあいまい性エラーを示した場合、コンパイラはプログラムを実行しません。

曖昧さの原因:

  • 型変換。
  • デフォルトの引数を持つ関数。
  • 参照渡しを使用する関数。

型変換:-

C++




#include> 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) は、予測に従って 2 番目の関数を呼び出します。ただし、これは C++ のように関数を参照するわけではなく、すべての浮動小数点定数は float ではなく double として扱われます。 float を double に置き換えると、プログラムは動作します。したがって、これは float から double への型変換です。

デフォルトの引数を持つ関数:-

C++




#include> 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) は 2 つの方法で呼び出すことができます。1 つは 1 つの引数を指定して関数を呼び出す方法、つまり fun(12) で、もう 1 つの方法は 2 つの引数を指定して関数を呼び出す方法、つまり fun(4) ,5)。 fun(int i) 関数は 1 つの引数を指定して呼び出されます。したがって、コンパイラは fun(int i) と fun(int a,int b=9) のどちらかを選択できませんでした。

参照渡しを使用した関数:-

C++




#include> 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&)」の呼び出しがあいまいです 。最初の関数は 1 つの整数引数を受け取り、2 番目の関数は参照パラメーターを引数として受け取ります。この場合、fun(int) と fun(int &) の間に構文上の違いがないため、コンパイラはユーザーがどの関数を必要とするかを知りません。

フレンド機能

  • フレンド関数は、クラスのメンバー関数ではないにもかかわらず、クラスのプライベート データや保護されたデータにアクセスする特権を持つ C++ の特別な関数です。
  • friends 関数は、クラスの非メンバー関数または通常の関数であり、クラス内でキーワード friends を使用して宣言されます。関数をフレンドとして宣言すると、その関数にすべてのアクセス権限が与えられます。
  • キーワード friends は関数宣言にのみ配置され、関数定義には配置されません。
  • friends 関数が呼び出されるとき、オブジェクトの名前もドット演算子も使用されません。ただし、アクセスしたい値を持つオブジェクトを引数として受け入れる場合があります。
  • フレンド関数は、クラスの任意のセクション (public、private、または protected) で宣言できます。

C++でのフレンド関数の宣言

構文:

class {   friend (argument/s); }; 

例 1: Friend 関数を使用して 2 つの数値の最大値を求める

C++




#include> 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>> ;>> > cout < <> ' Enter 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 < <> ' Largest 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