C++ でのデフォルト パラメータの再定義

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. 関数宣言 で引数を指定して、C++ でのデフォルト パラメータ エラーの再定義を処理する
  2. Function Definition で引数を指定して、C++ でのデフォルト パラメータ エラーの再定義を処理する
C++ でのデフォルト パラメータの再定義

このチュートリアルでは、C++ で デフォルト パラメーター エラーの再定義を処理する方法を学習します。 C++ の既定の引数は、重複のため、メソッドまたは関数の宣言または定義のいずれかで指定する必要がありますが、両方で指定することはできません。

関数宣言 で引数を指定して、C++ でのデフォルト パラメータ エラーの再定義を処理する

デフォルト パラメーター エラーの再定義の原因は、親ファイルから毎回呼び出されるヘッダー ファイルでの再定義であり、関数またはメソッドを複数回再定義することになります。

ただし、非テンプレート関数 (またはメソッド) の同じスコープ内の関数 (またはメソッド) の後の宣言で、既定の引数を追加できます。 宣言には、異なるスコープで完全に異なるデフォルト引数のセットがあります。

既定の引数を持つパラメーターの後の各パラメーターには、指定された関数宣言内の既定の引数、前の宣言、または関数パラメーター パックが指定されている必要があります。 デフォルトパラメータの再定義エラーは、宣言だけでなく定義(実装)でもデフォルトパラメータを設定すると発生します。

コード例:

#include <iostream>

// to process variables whenever called
void print(int x, int y) {
  std::cout << "x: " << x << '\n';  // x output
  std::cout << "y: " << y << '\n';  // y output
}

int main() {
  // function declaration
  void print(int x, int y = 3);

  print(7, 4);  // in this case, `y` is user-defined variable hence default
                // argument will be neglected
  print(6);  // in this case, `y` has no user-defined value hence, it will use
             // default argument
}

出力:

x: 7
y: 4
x: 6
y: 3

関数 (またはメソッド) に複数のパラメーターがある場合、デフォルトのパラメーターは、void my_function (int a, char b); のように、デフォルト以外のすべてのパラメーターの後にリストする必要があります。

C++ では、デフォルトの引数がブール型パラメーターのターピットを直接引き起こすことはありませんが、これらの引数は有害な影響を悪化させ、その結果、ブール型ターピットの処理が非常に複雑になります。

Function Definition で引数を指定して、C++ でのデフォルト パラメータ エラーの再定義を処理する

関数呼び出しは、関数パラメーターのいずれかにデフォルトの引数がある場合、呼び出し元から任意の関数パラメーターの引数を取得できます。呼び出し元が引数を提供しない場合は、その特定のパラメーターのデフォルト引数の値が代わりに使用されます。 . 一度宣言すると、デフォルト引数は重複のため再宣言できません。つまり、デフォルト引数は関数定義で宣言できます。

デフォルト パラメーターの前方宣言は、関数定義で宣言する代わりにデフォルト引数を宣言するベスト プラクティスの 1つです。

コード例:

#include <iostream>

void print(int x, int y = 4)  // 4 is the default argument
{
  std::cout << "x: " << x << '\n';
  std::cout << "y: " << y << '\n';
}

int main() {
  print(1, 2);  // y will use user-supplied argument 2
  print(3);     // y will use default argument 4
}

// in case of multiple default arguments
void printmulti(int x = 10, int y = 20, int z = 30) {
  std::cout << "x: " << x << '\n';
  std::cout << "y: " << y << '\n';
  std::cout << "z: " << z << '\n';
}

出力:

x: 1
y: 2
x: 3
y: 4

デフォルトの引数は関数 (またはメソッド) の宣言で構文的に表示されますが、デフォルトの引数自体は、翻訳単位ごとに 1つだけ存在する必要があるという点で、定義のように動作します。 関数定義で既定の引数の値を繰り返すことはできません。つまり、関数のインターフェイスの一部は、その実装の場所では見えません。

既定の引数の定義がある場所で評価され、別の場所で評価されると、名前の検索、アクセス制御、テンプレートのインスタンス化など、途中で C++ の側面について混乱が生じます。

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

関連記事 - C++ Function