本文へスキップ
BecomeCoder
ブログ一覧コース一覧

C言語とC++の違いとは|初心者はどっちから学ぶべきか

#C言語#C++#初心者#比較

結論:C言語は「メモリを自分で管理する手続き型言語」、C++は「Cの機能を土台にクラス・テンプレート・標準ライブラリなどを足した多機能な言語」です。初心者が最短でつまずかずに進みたいなら、C言語で変数・ポインタ・メモリの基礎を先に固め、そのあとC++でオブジェクト指向やモダンな書き方に進むのがおすすめです。

C言語とC++は何が違うのか

C++はもともと「C with Classes」という名前で生まれた言語で、C言語にクラス(オブジェクト指向)テンプレート(ジェネリックプログラミング)例外処理豊富な標準ライブラリを足したものです。C言語のコードの多くはほぼそのままC++としてもコンパイルできるくらい、文法的な地続き感があります。

大きな違いを表にすると次のようになります。

観点C言語C++
パラダイム手続き型(関数中心)手続き型+オブジェクト指向+ジェネリック
メモリ管理malloc/freeを自分で呼ぶnew/deleteに加え、スマートポインタで自動化できる
文字列char配列を自分で操作std::stringで長さ管理やコピーが楽
可変長配列自分でmalloc/reallocして実装std::vectorが標準で用意されている
データのまとめ方struct(データのみ)struct/classにメンバ関数・継承・多態を持たせられる
用途の例OS・組み込み・低レイヤーの学習ゲームエンジン・高性能アプリ・競技プログラミング

このサイトでは、C言語の基礎から中身のしくみまでを C言語コース で、C++の文法からモダンな書き方までを C++コース で、それぞれブラウザ上でそのままコードを実行しながら学べます(無料・登録不要・環境構築なし)。どちらも実際に手を動かして違いを体感するのが一番早い理解の近道です。

具体的に何が変わるのか ― メモリ管理とデータのまとめ方

一番わかりやすい違いは「メモリの管理方法」と「データのまとめ方」です。

C言語では、ヒープ領域を使いたいときは自分で malloc を呼んで、使い終わったら自分で free を呼びます。これを忘れるとメモリリークになり、二重に呼ぶとダブルフリーという実行時エラーになります。この感覚は malloc/free ― ヒープから借りて、自分で返すよくあるバグ ― リーク・ダングリング・ダブルフリー で実際にコードを動かしながら体験できます。

C++でも new/delete で同じことができますが(new / delete と RAII の考え方)、それに加えて std::unique_ptrstd::shared_ptr のようなスマートポインタを使えば、解放し忘れの心配をかなり減らせます。この考え方は std::unique_ptr ― 唯一の所有権shared_ptr と weak_ptr ― 共有する所有権 にまとまっています。

データのまとめ方も違います。C言語の struct は「データを入れる箱」でしかなく、関数(振る舞い)は別に書きます(struct基本 ― データをひとまとめにする型)。C++の struct/class はデータと関数(メンバ関数)を一緒に持たせられ、継承や多態(継承 ― 共通部分をまとめるvirtual ― 実行時に振る舞いを切り替える)でオブジェクト指向らしい設計ができます。この違いを体で理解しておくと、「なぜC++にはclassという概念が追加されたのか」がすっと腑に落ちます。

初心者はどっちから学ぶべきか

「C言語 C++ どっち 初心者」で迷っている人には、C言語から先に学ぶことをおすすめします。理由は次の2つです。

  1. C++の機能の多くはCの上に成り立っているため、Cでポインタやメモリのしくみを理解していると、C++のクラスやスマートポインタが「何を楽にしてくれているのか」を実感として理解できます。逆にC++から入ると、std::vectorstd::stringが便利すぎて、その裏でメモリが何をしているのか意識しないまま進んでしまいがちです。
  2. C言語のほうが文法要素が少なく、変数・条件分岐・ループ・関数・ポインタという核だけに集中できるため、プログラミングの土台を作るのに向いています。

すでにC++の授業や課題があって急いでいる場合は、C++コースの前半(変数・条件分岐・関数・配列あたり)から始めても構いません。C言語とC++は前半の文法がほぼ共通しているので、どちらから入っても大きく迷うことはありません。

なお、ポインタの &(アドレスを調べる)と *(中身を見る)の違いでつまずく人がとても多いポイントです。ここを住所の例えで丁寧に解説した記事を別に用意しているので、迷ったら C言語のポインタがわからない人へ|住所と中身の違いを動かして理解する も参考にしてください。

どこまでブラウザで実行できるか

このサイトの強みは、環境構築なしにブラウザだけでコードを動かせることです。

つまり両コースとも、文法を読むだけでなくその場でコードを書き換えて挙動を確かめながら学習を進められます。

つまずきやすいところ

C言語・C++に共通して初心者がつまずきやすいのが、コンパイルエラーとセグメンテーションフォールト(Segmentation fault)です。

エラーメッセージが出たら焦らず、まず「エラー逆引き」のページで同じ文言を探してみるのが解決の近道です。

次に読む

← ブログ一覧に戻る