1.機能
1.1 概要
機能:頻繁に使用されるコードをカプセル化して、コードの繰り返しを減らします。より大きなプログラムは通常、いくつかのプログラム ブロックに分割され、各モジュールが特定の機能を実装します。
1.2 関数の定義
関数の定義は通常、次の 5 つのステップで構成されます。
1. 戻り値の型
2. 関数名
3. パラメーター リスト
4. 関数本体のステートメント
5. 戻り値の式
文法:
返回值类型 函数名 (参数列表)
{
函数体语句
return 表达式
}
- 戻り値の型: 関数は値を返すことができます。関数定義内で
- 関数名: 関数に名前を付けます
- パラメータリスト: この関数を使用する場合、渡されるデータは
- 関数本体のステートメント: 中括弧内のコード、関数内で実行する必要があるステートメント
- return 式: 戻り値の型にリンクされ、関数が実行された後、対応するデータが返されます。
例: 2 つの数値を加算する加算関数を定義します。
//函数定义
int add(int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
1.3 関数呼び出し
関数:定義された関数を使用します
文法: 函数名(参数)
例:
#include<iostream>
using namespace std;
//函数定义
int add(int num1, int num2) //定义中的num1,num2称为形式参数,简称形参
{
int sum = num1 + num2;
return sum;
}
int main() {
int a = 10;
int b = 10;
//调用add函数
int sum = add(a, b);//调用时的a,b称为实际参数,简称实参
cout << "sum = " << sum << endl;
a = 100;
b = 100;
sum = add(a, b);
cout << "sum = " << sum << endl;
return 0;
}
概要: 関数定義内の括弧は仮パラメータと呼ばれ、関数の呼び出し時に渡されるパラメータは実パラメータと呼ばれます。
1.4 値渡し
- いわゆる値渡しとは、関数が呼び出されたときに、実パラメータが値を仮パラメータに渡すことを意味します。
- 値が渡されると、仮パラメータが発生しても、実パラメータには影響しません。
例:
#include<iostream>
using namespace std;
void swap(int num1, int num2)
{
cout << "交换前:" << endl;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
int temp = num1;
num1 = num2;
num2 = temp;
cout << "交换后:" << endl;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
//return ; 当函数声明时候,不需要返回值,可以不写return
}
int main() {
int a = 10;
int b = 20;
swap(a, b);
cout << "mian中的 a = " << a << endl;
cout << "mian中的 b = " << b << endl;
return 0;
}
概要: 値で渡す場合、仮パラメータは実際のパラメータを変更できません
1.5 関数の一般的なスタイル
一般的な関数スタイルは 4 つあります。
- 返品不可
- 参加してもリターンなし
- 参加せずに返却
- 参加して帰る
例:
#include<iostream>
using namespace std;
//函数常见样式
//1、 无参无返
void test01()
{
//void a = 10; //无类型不可以创建变量,原因无法分配内存
cout << "this is test01" << endl;
//test01(); 函数调用
}
//2、 有参无返
void test02(int a)
{
cout << "this is test02" << endl;
cout << "a = " << a << endl;
}
//3、无参有返
int test03()
{
cout << "this is test03 " << endl;
return 10;
}
//4、有参有返
int test04(int a, int b)
{
cout << "this is test04 " << endl;
int sum = a + b;
return sum;
}
1.6 関数の宣言
関数:関数の名前と関数の呼び出し方法をコンパイラーに指示します。関数の実際の本体は個別に定義できます。関数は複数回宣言できますが、関数を定義できるのは 1 回だけです
例:
#include<iostream>
using namespace std;
//声明可以多次,定义只能一次
//声明
int max(int a, int b);
int max(int a, int b);
//定义
int max(int a, int b)
{
return a > b ? a : b;
}
int main() {
int a = 100;
int b = 200;
cout << max(a, b) << endl;
return 0;
}
1.7 関数を別のファイルに記述する
機能:コード構造を明確にする
関数ファイルを作成するには通常 4 つの手順があります
- 拡張子 .h が付いたヘッダー ファイルを作成します。
- 拡張子が .cpp のソース ファイルを作成します。
- ヘッダファイルに関数宣言を記述する
- 関数の定義をソースファイルに書き込む
例:
//swap.h文件
#include<iostream>
using namespace std;
//实现两个数字交换的函数声明
void swap(int a, int b);
//swap.cpp文件
#include "swap.h"
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
//main函数文件
#include "swap.h"
int main() {
int a = 100;
int b = 200;
swap(a, b);
return 0;
}
2.機能改善
2.1 関数のデフォルトパラメータ
C++ では、関数の仮パラメータ リスト内の仮パラメータにデフォルト値を設定できます。
文法: 返回值类型 函数名 (参数= 默认值){}
例:
#include<iostream>
using namespace std;
int func(int a, int b = 10, int c = 10) {
return a + b + c;
}
//1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
//2. 如果函数声明有默认值,函数实现的时候就不能有默认参数
int func2(int a = 10, int b = 10);
int func2(int a, int b) {
return a + b;
}
int main() {
cout << "ret = " << func(20, 20) << endl;
cout << "ret = " << func(100) << endl;
return 0;
}
2.2 関数のプレースホルダパラメータ
C++ の関数の仮パラメータ リストには、プレースホルダとして使用されるプレースホルダ パラメータが存在する場合があり、関数が呼び出されるときにその場所を埋める必要があります。
文法: 返回值类型 函数名 (数据类型){}
例:
#include<iostream>
using namespace std;
//函数占位参数 ,占位参数也可以有默认参数
void func(int a, int) {
cout << "this is func" << endl;
}
int main() {
func(10,10); //占位参数必须填补
return 0;
}
2.3 関数のオーバーロード
関数:関数名は同じにすることができ、再利用性が向上します。
関数のオーバーロードは次の条件を満たします。
- 同じ範囲内で
- 同じ関数名
- 関数パラメータのタイプ、数値、順序が異なります。
注:関数の戻り値を関数のオーバーロードの条件として使用することはできません。
例:
#include<iostream>
using namespace std;
//函数重载需要函数都在同一个作用域下
void func()
{
cout << "func 的调用!" << endl;
}
void func(int a)
{
cout << "func (int a) 的调用!" << endl;
}
void func(double a)
{
cout << "func (double a)的调用!" << endl;
}
void func(int a ,double b)
{
cout << "func (int a ,double b) 的调用!" << endl;
}
void func(double a ,int b)
{
cout << "func (double a ,int b)的调用!" << endl;
}
//函数返回值不可以作为函数重载条件
//int func(double a, int b)
//{
// cout << "func (double a ,int b)的调用!" << endl;
//}
int main() {
func();
func(10);
func(3.14);
func(10,3.14);
func(3.14 , 10);
return 0;
}
知らせ:
- 過負荷条件としての参照
- 関数のオーバーロードで関数のデフォルト パラメーターが発生する
例:
#include<iostream>
using namespace std;
//函数重载注意事项
//1、引用作为重载条件
void func(int &a)
{
cout << "func (int &a) 调用 " << endl;
}
void func(const int &a)
{
cout << "func (const int &a) 调用 " << endl;
}
//2、函数重载碰到函数默认参数
void func2(int a, int b = 10)
{
cout << "func2(int a, int b = 10) 调用" << endl;
}
void func2(int a)
{
cout << "func2(int a) 调用" << endl;
}
int main() {
int a = 10;
func(a); //调用无const
func(10);//调用有const
//func2(10); //碰到默认参数产生歧义,需要避免
return 0;
}