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(10);
func(10, 20);
func}
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型に変更。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |