先頭へ戻る

はじめに | Programming Place Plus 新C++編

Programming Place Plus トップページ -- 新C++編

先頭へ戻る

このページの概要

このページでは、「新C++編の方針と、C++ のこと」を取り上げます。

以下は目次です。



新C++編の内容

新C++編では、C++ というプログラミング言語(用語集)について、入門段階から順を追って解説していきます。

頭に "新" と付いているのは、当サイトには以前から「C++編」があるからです。新C++編は、C++編を改めて作り直したコンテンツです。

古い C++編は 2020年現在では、非常に古い記事になっています。これは、C++ 自体が何度もバージョンアップを繰り返しているからです。C++編が解説のベースとして使っている C++ のバージョンは、登場から 20年程度経過したものであり、これから C++ を学ぼうという人には不適切なものになってしまっています。

古い C++ の機能の大半は、最新の C++ でも変わらず使えるものの、新しく登場した有用な機能を使わずに学習することは得策ではありません。新しい機能のほうが便利ですし、問題があった部分に修正が加えられていることもあります。あえて古いバージョンで学習して、余計な苦労をするべきではありません。


新C++編を読み進めるにあたって、C++ に関する前提知識は不要です。また、「C++ は C言語というプログラミング言語を下敷きにしたような言語なので、C++ を学び始める前にC言語を学んだほうがいい」という考え方もありますが、新C++編ではそれも不要です。C言語と同じである部分についても、新C++編の中で解説します。

純粋なC言語の解説は、C言語編でおこなっています。

補足事項について

解説は原則的には、本文とサンプルプログラムを読み進めていくように構成しますが、それ以外に、理解を助ける補足解説を挟みます。補足解説は、次のように枠で囲んで、本文から切り離して記述します。

この部分に書かれている内容は、補足解説です。

読者層に応じた補足情報を、次のように記述することがあります。これらは対象者の方だけがお読みください。

【C++98/03 経験者】古い C++ の経験者に向けた補足解説です。

【C言語プログラマー】C言語の経験者に向けた補足解説です。

プログラミング自体が初めての人に向けた補足解説です。

難しい話題、まだ解説していない知識が必要な話題、専門的な知識が必要な話題といったときには、次のように記述します。前提知識をお持ちでない方には不要な追加情報なので、読み飛ばして問題ありません。

より高度な話題です。

プログラミングが初めての方へ

新C++編では、プログラミング(用語集)そのものの経験がない方でもご理解いただけるように努めるつもりですが、なかなか厳しいかもしれません。

C++ によるプログラミングは、非常に難しいといわれています。また、とくに最初のうちは、文字を入力(用語集)すると、文字が表示されるというような、どちらかといえば地味な例が多くなりがちで、この辺りがつまらなく感じる方も多いでしょう。

少なくとも、「勉強する目的」を明確にお持ちください。それがないのなら、モチベーションが続かず、C++(もしくはプログラミング自体)を学び続けることが苦痛になってしまうかもしれません。「目的はないが、とりあえずやってみる」には C++ は厳しい選択です。また、目的を明確に考えてみると、自分が学ぶべきものが C++ ではないことに気付く可能性もあります。

もし、やってみたいと思っていることがあるのなら(Web系の開発がしたい、ゲーム開発がしたいなど)、その分野を経験している人が書いている記事や本、あるいは SNS での発言などを探してみることを勧めます。この界隈は、分野が違うと事情がまったく異なる場合があるので、「プログラミングを知っている人」でなく、「その分野を知っている人」から情報を得ることが重要です。詳しそうにみえる人でも、その人が関わっている分野の話しかしていないことが多々あります。

ちなみに、この文章を書いている私のキャリアの大半は、家庭用ゲーム機向けのゲーム開発にあります。2005~2016年頃の 10年超、某開発会社でプログラムを書いてきました(ほとんどすべてのプロジェクトで C++ を使いました)。そのため、私が解説する内容は、知らず知らず、そのゲーム開発会社内での事情や経験に縛られているかもしれません。そして、ゲーム開発以外でのプログラミングについては、ほとんど経験を持ち合わせていません。ですから私に Web開発に関することを尋ねられても、良い回答はできません。

