C++ の関数にデフォルトパラメータを使用する
胡金庫
2023年10月12日
![C++ の関数にデフォルトパラメータを使用する](/img/Cpp/feature-image---default-parameters-in-cpp.webp)
この記事では、C++ の関数にデフォルトのパラメーターを使用する方法のいくつかの方法について説明します。
C++ でデフォルトパラメータを使用して関数を定義する
デフォルトパラメータの概念により、ユーザーがその場所に引数を渡さない場合に使用される関数定義でデフォルトの引数値を指定することができます。したがって、関数はオプションの引数を持つことができ、関数ブロック中にいくつかのオブジェクトを初期化するために内部的にいくつかのデフォルト値を使用する場合があります。デフォルトのパラメーターは、=
記号と対応する値を使用して、各引数名の後に関数プロトタイプで指定されます。たとえば、次のコードスニペットは、最大 4つの数値を合計できる sumNumbers
関数テンプレートを実装しています。それでも、ユーザーは 4つの値すべてを指定する必要はありません。それどころか、操作には 2つの整数だけで十分です。
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
template <typename T>
T sumNumbers(T x, T y, T z = 0, T w = 0) {
return (x + y + z + w);
}
int main() {
vector<int> vec = {1, 4, 8, 16, 20, 24, 28, 32};
for (size_t i = 0; i < vec.size(); ++i) {
cout << sumNumbers(vec[i], vec[i + 1]) << ": ";
}
cout << endl;
for (size_t i = 0; i < vec.size(); ++i) {
cout << sumNumbers(vec[i], vec[i + 1], vec[i + 2]) << ": ";
}
cout << endl;
for (size_t i = 0; i < vec.size(); ++i) {
cout << sumNumbers(vec[i], vec[i + 1], vec[i + 2], vec[i + 3]) << ": ";
}
cout << endl;
return EXIT_SUCCESS;
}
出力:
5: 12: 24: 36: 44: 52: 60: 32
13: 28: 44: 60: 72: 84: 60: 32:
29: 48: 68: 88: 104: 84: 60: 4145:
C++ でデフォルトパラメータを使用してクラスコンストラクタを実装する
デフォルトパラメータの概念を利用できるもう 1つの便利なシナリオは、クラスコンストラクタです。ユーザーが引数を指定しない場合、クラスコンストラクターが一部のデータメンバーをデフォルト値で初期化する必要がある場合があります。次のサンプルコードに示すように、デフォルトのパラメーターを使用してコンストラクターを実装できます。これにより、デフォルトの値を使用して別のコンストラクターが呼び出されます。
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
class MyClass {
string name;
int height;
int width;
public:
MyClass(string s, int h, int w) : name(std::move(s)), height(h), width(w) {}
MyClass() : MyClass("", 0, 0) {}
explicit MyClass(string s) : MyClass(std::move(s), 0, 0) {}
void printMyClass() {
cout << "name: " << name << endl
<< "height: " << height << endl
<< "width: " << width << endl;
}
};
int main() {
MyClass M1;
MyClass M2("Jay", 12, 103);
M1.printMyClass();
cout << endl;
M2.printMyClass();
return EXIT_SUCCESS;
}
出力:
name:
height: 0
width: 0
name: Jay
height: 12
width: 103
著者: 胡金庫