Rossamu++

オールラウンダーになりたいと思っている僕っ娘の何の変哲もないブログ。

C++をのぞく時、C++もまたこちらをのぞいているのだ

この記事は初心者 C++er Advent Calendar 2015 - Adventarの19日目の記事です。
前回はそれC++なら#defineじゃなくてもできるよ | とさいぬの隠し部屋でした。

どうも、ろっさむと申します。
C++歴は2年いかない位で現在はゲームプログラマーになるために
色々お勉強している最中で御座います。

今回初めてAdvent Calenderに参加ということで
どう書くのか手探りでやっている状態となっています。
稚拙な文章になってしまいますが、どうぞよろしくお願いします。

さて、この記事のテーマは
純粋なC++について知ろう

となっております。
明らかに初心者向けです。すいません。
中級者上級者の皆様には物足りないかもしれません。
読み物としてサラーッと眺めて頂ければ有難いです。


1.C++とは?

 C++プログラミング言語の一種です(わかりきってますよね)。
大体なんでも出来ます。優秀な可愛い子です。
しかしなんでも出来るが故に、かなり多機能で複雑です。
でも、手がかかる子ほど可愛いと言いますし、
この記事の読者さんもそのくちでしょう。僕もそうです。

プログラミング言語は二つのお仕事を行います。

一つが、マシンに実行させる処理を
プログラマが指定するための手段を提供する事。

//「ようじょ」と出力するためにC++という手段を用いてマシンに「出力せよ」と指定しています。
std::cout << "ようじょ" << std::endl;

つまり、言語は出来るだけ「マシンに近い」ことが要求されます。

二つ目が、プログラマが処理内容を考える際に利用する
一連の概念を提供することです。
ここでは言語はできるだけ「解決すべき問題に近い」ことが要求されます。

それらを踏まえて、C++は以下に示す、
両方を提供するという考えに基づいて設計されています。

・メモリの効率的な利用と、効率的で低レベルな処理を提供できるようにするために
 組み込みの演算と型をハードウェアに直接マッピングすること。
・組み込み型と同じ記法、使い方、性能を持ったユーザー定義型を提供するために
 使いやすくて柔軟な抽象化のメカニズムを持つこと。

これらは二つはC言語とSimula言語を原点として考えられています。
(templateと例外処理は別方面からの刺激を受けてC++に追加したものらしいです(Clu等))

現在C++は、ほぼ全ての分野(PCや電話機、自動車、Amazon(ウェブ通販)、
Google(ウェブ検索)、コンシューマ系ゲーム制作等)で利用されています。

さすがC++!おれたちにできない事を平然とやってのけるッ そこにシビれる!あこがれるゥ!


2.C++の機能

続きましてはC++の様々な機能を紹介したいと思います。
と言いましても、流石に全てはご紹介できません。
さらっとだけ紹介します。あくまでも初心者向けに書いてます。

※全てを知りたい方は是非「プログラミング言語C++」を購入してみて下さい。
 全てが詰まっています。

まず、現在のC++のバージョンは14であり、既に次のC++1zが色々決まってきているようです。
ただ、Visual Studioは未だ14全ての機能には対応していないようです(大体使用可能なのは半分くらい)。
手っ取り早くコアな機能も試したいのであればWandbox等使うと良いかと思います。

ここでC++の機能をざーっと見てみましょう。

基本機能として…

  • 型と宣言

  L 基本型、論理型、文字型、整数型、浮動小数点数型、接頭語と接尾後、
  void、アラインメント、型の導出...etc

  • ポインタと配列と参照

  L void*ポインタ、nullptr、配列、文字列リテラル、多次元配列、constポインタ、
  左辺値参照、右辺値参照...etc

  • 構造体と共用体と列挙体

  L struct、POD、共用体、無名共用体、enum class、名前無しenum...etc

  L switch、if、範囲for、while、do、goto...etc

  L演算子、定数式、暗黙の型変換、ラムダ式、明示的型変換...etc

  • 関数

  L inline関数、constexpr関数、noreturn関数、参照引数、可変個引数、
   多重定義、マクロ、関数ポインタ...etc

  • 例外処理

  L エラー処理、finally...etc

  L using宣言、using指令、実引数依存探索、入れ子の名前空間...etc

  • クラス

  L コンストラクタ、デストラクタ、アクセス制御、explicitコンストラクタ、staticメンバ...etc

  • 標準ライブラリ

  L initializer_list、アサーションSTLコンテナ、STLアルゴリズム
   STL反復子、ユーティリティ、正規表現...etc

応用として
テンプレート、ジェネリックプログラミング、メタプログラミング、並行処理、タスク...etc

たくさん書きましたが、これらに関連するものや、これ以外にも細かく見ていくと、
キリがないくらいの機能がC++には盛り込まれています。
一つ一つ知っていくのも良いですが、基本的にはコードを書いている最中に
「こうゆう処理ないかな」「無駄を省くために何かできないかな」という場面で
調べて使っていくのが良いかと思われます。

もちろんちゃんと一つ一つ丁寧に学習していけば、
C++以外の言語を触った時に
「この言語ではC++のあの機能と似ている機能ないかな」と
自然と考えることができるようになり、作業が効率化されます。

どう学習していくかは人それぞれだと思いますよ。


3.C++の外部ライブラリ等

現在の代表的な外部ライブラリは「boost」であると思います。
「boost」とは次期C++標準とも言われる程の強力なライブラリの集合です。
具体的にどのようなものが含まれているかというと、

・現在の標準ライブラリに+αな機能を付けて便利にしたり、柔軟な機能を持たせる機能
・標準ライブラリにはない数学や物理等の専門的な式をサクッと使える機能

という感じです。
なので最初のうちはboostは必要ないと思います。
今の標準ライブラリに満足できなくなった時に手を出すべき代物ですね。

外部ライブラリとしては他にも

・POCO(Web開発)
・Qt(クロスプラットフォームアプリ開発)
wxWidgets(クロスプラットフォームGUIライブラリ)
Webkit(ウェブブラウザ用のレイアウトエンジンライブラリ)
・CGAL(計算幾何学)
・QuickFix(金融情報交換)
OpenCV(リアルタイム画像処理)
・Root(高エネルギー物理学)

等があります。

また、C++を用いて手軽にゲームを作りたい!DirectX難しい!
と思っている方には

・UE4(3D特化ゲームエンジン)
・OpneGL(2Dも3Dも)
・Cocos2D-X(2D特化ゲームエンジン)
・Siv3D(2Dも3Dも)
・DxLib(2Dも3Dも)

オヌヌメします。色々調べてみてください。
ちなみに最近のトレンドはUE4です。
UE4ではUnreal C++というC++を更に改良した(らしい)言語が
使えるみたいです。
ただし、某UE4のやばい人曰く、
大体はブループリントでええやん という感じです。

さて、ここまで駆け足でしたがいかがだったでしょうか。
初心者の皆さんはこんなチンケなブログではまだC++のCの字も味わってないと思います。
ですがC++の魅力を少しでもお伝え出来たら光栄であります。
ここまで読んでくださって有難うございました。

次は
shunonymous (@shunonymous) | Twitterさんです。