そもそも、プログラミングやプログラミング言語というもの自体がよく分からないかと思いますが、その辺りは、ページを改めて詳細に取り上げますので、ここから先はよく分からなくても気にせず、お進みください。

C++ とは

C++(シープラスプラス)は、プログラミングをするときに使う言語(プログラミング言語)の1つです。世の中にプログラミング言語は非常にたくさんありますので、プログラミングをするために必ずしも C++ が必要なわけではありません。

C++ は、C言語(あるいは単に C と呼ばれる)というプログラミング言語をベースにして、数々の機能追加や修正を行ったプログラミング言語です。そのため以前は、C++ の学習の前にC言語を学習すべきといわれることがありました。しかし、近年の C++ は、C言語との差異が大きくなっており、現在ではC言語を先に学習する必要性はあまりないと思います。

【C言語プログラマー】古くからよく耳にする「C++ はC言語の上位互換の言語である」だとか、「C言語にオブジェクト指向の機能を追加したものだ」という説明はお忘れください。現在ではあまり正しい認識とはいえません。

C++ の長所として、以下のような点が挙げられます。

  1. 実行速度のすぐれたプログラムを作りやすい(速度的な効率が良い)
  2. メモリなどの資源の使用量を抑えたプログラムを作りやすい(空間的な効率が良い)
  3. ほとんどの分野で使用できる(汎用的である)
  4. さまざまなプログラミング手法を使った開発ができる(表現力が高い)
  5. 情報が多くあり、開発をサポートするツールなども豊富にある(活発に使われている)

誤解を恐れず簡単にいえば、「性能が高く、ほとんど何でもできる」ということになります。もちろん、C++ は完璧なプログラミング言語だというわけではありませんが、幅広く仕事をこなせる言語であることは確かです。

【C言語プログラマー】4番以外はC言語の長所でもあることに気付かれたかもしれません。実際、C++ はC言語がもつこれらの長所をきちんと引き継いでいます。そのうえで、型によるチェックが厳しくなっているなど、C言語よりも安全性が向上しています。また、4番の長所にあるように、複数のプログラミング手法を使えるため、ほとんどC言語のようなプログラミングをすることも可能ですし、C++ で追加された手法を一部だけ導入してみるといったことも可能です。C言語で書いたプログラムを C++ のプロジェクトに混在させることもできます。


一方、短所として、以下のような点が挙げられます。

  1. 仕様が巨大で複雑
  2. コンピュータの仕組みに関して、ある程度知識が要求されることがある

ほとんど「仕様が巨大で複雑」という点に尽きます。C++ が難しいといわれるのはここが理由になっています。

ですが、細かいところに惑わされず、最初から「確実に正しい」方法を学ぶようにし、よくわからないままに適当な書き方をしないようにしていれば、そこまで恐れることはありません。ですから、最初のうちはきちんと体系的な入門学習をしたほうがいいと思います。そのつど調べて何とかするようなスタイルでは、なかなか正しいプログラムが書けるようになりません。新C++編は体系的な入門学習として使える教材を目指しています。


C++ は、ほとんどの分野で使われているプログラミング言語です。さきほど長所で挙げたとおり「何でもできる」言語なので、適応可能な分野にこれといった制約がありません。速度面で優位に立てる言語なので、(競争のため)各社の主力製品の開発で使われていることも多くあるようです。

標準規格

C++ には、その仕様を詳細に定めた標準規格があります。大元になるのは、ISO/IEC という組織がまとめた国際的な標準規格です。それをさらに各国が自国の言語でまとめた規格もありますが、残念ながら日本の規格(JIS規格)は、2003年の C++03 というバージョンに相当する「JIS X 3014:2003 プログラム言語C++」1で止まったままです(2020年1月現在)。

2020年1月現在、制定されている国際標準規格は以下のとおりです。

