C++関数

C++の関数仕様について

main関数の戻り値について

C++ではmain関数の戻り値はint型を返す必要があります。

戻り値を省略することやvoid型を指定することはできず、コンパイル時に以下のようなエラーが出力されます。


error: ‘::main’ must return ‘int’
In function ‘int main()’:
error: return-statement with no value, in function returning ‘int#

仮引数について

C++では、関数の仮引数を省略した場合にはvoidが指定されたと判断されます。

C言語では仮引数の省略は未定義状態と判断されていましたが、C++では明確に「引数がない」と判断されます。


#include <iostream>

void function()
{
    printf("function is called.\n");
}

int main()
{
    function();
    return(0);
}

コマンドライン引数(command line argument)について

C++のコマンドライン引数は、以下の形式で指定します。

C言語と同様に、argvは引数文字列データへのポインタ配列です。


#include <iostream>

int main(int argc, char *argv[])
{
    if(argc < 2){
        printf("ERROR: Invalid argument.\n");
        return(-1);
    }

    for(int i = 0; i <= argc - 1; i++){
        printf("argv[%d]: %s\n", i, argv[i]);
    }
    return(0);
}

デフォルト引数について

C++では、関数呼び出し時に引数が指定されなかった場合に、デフォルトで使用する引数を指定することができます。

デフォルト引数を用いることで、関数呼び出し時に引数を省略して呼び出すことができます。


#include <iostream>

void function(int x = 80, int y = 50, int z = 30)
{
    printf("%d:%d:%d\n", x, y, z);
}

int main(void)
{
    function();         // デフォルト引数を利用する
    function(10);       // 第一引数のみ指定する
    function(10,20);    // 第一引数と第二引数のみ指定する
    function(10,20,30); // デフォルト引数を利用しない
    return(0);
}

デフォルト引数の設定は末尾の引数から与える必要があります。

先頭の引数のみデフォルトを指定することはできません。


void function(int x, int y = 50, int z = 30)  // OK
void function(int x, int y, int z = 30)       // OK
void function(int x = 80, int y = 50, int z)  // エラー
void function(int x = 80, int y, int z)       // エラー

関数の多重定義(オーバーロード)

C++では、引数が異なる同名の関数を複数定義することができます。

「引数の型」と「引数の個数」に応じて適合する関数が呼び出されます。


#include <iostream>

int add(int x, int y){ return(x + y); }
int add(int x, int y, int z){ return(x + y + z); }
double add(double x, double y){ return(x + y); }

int main(void)
{
    printf("%d\n", add(1,2));
    printf("%f\n", add(1.5,2.7));
    printf("%d\n", add(10,20,30));
    return(0);
}

inline関数

インライン関数は、呼び出された箇所に関数本体を埋め込む関数です。

C言語におけるマクロ(#define)定義と同等の機能です。

インライン関数として定義された関数は、その関数が呼び出されたところで展開されます。

呼出しごとに展開されるので実行コードは少し大きくなりますが、マクロと同様に関数呼び出しのオーバーヘッドが回避できます。


#include <iostream>

// 比較して大きい値を返す。
inline int maxof(int a,  int  b)
{
    return((a > b) ? a : b);
}

int main(void)
{
    printf("%d\n", maxof(32,64));
    return(0);
}

関連ページ