技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

C言語にはないC++独自の文法の簡単な列挙

C++C言語を拡張して開発された言語であり、C++ではオブジェクト指向をサポートする文法が追加されています。
基本的にC言語で使用していた文法はC++でも使用できるので、学習という面で見るとC言語を扱える方であればC++で追加された文法を覚えればC++も扱えるようになります。
 
今回の記事では、C++で追加された文法の中から、主なものを簡単に列挙していきます。
 
なお、javaC#といったオブジェクト指向言語も扱えるのであれば、オブジェクト指向の概念は理解しているはずなので、追加された文法の理解も早いと思います。
java基本情報技術者試験で出題される言語、C#C++と同じく.NET Frameworkでサポートされる言語であり、C++を学ぼうとする方はjavaC#についてある程度の知識があることが多いと思うので、javaC#とも簡単に対比します。
 
・クラスの概念の追加
 C++では、"class クラス名"でクラスを定義することができます。
 javaC#ではお馴染みの、
  アクセス識別子
  コンストラク
  継承
  抽象クラス
  static
 といった機能が使用できます。
 C#で実装されているデストラクタ(オブジェクト破棄時の後処理)
 もC++で使用可能です。
 
 javaC#とは記述方法が若干異なりますが、
 javaC#の経験があれば戸惑うことは少ないと思います。
 ただし、newで確保した領域を意図的にdeleteで破棄する必要がある、
 ということには注意する必要があります。
 忘れるとメモリリークになります。
 (javaC#のようなガベージコレクションの仕組みは無い)
 newはC言語で言うmalloc、deleteはC言語で言うfreeに似ていますが、
 new/deleteの場合はコンストラクタ/デストラクタが呼ばれるという違いがあります。
 
 なお、インターフェースの機能は使用できませんが、
 書き方次第でインターフェースに近いことはできます。
 
・参照の概念の追加
 クラスの概念とも関連があるのですが、
 javaC#ではお馴染みの参照型変数の概念が追加されています。
 
 参照型変数の中身はポインタで、
 C言語ではお馴染みのポインタ型変数とその点では同じなのですが、
 参照型変数の場合は指し示すアドレスを自由に変更できない
 (インクリメント等ができない)という違いがあります。
 この違いにより、ポインタ型変数で犯しがちなミスを減らす効果があります。
 
・スコープ解決演算子の追加
 C++では、変数名やメソッド名の衝突を避けるため、
 スコープ解決演算子(::)を使用します。
 
 例えば、"std::cout"と書いた場合、
 stdという名前空間(クラス名)の
 cout(main関数実行時にシステムにより生成されるオブジェクト名(変数名))
 という意味になります。
 また、外部の自作クラスにアクセスするような場合も、
 このスコープ解決演算子を使用します。
 
 なお、スコープ解決演算子は、
 ソースコードの冒頭で using namespace 名前空間;
 のようにデフォルトの名前空間を指定することで省略可能です。
 
・ストリームの概念の追加
 "<<"で出力ストリーム、">>"で入力ストリーム、という意味となります。
 ("<<"はostreamクラス、">>"はistreamクラスから派生させることで使用できます)
 
 例えば、
 "std::cout << "Hello World!\n";"
 と書けば標準出力に"Hello World!"と出力できますし、
 "std::cin >> hoge;"
 と書けば標準入力を変数"hoge"に渡すことができます。
 
・bool型の追加
 意外にもC言語にはtrue/falseを保持するbool型が用意されていません。
 C++には、java(boolean型)やC#のようにbool型が用意されています。
 
・関数のオーバーロードの追加
 同じ名前の関数でも、関数の引数が異なれば複数定義できます。
 これはjavaC#ではお馴染みの機能です。
 
・例外制御の追加
 C++ではtry~catch構文が用意されています。
 throwで意図的に例外を投げることもできます。
 これもjavaC#ではお馴染みの機能です。
 ただし、finallyは用意されていません。
 finally句で行うようなリソースの解放を行いたい場合は、
 前述のデストラクタや、
 デストラクタで自動的に領域を解放するオブジェクト(スマートポインタ)
 を利用する必要があります。