関数オーバーロード 解答ページ | Programming Place Plus C++編【言語解説】 第8章

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題① 🔗

問題① 2つの整数値が同じかどうかは ==演算子で調べられますが、char型で表現された2つの文字列が同じかどうか調べるには ==演算子が使えません。どちらでも使えるような equal関数を、関数オーバーロードを利用して作成してください。


C++ では文字列を std::string で表現した方が良いですが、完全に統一することが難しい場合もあります。ここでは、const char*型の引数で受け取るようにします。

#include <iostream>
#include <cstring>

bool equal(int a, int b);
bool equal(const char* a, const char* b);

int main()
{
    std::cout << std::boolalpha
              << equal(10, 10) << "\n"
              << equal("abc", "abc") << std::endl;
}

bool equal(int a, int b)
{
    return a == b;
}

bool equal(const char* a, const char* b)
{
    return !std::strcmp(a, b);
}

実行結果:

true
true

equal関数は、比較結果に応じて真となる値か、偽となる値を返します。

問題② 🔗

問題② 次のプログラムの問題点を指摘してください(複数あります)

#include <iostream>

void func();
void func(int a = 0);
void func(int a = 0, int b);

int main()
{
    func();
    func(10);
    func(10, 20);
}

void func()
{
    std::cout << "func()" << std::endl;
}

void func(int a = 0)
{
    std::cout << "func(int)" << std::endl;
}

void func(int a = 0, int b)
{
    std::cout << "func(int, int)" << std::endl;
}

関数オーバーロードと、デフォルト実引数を組み合わせて使っています。これ自体は問題がない行為ですが、このプログラムには問題があります。

まず、3つ目の func関数の宣言ですが、

void func(int a = 0, int b);

1つ目の仮引数にデフォルト実引数を与えたのなら、それ以降の仮引数にもデフォルト実引数を与えないといけません。そのため、この関数はコンパイルエラーになります。

次に、main関数内の最初の func関数の呼び出しですが、これが曖昧になってしまっています。func関数には、次の2つのオーバーロードがあります。

void func();
void func(int a = 0);

このようにオーバーロードとデフォルト実引数を組み合わせると、「func();」という呼び出しが、引数無しの func関数を呼ぼうとしたものか、デフォルト実引数を省略した呼び出しなのかが判断できないため、コンパイルエラーになります。このような形でのオーバーロードはしないようにすべきです。

最後に、func関数の宣言時と定義時の両方で、デフォルト実引数を使っていますが、これは宣言時だけにしなければいけません。


参考リンク 🔗


更新履歴 🔗

 章立てを変えて、前章で bool型を説明済みになったので、練習問題①で int型にしていた戻り値を bool型に変更。

 新規作成。



第8章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る