機能#

導入#

関数はC++プログラミングの基本的な構成要素であり、特定のタスクを実行するように設計された、再利用可能で効率的なコード断片にコードスニペットをパッケージ化します。関数はプログラム内で複数回呼び出すことができるため、コードの構成が容易になり、コードの重複を避けることができます。また、関数を使用することでコードのデバッグも容易になります。

このページでは、C++における関数使用の基本について説明します。内容は以下のとおりです。

関数構造と構文#

C++では、関数は戻り値の型、名前、および引数を指定して宣言する必要があります。基本的な構文は次のとおりです。

return_type function_name(parameters) {
  // Code to execute when the function is called
  return result;  // Optional, used to return a value
}

機能部品

説明

return_type

The data type that the function returns, some common options are:

  • void — Returns nothing
  • int — Returns an integer value
  • double — Returns a floating-point number
  • bool — Returns true or false
  • char — Returns a single character
  • const char* — Returns a text string
  • user-defined types — Returns a struct or class object

function_name

関数の名前。

parameters

オプション。カンマ区切りの型付きパラメータのリスト。形式は type nameで、 type はパラメータのデータ型を指定し、 name は関数内でその値にアクセスするために使用される識別子です。パラメータは、関数が呼び出されたときに入力値を受け取ります。

result

オプション。関数が返す値。関数の return_type が voidでない場合、この値を指定する必要があり、その型は指定された return_typeと完全に一致する必要があります。

Note: A function must always be declared before it is called, or you must provide a function prototype.

関数プロトタイプ#

C++では、コードは上から下へと読み込まれます。つまり、関数は呼び出される前にコンパイラに認識されていなければなりません。

関数プロトタイプを使用すると、完全なコードを書く前に関数を使用できます。これにより、プログラムの先頭付近に main() を残しておき、関数定義を後で配置して整理しやすく、読みやすくすることができます。

プロトタイプがない場合、 main()より上のすべての関数を定義する必要があり、プロジェクトが大きくなるにつれて追跡が難しくなる可能性があります。

// The function's prototype
void greeting();

int main() {
  greeting();
}

// Write the function's body after
void greeting() {
  Brain.Screen.print("Hello!");
}

関数の定義と呼び出し#

Functions with No Parameters#

関数が入力値を必要としない場合は、引数なしで定義できます。関数が値を返さない場合は、戻り値の型として void を使用してください。

// Define a function to display a message
void greeting() {
    Brain.Screen.print("Hello!");
}

int main() {
    // Initializing Robot Configuration. DO NOT REMOVE!
    vexcodeInit();
    // Call the function to display the message
    greeting();
}

Functions with Parameters#

関数にパラメータを追加することもできます。これにより、関数が使用する情報を渡すことができます。

注: テキストは、C スタイルの文字列 (const char*) または C++ 文字列 (std::string ) を使用して渡すことができます。

// Define a function with a parameter
void namedGreeting(const char* name) {
    Brain.Screen.print("Hello, %s!", name);
}

int main() {
    // Initializing Robot Configuration. DO NOT REMOVE!
    vexcodeInit();
    namedGreeting("Stranger");
}

戻り値#

関数は、 return キーワードを使用して呼び出し元にデータを返すことができます。これにより、出力を取得してプロジェクト内で使用できます。

// Define a function that multiplies numbers by 2
int timesTwo(int number) {
    return number * 2;
}

int main() {
    // Initializing Robot Configuration. DO NOT REMOVE!
    vexcodeInit();
    // Display the return value
    Brain.Screen.print("%d", timesTwo(2));
}

参照による譲渡#

By default, C++ passes function parameters by value, meaning the function receives a copy of the original variable. Changes made inside the function do not affect the original value.

// Add 1 to the number
void addOne(int number) {
  number++;
}

int main() {
  int value = 5;
  addOne(value);
  // "value" will still be 5
}

関数が元の 変数 を変更できるようにするには、 & 記号を使用して参照渡しでパラメータを渡すことができます。

// Add 1 to the number
void addOne(int& number) {
  number++;
}

int main() {
  int value = 5;
  addOne(value);
  // "value" will now be 6
}

Passing by reference allows functions to update variables defined outside the function without returning a value.

コールバック関数#

コールバック関数とは、別の関数に渡され、特定のイベントが発生したときに自動的に呼び出される関数のことです。

コールバックは、ボタンの押下やセンサーの更新などのイベントでよく使用されます。

自分で関数を呼び出す代わりに、プロジェクトがイベント発生時に自動的に関数を呼び出します。

void onPressed() {
  Brain.Screen.print("Screen pressed!");
}

// Call onPressed whenever the screen is pressed
int main() {
  vexcodeInit();
  Brain.Screen.pressed(onPressed);
}

Callback Signatures#

すべてのコールバック関数は、以下を定義する特定のシグネチャに従う必要があります。

  • 戻り値の型

  • パラメータの数

  • パラメータの型

必要な署名はAPIによって決定されます。コールバック関数はこの署名と完全に一致する必要があります。

// This callback function cannot include any parameters
void callback(void);

// This callback function includes four parameters
void callback(axisType axis, double x, double y, double z);

パラメータ名は説明的なものであり、変更可能だが、戻り値の型、パラメータの順序、およびパラメータの型は完全に一致しなければならない。

デフォルト引数を持つ関数#

関数は、1つまたは複数のパラメータに対してデフォルト値を定義できます。デフォルト引数は、関数呼び出し時にそのパラメータに値が指定されていない場合に使用されます。

デフォルト引数のルール:

  • デフォルト引数は、関数の定義における最後のパラメータでなければなりません。

  • パラメータにデフォルト値が設定されると、それ以降のすべてのパラメータにもデフォルト値が設定されなければなりません。

  • 関数がその プロトタイプ でデフォルト引数を指定している場合、それらのデフォルト値は関数定義で再度指定してはなりません。

// Required parameter first, default parameter last
void greeting(const char* name, int repeatCount = 1) {

    for (int i = 0; i < repeatCount; i++) {
        Brain.Screen.print("Hello, %s!", name);
        Brain.Screen.newLine();
    }
}

int main() {
    vexcodeInit();

    // Say what name to greet (V5) and
    // use default value for repeatCount (1)
    greeting("V5");

    Brain.Screen.newLine();

    // Overrides the default value to 3
    greeting("V5", 3);
}