C ++の基本(2)関数の高度な使用法

関数のデフォルトパラメータ

関数の仮パラメーターリストの仮パラメーターは、デフォルト値を使用できます。
使用法:戻り値タイプ関数名(パラメータータイプパラメーター名=デフォルト値){}
例を次に示します。

int demo(int a = 1, int b = 2) 
{
    
    
	return a + b;
}
int c = demo();
cout << "c = " << c << endl;

出力:

c = 3

関数を呼び出して関連する変数の値を指定すると、指定した値がデフォルト値の代わりに関数で使用されます。関連する値が指定されていない場合、関数を呼び出すときにデフォルト値が使用されます。栗は次のとおりです。

int demo(int a = 1, int b = 2) 
{
    
    
	return a + b;
}
int a = 10;
int b = 20;
int c = demo(a, b);
cout << "c = " << c << endl;
int d = 30;
int e = demo(a = d);
cout << "c = " << e << endl;
c = 30
c = 32

関数のプレースホルダーパラメーター

関数の正式なパラメーターリストでは、プレースホルダーパラメーターを設定してプレースホルダーを作成できますが、関数を呼び出すときにプレースホルダーを補足する必要があります。プレースホルダーパラメーターには、デフォルトのパラメーターを含めることもできます。
構文:戻り値タイプ関数名(データタイプ){}
例:

int demo03(int a, int)
{
    
    
	return a;
}
int a = 10;
int b = 20;
int e = demo03(a, b);
cout << "c = " << e << endl;

出力は次のとおりです。

c = 10

位置にすでにデフォルトパラメータがある場合、この位置から開始して、この位置およびこの位置の右側にあるすべての変数にデフォルト値を設定する必要があります

int demo(int a = 1, int b = 2, int c) //这种语法即为错误使用,此时会报错默认实参不在形参列表的结尾
int demo(int a = 1, int b = 2, int c = 3)//此为正确语法

関数の宣言と実装には、デフォルトのパラメーターを1つだけ含めることができ、両方を含めることはできません。

int demo01(int a = 1, int b = 2); // 函数的声明

int demo01(int a = 1, int b = 2) //函数的实现。 此时会报错,“demo01”: 重定义默认参数
{
    
    
	return a + b;
}

関数のオーバーロード

関数のオーバーロードには、次の3つの条件を満たす必要があり
ます。1。同じスコープ内;
2。関数名が同じ;
3。関数パラメーターのタイプまたは番号が異なるか、順序が異なる。
関数:関数名は同じにすることができ、再利用性が向上します。
次のように栗を取ります:

#include<iostream>
using namespace std;
//1、两个example函数都在全局作用域下
//2、两个example函数的名称相同
//3、两个example函数的参数的个数不同
void example() 
{
    
    
	cout << "这是一个例子" << endl;
}


void example(int a)
{
    
    
	cout << "这是另外一个栗子" << a << endl;
}

int main() {
    
    

	example();

	system("pause");
	return 0;
}

出力は

这是一个例子

上記の2つの例の関数のスコープは、条件1を満たすグローバルスコープにあります。
上記の2つの例の関数の関数名は同じであり、条件2を満たします。
上記の2つの例の関数のパラメーターの数は異なります。これは条件3を満たします
。3つの条件すべてが満たされるため、上記の2つの関数は関数のオーバーロードに属します。main関数で関数を呼び出す場合、関数のパラメーターの数、またはパラメーターのタイプまたは順序によって、呼び出す関数を決定できます。
関数の戻り値は異なり、関数の再利用の条件として使用することはできません。
例:

void example(int a)
{
    
    
	cout << "这是另外一个栗子" << a << endl;
}


int example(int a)
{
    
    
	cout << "这是另外一个栗子" << a << endl;
}

この時点でエラーが報告されます。

无法重载仅按返回类型区分的函数

その理由は、上記の2つの関数を呼び出すと、どちらの関数を呼び出すかを戻り値で区別できないためです。これによりエラーが発生します。

関数のオーバーロードに関する注意

1.関数のオーバーロードの条件としての参照

#include<iostream>
using namespace std;

void example(int &a) 
{
    
    
	cout << "这是一个栗子" << a << endl;
}

void example(const int &a)
{
    
    
	cout << "const 这是一个栗子" << a << endl;
}


int main() {
    
    

	//调用第一个函数
	int a = 10;
	example(a);
	//调用第二个函数
	example(10);

	system("pause");
	return 0;

オーバーロードできる2つの関数を次に示します。最初の関数を呼び出すときに、読み取りと書き込みが可能な変数aを入力しますが、constは書き込み操作を制限し、変数の読み取りのみを実行できます。したがって、最初の関数が呼び出されます。定数を入力すると、それは正当なメモリスペースではないため(スタックまたはヒープ領域ではなく定数領域にある)、参照によって呼び出すこともできません。これが理由です。最初の関数を呼び出すことはできません。constで参照を変更すると、2番目の関数のパラメーターはconst int&a=10になります。つまり、定数参照
になるため、2番目の関数が呼び出されます。
2.関数のオーバーロードにより、デフォルトのパラメーターが発生します。
最初に栗を取り上げましょう。

void example01(int a, int b = 1)
{
    
    
	cout << "const 这是一个栗子" << a << endl;
}


void example01(int a)
{
    
    
	cout << "const 这是一个栗子" << a << endl;
}

int a = 10;
int b = 20;
example01(a);//此时会报错:有多个 重载函数 "example01" 实例与参数列表匹配
example01(a, b);//这时候就不会报错了

この時点でエラーが報告されます。


主な理由は、関数にデフォルトパラメータがある場合、デフォルトパラメータの実際のパラメータを渡さずにこの関数を呼び出すことができるためです。デフォルトの引数が渡されない場合、コンパイラはどの関数を呼び出すかを認識しません。このオーバーロードされた関数を呼び出すときにデフォルトパラメータの値を指定することで、この問題を解決できます。

おすすめ

転載: blog.csdn.net/qq_52302919/article/details/123739362