西暦年 正式名 通称 (正式決定前の通称)
1998年 ISO/IEC 14882:1998 C++98
2003年 ISO/IEC 14882:2003 C++03
2011年 ISO/IEC 14882:2011 C++11 (C++0x)
2014年 ISO/IEC 14882:2014 C++14 (C++1y)
2017年 ISO/IEC 14882:2017 C++17 (C++1z)
2020年 (予定) ISO/IEC 14882:2020 (予定) C++20 (C++2a)

正式名は長いので、通称がよく使われます。

2011年以降、3年ごとに更新されており、今後もこの流れが続く予定になっています。

【C++98/03 経験者】特に C++11 での機能追加が大規模なものでした(一部の例外を除いて、C++98/03 時代の機能のほとんどは引き続き使えます)。C++11 以降の C++ のことを Modern C++(モダンな C++)と呼ぶことがあるように、現代の C++ として最低限のバージョンは C++11 ということになります。

実際に C++ で標準規格に沿ったプログラミングをするには、コンパイラ(用語集)(プログラミングに必要な道具の1つです)が、目的のバージョンの標準規格に対応できるかどうかも問題になります。「この標準規格の機能が使いたい」と思っても、使っているコンパイラが対応していなければどうにもなりません。


これは筆者の感覚ですが、2020年現在、新たに書かれる C++ プログラムが参照する標準規格の最低ラインは C++11 だと思われます。C++11 で追加された新機能や改良点は、C++ のプログラムを劇的に変えてしまえるほど大きなものでした。正しく書けば(あるいはこれまでどおり書けば)、C++ のプログラムはより効率的になります。

これから C++ を学習したり、プログラムを書いたりするにあたって、C++11 よりも古いバージョンを選択する理由はありません。洗練されておらず、多少の問題も抱え、便利な機能が少ないので、新しいバージョンを使えば不要だったはずの苦労をしなければならなくなります。

一方で、新しすぎるバージョンには現実味がない場合があります。新しい標準規格が出来たからといって、プログラミングに必要な道具が即座に更新されるわけではないからです。標準規格ができてから、実際にそのバージョンの機能が十分に使えるようになるまで、早くとも1~2年程度はかかるのが普通です。また、入門者が理解できるような情報が極度に少ないという問題もあります。

さらに、現実の開発現場に目を向けると、数年前に購入した開発環境(用語集)を簡単に更新できなかったり、古いプログラムを保守するなどの理由で更新できなかったりすることがあり、プログラマー個人としては新しいバージョンに移行したくとも、それが許されないケースもあります。


新C++編は、C++14 を解説のベースとして選択しています。解説をシンプルにするため、これより古いバージョンでの事情には触れません(前述したとおり、C++98/03 経験者向けの補足を、本文とは切り離したところに入れます)。

C++14 は最新のバージョンではありませんが、古すぎるバージョンでもありません。現時点でも、主流の開発環境の多くが、このバージョンに対応できています。

開発環境について

ここでは、新C++編の解説のために使う開発環境についての説明をしておきます。

開発環境を準備する方法などについては、のちほどページを改めて再度取り上げることにします

新C++編で登場するプログラムは、以下の環境で正常に動作することを確認しています。いずれも、更新プログラムのたぐいは、最新のものを適用します。リンクはそれぞれの公式ページへ移動します。

  1. Microsoft Visual Studio Community 2015
  2. gcc 4.9.3
  3. clang 3.4

当サイトでは、「Microsoft Visual Studio Community」は「Visual Studio」と表記します。「Microsoft Visual Studio Community 2015」は「Visual Studio 2015」と表記します。

Visual Studio は Windows 10 の PC で、gcc と clang は Wandbox を使って確認します。

Wandbox は Webブラウザ上で、プログラムを書き、実行して試すことができるプログラミング環境です。手元の PC に開発環境を作成しなくて済むなどの利点があります。

上記のいずれの環境も、2020年1月現在としては古いバージョンを選択しています。それぞれ、C++14 の機能のほとんどが対応された頃のバージョンを選択しているためです。これから学習を始める方は、上記のバージョンに合わせる必要はありません。素直に最新バージョンを選択してください。

参考リンク

1. JIS X 3014:2003 プログラム言語C++ | 日本規格協会 JSA Group Webdesk - C++03 に対応する JIS規格



更新履歴




はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー