【C++基礎】C++プログラマが学びなおす その2

C++からしばらく離れていたプログラマですが、これからの業務で触れる可能性が出てきたので、一度初心に立ち返って基礎からおさらいをしていく過程を備忘録として残していきます。

1. C++の特徴など


前回は、そもそもC++とは一体どのようなプログラミング言語であるのかを、言語の特徴やできること、実際にC++を使って開発されたシステムやサービスの実例を挙げながら軽くさらっていきました。

今回はより踏み込んだ特徴を知ることができれば、と考えていますのでよろしくお願いします。

2. C++は習得難易度が高い?


C++を学ぶ上で他のプログラミング言語と比較してみた際に、難点としてよく挙げられるのが、「C++は習得難易度が高い」というところです。

C言語でも言われていることではありますが、C++の方がより高度な知識を必要とされる印象があり、確かに習得の難易度は高く感じます。

では、なぜ習得難易度が高いと言われるのでしょうか。考えられる理由をいくつか挙げてみましょう。


・メモリ管理を行う必要がある
・オブジェクト指向のプログラミング言語である
・ある程度C言語の知識も必要になる
・とにかく覚えることが多い

2-1. メモリ管理を行う必要がある

これはC++だけでなくC言語にも言えることですが、C言語とC++は「メモリ管理」と呼ばれるものをプログラマーが行わなくてはなりません。

他のメジャーなプログラミング言語であるJavaやC#などに関してはメモリをプログラマーが扱うことがありません。

ですので、他言語ではメモリ管理を行う必要がそもそも無いのです。


プログラムの動作を行うに当たって、必要なメモリの確保を行い、プログラムの終了や処理の過程で不要になったメモリは解放を行う、といった処理がコンピューターの内部で行われています。

このメモリ管理を、C言語とC++ではプログラマーが明示的に行う必要がある、ということです。

この要素は他言語に慣れ親しんだプログラマーでも難しく感じてしまいますし、初心者であればなおのことかと思います。

メモリの確保と解放をきちんと行わなければ、システムの動作に影響が出てしまい、メモリの使い過ぎからメモリリークを起こして障害につながってしまう事態にもなりかねませんので、必ず必要な知識となってしまいます。

2-2. オブジェクト指向のプログラミング言語である

C言語からC++に機能拡張するにあたって、C++はオブジェクト指向のプログラミング言語となりました。

このオブジェクト指向と呼ばれるものが、学習の難易度を高くしてしまっている要因のひとつだと感じます。


オブジェクト指向自体は、最近の開発の主流となりつつあり、他のメジャーなプログラミング言語でも取り入れられている場合が多いです。

オブジェクト指向での開発を習得し、正しく設計・開発を行うことができれば、より大規模かつ複雑なシステムの開発においても効率的な作業を行うことができるのですが、オブジェクト指向の考え方は簡単ではありません。

2-3. ある程度C言語の知識も必要になる

ここは教える人や学習する人によって考え方が異なりそうではありますが、私はC++を習得するにあたっては、まずC言語を軽く触って基本的な知識を学んでおいたほうがいい、と考えています。


C言語で書いたソースコードはC++の環境でも基本的にはそのまま利用できます。

一部、キャストなどで気を付けなければならない点もありますが、まずはC言語で簡単なプログラムを作ってみながら基礎を固め、そこからC++を学んでいっても遅くはないと感じます。

特に、これから初めてプログラミングの分野に挑戦するような人は、あれこれ覚えなければならないC++から入るよりも、C言語から入ることをおすすめします。

実際私もプログラミングに初挑戦したのはC言語からであり、その後C++の学習へと入りましたが、スムーズに学習を進められた記憶があります。


もちろん、C++でのプログラミングでは不要となったり、使用が推奨されていないような機能もあります。

そこに関して、余計な混乱を招いてしまうような懸念を抱く方もいらっしゃるかと思います。

ここに関しては学習する方の前提の知識レベルや適正に左右されるポイントなのでどちらのほうがよい、ということはありません。

特に、既に他言語でのプログラミングを経験されているような方であれば、前提のC言語から学び始めるのは少し無駄があるとも感じます。


ですが、C++を使いこなすにあたってC言語の知識をある程度付けておいたほうが、より有利であるという点は感じていますので、ここに挙げさせていただきました。


2-4. とにかく覚えることが多い

ここまでで既に習得難易度を高くしている大きな要因を3つ挙げましたが、もっと多くのことを覚える必要があります。

「テンプレートの使い方」、「多重継承の注意点」、「関数や演算子のオーバーロード」、「例外処理の作り方」、「名前空間について」、「その他C++になってから増えた予約語や型について」…

これでもまだ一部です。

これだけでもC++を習得することの大変さが少し理解できるかと思います。


もちろん、こういったことをすべて覚えずともシステムの開発を行うことは可能です。

ですがその場合、C++を使う利点がかなり薄れてきてしまう印象です。


例えば、C++は他言語に比べてシステムやアプリケーションの処理速度が圧倒的に速いという特徴を持ちますが、これはC++の多彩な機能を活用出来ている場合に言えることです。

他言語でメジャーであるJavaと比べてみた際、基本的にはC++で作ったシステムやアプリケーションのほうが処理速度で勝ります。

しかしJavaも改良を続けて、現在ではC言語に近い性能を持つようになっています。

ですので、これらC++の拡張機能や利点をうまく活用できてなければ、処理速度でJavaに負けてしまいます。

こうなれば、Javaで開発しても変わりませんよね。


実際、同じ結果を求めるコードをC++を使いこなせていないプログラマーとJavaで高い技術を持つプログラマーでそれぞれ書いた場合、高い技術を持つプログラマーのJavaで書いたソースコードのほうが処理速度で勝ることもあり得るそうです。


しかし、同レベルのプログラマー同士のソースコードであれば基本的にC++の方に軍配が上がります。

C++の特徴や利点を活かすためにはこれらの覚えなければならない山積みの要素をしっかり習得しなければならない、という点が難易度を高く感じさせる要因のひとつであると考えます。

3. まとめ


今回はC++についてより深く踏み込んで調べてみました。

学習を行っていく備忘録なのに習得難易度が高い、というところを紹介すると、C++をおススメしたいのかしたくないのか分からなくなりそうですね。


C++を習得することがいかに大変か、ということを長々と羅列しましたが、そこまで難しく考えずにチャレンジしてみることも大切だと思います。

私はC言語から入り、C++を学びましたが、実務でVBやC#といった他言語を触る機会もあります。

その際、C++で苦労しながら学んだ知識が活用できて習得が非常にスムーズに感じましたので、ぜひ覚えてみることをおススメします。


次回からは実際に開発環境の構築を始めて、ソースが書ける状態まで持っていきたいと考えていますのでよろしくお願いいします。