C++でmain()関数はオーバーロードできるのか?徹底解説
C++では関数オーバーロード(function overloading)の機能を使うことで、同じ名前でありながら引数の型や個数が異なる複数の関数を定義できます。では、プログラムのエントリーポイントであるmain()関数もオーバーロードできるのでしょうか?
結論から言うと、グローバルなmain()関数のオーバーロードはできません。実際にコードで確認してみましょう。
main()をオーバーロードしようとするとどうなるか
以下のように、引数の異なる複数のmain()関数を定義してみます。
サンプルコード
#include <iostream>
using namespace std;
int main(int x) {
cout << "Value of x: " << x << "\n";
return 0;
}
int main(char *y) {
cout << "Value of string y: " << y << "\n";
return 0;
}
int main(int x, int y) {
cout << "Value of x and y: " << x << ", " << y << "\n";
return 0;
}
int main() {
main(10);
main("Hello");
main(15, 25);
}実行結果
コンパイルエラーが発生します。 「main()関数の宣言に競合(conflict)がある」という旨のエラーが出力されます。
このように、グローバルスコープでmain()を複数定義しようとすると、宣言の競合によるコンパイルエラーとなります。これは、main()関数がプログラムの開始点として特別扱いされており、標準規格上もそのシグネチャが限定されているためです。一般的に許容されるのはint main()とint main(int argc, char* argv[])の2種類のみです。
クラスのメンバー関数としてならオーバーロード可能
ただし、回避策があります。mainという名前は、C言語と異なりC++では予約語(restricted keyword)ではないため、クラスのメンバー関数として定義すれば自由にオーバーロードできます。
サンプルコード
#include <iostream>
using namespace std;
class my_class {
public:
int main(int x) {
cout << "Value of x: " << x << "\n";
return 0;
}
int main(char *y) {
cout << "Value of string y: " << y << "\n";
return 0;
}
int main(int x, int y) {
cout << "Value of x and y: " << x << ", " << y << "\n";
return 0;
}
};
int main() {
my_class obj;
obj.main(10);
obj.main("Hello");
obj.main(15, 25);
}実行結果
Value of x: 10 Value of string y: Hello Value of x and y: 15, 25
この例では、クラスmy_class内に引数の異なる3つのmain()メンバー関数を定義し、問題なくオーバーロードが機能しています。オブジェクトを生成してobj.main(...)の形式で呼び出すことで、それぞれの関数が正しく実行されていることがわかります。
まとめ
- グローバルな
main()関数はオーバーロード不可。定義するとコンパイルエラーになる。 mainはC++では予約キーワードではないため、クラスのメンバー関数として使えばオーバーロードできる。- ただし実際の開発では混乱を避けるため、エントリーポイント以外に
mainという名前を使うのは避けるのが無難である。
-
C++で点集合の線対称(ラインリフレクション)を判定するアルゴリズム
問題概要2次元平面上にn個の点が与えられます。このとき、y軸に平行な直線で全ての点を鏡映(反射)した結果が、元の点集合と完全に一致するような直線が存在するかどうかを判定します。言い換えれば、ある直線を対称軸として全ての点を反転させたとき、反転後の点の集合が元の集合と同一になるかを確認する問題です。例えば、入力が points = [[1,1],[-1,1]] の場合を考えてみましょう。この場合、x = 0 の直線(y軸)を対称軸とすると、点 (1,1) は (-1,1) へ、(-1,1) は (1,1) へと移ります。点集合全体としては変化がないため、出力は true となります。解法のポイン
-
C++で解く対角トラバースII:リストのリストを対角順に出力する方法
問題の概要 「リストのリスト」である nums が与えられたとき、そのすべての要素を対角順(ダイアゴナルオーダー)に並べて出力するのがこの問題の目的です。 たとえば、次のような行ごとに長さの異なる配列(ジャグ配列)が入力として与えられた場合を考えてみましょう。 このとき、期待される出力は次のとおりです。 [1, 6, 2, 8, 7, 3, 9, 4, 12, 10, 5, 13, 11, 14, 15, 16] 解法のアプローチ この問題は、各要素を「値と座標のセット」として一旦記録し、対角線ごとの順序になるようにソートし直すことで解けます。具体的な手順は以下の通りです。 結果を格納す