本連載では、次のようなC++ソースコードを紹介し、コードの意味と背景をじっくり考えています。
#include <iostream>
int main()
{
const std::string ch0 = "Typical: I don't know anything about programming!\n";
const std::string ch ("Simplified form: I don't know anything about programming!\n");
const std::string* ch1 = new std::string ("Pointer form: I don't know anything about programming!\n");
std::cout << "Popular: I don't know anything about programming!" << std::endl;
printf(ch0.c_str());
std::cout << ch.data();
std::cout << ch1->data();
std::cout << ch.c_str();
std::cout << ch1->c_str();
std::cout.write(ch.c_str(), ch.size());
std::cout.write(ch1->c_str(), ch1->size());
return int(0);
}
私たちは、このC++ソースコードから、次のような印象を持つこともこれまで確認してきました。すでに説明済みの項目は、打ち消されています。
印象1:とにかく難しい!
印象2:Cのソースコードとどこか似ている
印象3:#includeに続くiosteamという意味が分からない
印象4:stdio.hがないにもかかわらず、printf関数が呼び出されていることが不思議だ!
印象5:std::coutのstdの意味が分からない
印象6:std::coutの「::」の意味が分からない
印象7:std::coutのcoutの意味が分からない
印象8:「<<」の意味が分からない
印象9:std::endlのendlの意味が分からない
印象10:「std::string ch」のstringの意味が分からない
印象11:「std::string ch」のchの意味が分からない
印象12:ch.data()の意味が分からない
印象13:ch.c_str()の意味が分からない
印象14:std::cout.writeの意味が分からない
印象15:ch.size()の意味が分からない
印象16:std::string*の「*」の意味が分からない
印象17:std::string* ch1の「ch1」の意味が分からない
印象18:ch1->data()の意味が分からない
印象19:ch1->c_str()の意味が分からない
印象20:ch1->size()の意味が分からない
今回は、「印象2:Cのソースコードとどこか似ている」を考えます。それでは、上のC++ソースコードから「Cのソースコードとどこか似ている」コードを抜き出し、小さなC++プログラムを作ってみましょう。たとえば、次のようなプログラムはいかがでしょうか。
#include <iostream>
int main()
{
const std::string ch0 = "I don't know anything about programming!\n"; // C++標準stringクラス
int ret = printf("%s", ch0.c_str()); // C関数とC++の「オブジェクトとメソッド」
if (ret == int(ch0.size())) // かなりC++的です。人間的な発想から分かりやすいコードが書けます。
{
return int('A'-'A'); // なんとなくC的ですね。このコードは0を返します。
}
else
{
return int('A'-'B'); // なんとなくC的ですね。このコードは-1を返します。
}
}
ご覧のように、このC++プログラムは、次のようなC概念とC++概念で構成されています。
・C++のクラス
・Cの関数
・C++の「オブジェクトとメソッド」
この小さなC++プログラムは、確かに、「Cのソースコードとどこか似ている」ということを証明してくれています。と同時に、次のこともしっかり証明してくれています。
"この小さなプログラムの作成者は、C++をベターC、として使っている!"
C++コードがCコードに似ているのは当然です。C++はCの遺産を最大限継承する方向で設計・実装されているからです(参考連載)。C++を設計したBjarne Stroustrup氏は、CとC++の相違を尋ねられ、このような回答をインターネットから一般公開しています。お時間のあるときぜひ目を通しておきたいところです。