関数#カンスウ#
関数はC/C++や他の高度なプログラミング言語で最も重要な概念の一つと言えるでしょう.関数に関連するのは、一般関数、インライン関数、静的メンバー関数、クラスのメンバー関数、テンプレート関数、関数ポインタ、関数呼び出し、友元関数、関数の宣言、関数の定義、パラメータ、実パラメータ、関数のリロード・・・を1つずつ含めましょう.
1 . 一般関数
一般的な関数は、一般に、いくつかの式または機能を実現するためにカプセル化されたコードにすぎない.関数で伝達されるタイプパラメータを形パラメータと呼び,伝達される実際の値を実パラメータと呼び,形パラメータの有無,戻りのタイプを戻りタイプと呼び,戻りのタイプがなければvoidと書く.
ある数学式またはある機能を実現するために作成された4つの簡単な一般関数.
2 . インライン関数
関数の前に「inline」のキーワードを付けると、インライン関数になります.しかし、私たちはなぜある関数の前にインライン関数を付けるのでしょうか.ある関数は加算に適していませんか?
関数が実行されると、通常の関数の呼び出しが別のアドレス(関数のアドレス)にジャンプし、関数の実行が終了すると戻ります.このような関数のジャンプには一定のオーバーヘッドがあり、inline関数は別の選択肢を提供します.インライン関数を呼び出すと、コンパイラは関数のコードを関数呼び出しに置き換えます.そのため、インライン関数は往復ジャンプする必要はありません.そのため、インライン関数は一般的に通常の関数よりも高速ですが、より多くのメモリスペースを消費する必要があります.
関数では、呼び出しメカニズムを処理する時間よりも実行時間が長い場合、関数にinlineキーワードを追加すると、節約時間も限られているだけで、コードの複数の場所で1つの関数の呼び出しのコピーが多く、メモリのオーバーヘッドが大きすぎる可能性があります.実行時間が処理バー用メカニズムよりも短い場合、私たちが節約した時間は呼び出しを処理する時間であり、inline関数を加えると確かに有効です.
このような関数体内にはSleepの遅延関数があり,whileサイクル体内の実行過程を少なくとも1000 s長くしたため,inline関数はここでは非常に限られているように見える.
3 . 静的メンバー関数とグローバル関数
1つのクラスでは、関数の前にstaticを付けると、この関数が静的メンバー関数になります.このような関数があり、非静的なメンバー変数を変更したりアクセスしたりしない場合は、この関数は静的なメンバー関数として宣言されたほうがいいです.ただし、外部アクセスの場合は、クラスのオブジェクトではなく、クラス名+役割ドメインオペレータでアクセスします.
関数の前にstatic修飾子が付いているが、関数がクラスに入っていない場合、この関数はグローバルな関数です.
4 . クラスのメンバー関数(これは後で議論します)
5 . 関数テンプレートテンプレートテンプレートはテンプレートです.フレームワークを組んで、カバーします.たとえば、計算機を開発する計画があるという問題があります.計算機には+-*/4則演算があることは明らかです.加算機能を完了する必要がありますが、データには整数型、浮動小数点型などがあります.私たちはこのように書くことができます.
はるかに未完で,続きを待つ.
1 . 一般関数
一般的な関数は、一般に、いくつかの式または機能を実現するためにカプセル化されたコードにすぎない.関数で伝達されるタイプパラメータを形パラメータと呼び,伝達される実際の値を実パラメータと呼び,形パラメータの有無,戻りのタイプを戻りタイプと呼び,戻りのタイプがなければvoidと書く.
// ( , )
void Function1() {
std::cout << "Hello World" << std::endl;
}
// ( , )
void Funtion2(size_t Counts) {
for (size_t i = 0; i < Counts; i++)
std::cout << "Hello World" << std::endl;
}
// ( , )
int Funtion3(size_t Counts){
return std::pow(Counts, 2);
}
// ( , )
int Funtion4() {
int sum = 0;
for (size_t i = 1; i <= 100; i++){
sum += i;
}
return sum;
}
ある数学式またはある機能を実現するために作成された4つの簡単な一般関数.
2 . インライン関数
関数の前に「inline」のキーワードを付けると、インライン関数になります.しかし、私たちはなぜある関数の前にインライン関数を付けるのでしょうか.ある関数は加算に適していませんか?
関数が実行されると、通常の関数の呼び出しが別のアドレス(関数のアドレス)にジャンプし、関数の実行が終了すると戻ります.このような関数のジャンプには一定のオーバーヘッドがあり、inline関数は別の選択肢を提供します.インライン関数を呼び出すと、コンパイラは関数のコードを関数呼び出しに置き換えます.そのため、インライン関数は往復ジャンプする必要はありません.そのため、インライン関数は一般的に通常の関数よりも高速ですが、より多くのメモリスペースを消費する必要があります.
関数では、呼び出しメカニズムを処理する時間よりも実行時間が長い場合、関数にinlineキーワードを追加すると、節約時間も限られているだけで、コードの複数の場所で1つの関数の呼び出しのコピーが多く、メモリのオーバーヘッドが大きすぎる可能性があります.実行時間が処理バー用メカニズムよりも短い場合、私たちが節約した時間は呼び出しを処理する時間であり、inline関数を加えると確かに有効です.
//
inline void Function4() {
int sum = 0;
for (size_t i = 0; i < 1000; i++) {
sum += i;
}
}
現代のコンピュータにとって、浮動小数点型計算は非常に速く、Function 4は主に1000以内の和を求め、マイクロ秒の間で完成することができます.したがって,関数の実行にかかる時間の大部分は関数の呼び出しメカニズムから来ており,この関数にinlineを追加するのは合理的である.しかし、次のように見えます.void Function5() {
int sum = 0;
while (sum<1000)
{
sum++;
Sleep(1000);
}
}
このような関数体内にはSleepの遅延関数があり,whileサイクル体内の実行過程を少なくとも1000 s長くしたため,inline関数はここでは非常に限られているように見える.
3 . 静的メンバー関数とグローバル関数
1つのクラスでは、関数の前にstaticを付けると、この関数が静的メンバー関数になります.このような関数があり、非静的なメンバー変数を変更したりアクセスしたりしない場合は、この関数は静的なメンバー関数として宣言されたほうがいいです.ただし、外部アクセスの場合は、クラスのオブジェクトではなく、クラス名+役割ドメインオペレータでアクセスします.
関数の前にstatic修飾子が付いているが、関数がクラスに入っていない場合、この関数はグローバルな関数です.
4 . クラスのメンバー関数(これは後で議論します)
5 . 関数テンプレートテンプレートテンプレートはテンプレートです.フレームワークを組んで、カバーします.たとえば、計算機を開発する計画があるという問題があります.計算機には+-*/4則演算があることは明らかです.加算機能を完了する必要がありますが、データには整数型、浮動小数点型などがあります.私たちはこのように書くことができます.
int sum(int a, int b) {
return a + b;
}
double sum(double a, double b) {
return a + b;
}
long sum(long a, long b) {
return a + b;
}
// ···
上の関数を見てみると、あまり差がないように見えますが、以上のプログラムの代わりに共通のプログラムを書いてもらえませんか.すると、テンプレート関数が表示されます.template
T sum(T a, T b) {
return a + b;
}
はるかに未完で,続きを待つ.