このブログはC++に嫌気が差してきた時に備え、なぜC++を学ぶのかを書いたものです。

C++は、1985年にBjarne StroustrupによってCの拡張として発明された汎用プログラミング言語です。誕生以来、C++はデスクトップ アプリケーション、ビデオゲーム、サーバーなどのさまざまな目的で利用されてきました。最近その人気はますます高まっており、 TIOBEインデックスではCを上回り、2位にランクインしています。では、なぜC++はこれほど人気があり、なぜ私たちはC++を 学ぶべきなのでしょうか?
オブジェクト指向プログラミング
C++は、Cにオブジェクト指向プログラミング(OOP)というパラダイムを導入したことで、その人気を高めました。Cでは、
関連する変数を構造体(struct
)に格納することができましたが、関連する関数を格納することはできませんでした。
Cでの連結リストとその関数の定義方法を思い出してみましょう:
typedef struct {
int data;
struct Node *next;
} Node;
Node *head = NULL;
void printLinkedList (Node *head) {
Node *current = head;
while (current != NULL) {
printf("%d -> ", current -> data);
current = current -> next;
}
printf("\n");
return;
}
Cでは、構造体と関数を別々に定義する必要があり、printLinkedList
のような関数名を使用する必要がありました。
他のデータ型(文字列や配列など)と混同しないようにするためです。一方、C++では、オブジェクト指向プログラミングにより、
関連する変数と関数をLinkedList
のようなオブジェクトに格納し、LinkedList.head
やLinkedList.print()
のように呼び出すことができます。
このオブジェクト指向アプローチは、手続き型プログラミングよりも直感的なデータの整理方法であり、現実世界の仕組みに
近いものです。たとえば、犬が人に向かって吠えるコードを書くとき(飼い主とそれ以外の人に対して異なる反応をする場合)、
void Dog_bark(dog, person)
よりもDog.bark(person)
と表現する方がはるかに直感的で冗長性が少ないです。
前者は「そこに犬と人がいて、その犬の吠え声が聞こえた」と言うようなものであり、後者は「犬が人に吠えた」と言うよう
なものです。
後者の方が自然である理由は、自然言語と同様にコードの構造が、犬が人に対して行動を起こしたことを明確に伝えているためです。 前者のコードでは、それを効果的に伝えることができず、プロセス名に依存してその情報を伝えるしかありません。 このため、オブジェクト指向プログラミング(OOP)のコードは、書きやすく、読みやすくなることが多いのです。*
さらに、オブジェクト内の関数は、オブジェクト内に格納された変数や関数にアクセスできるため、パラメータを外部パラメータのみに 減らすことができます。このカプセル化により、変数の初期化や関数の実装の詳細を隠すことができ、抽象化が促進され、 開発速度が向上する傾向にあります。*
C++への批判
オブジェクト指向プログラミング(OOP)には、継承やコンポジションなど他にも多くの利点がありますし、C++は3年ごとに新しい 便利な機能が追加され続けています。これらの機能をすべて活用しつつ、効率的なコードを書くためのCのようなメモリ管理も行う ことができます。これらを聞くと、まるで夢のような言語に思えるかもしれません。しかし、C++には多くの賞賛がある一方で、 同時に多くの批判にも晒されています。
機能が増えるほど、同じ結果を達成するための方法も増えていきますが、同時にミスをする可能性も飛躍的に増えます。たとえば、 C++では、オブジェクト内で動的メモリ割り当てを抽象化できますが、そのためにメモリを解放するのを忘れてメモリリークを引き起 こすリスクも増えます。多くの抽象的な機能を持つと、それを使用して仕事をこなせることに満足してしまい、その実装の詳細を考えず に、知らず知らずのうちに非効率的でバグが多いコードを作成してしまう可能性が高まってしまうのです。
また、非常に多くの機能があり、さらに3年ごとに新しい機能が追加されるため、変更に追いつき、C++コードをメンテナンスするのが 難しくなることもあります。一方、Cはシンプルでありながら、C++で実装できるほとんどすべてのことを実装でき、モジュール化や 関数名の工夫を通じて、オブジェクト指向のようなコードも実現できます。実際、Linuxの開発者であるリーナス・トーバルズは、 上記のいくつかの理由から少なくとも、カーネルプログラムを書く文脈ではC++を「ゴミ」と呼んだこともあります。(興味があれば、 彼の元の発言を読むことをお勧めします。)
C++に組み込まれている機能のおかげで、C++での開発速度は速くなると考える人もいるかもしれませんが、C++は暗号的な構文や オブジェクトを定義するためのボイラープレートコードも多いこと有名です。そもそも開発速度が最優先であれば、Pythonのようなガベージ コレクタを持つ高級言語を使う方が良いと言えるでしょう。
なぜC++を学ぶのか?
C++も他の全てのプログラミング言語と同様完璧ではありません。しかし、C++が適した問題もいくつかあることも事実です。 たとえば、ビデオゲームはその性質上、多くのオブジェクトとその相互作用を扱う必要があり、高効率なコードが求められるため、 C++は適しています。
また、多くの高水準言語(Python、JavaScriptなど)はオブジェクト指向であり、C++を理解することで、これらの言語を学ぶための 強力な基盤が得られます。また、いくつかのデータ構造やアルゴリズムは、オブジェクトとしてより自然に実装できるため、 C++を学ぶことでそれらをカバーすることができます。
私は初心者にはこの言語をお勧めしないかもしれません。しかし、すでにCの基本を学んでいる私たちにとって、Cの拡張版である C++を学ぶことは、論理的で有益な次のステップとなります。私はC++を学び始めること、そしてその過程を皆さんと共有すること を楽しみにしています。
リソース
- Dream of Code. 2023. Should you learn C++ in 2023?. YouTube.