第1回 C++にあってC言語にない機能

今回は、C++にあってC言語にない機能を採り上げます。といっても、細かい機能については次回以降の関連する記事で説明するとして、今回は比較的大きな機能に限って扱うことにします。

クラス

C++では、クラスキーが struct のクラスを「構造体」、クラスキーが union のクラスを「共用体」と呼びました。しかし、C言語にはクラスという概念はありませんので、構造体や共用体はクラスではなく、別の概念になります。ただし、それはあくまでも考えかただけの話であり、実際にプログラミングで使用する際には同じだと考えても差し支えありません。なお、機能は大幅に制限されています。

まず、コンストラクタやデストラクタを含めて、メンバ関数を定義することができません。静的メンバを定義することもできません。アクセス指定子を使うこともできません。継承もできません。単純にデータメンバを並べることしかできないわけです。

構造体と共用体は後ほど詳しく解説したいと思います。

テンプレート

C言語にはテンプレートの機能はまったくありません。テンプレートの機能に近いことを実現するには、マクロを使うのが普通です。

例外処理

C言語には例外処理はありません。近いことを実現するにはふたつの方法があります。ひとつは goto を使う方法であり、もうひとつは setjmp と longjmp を使う方法です。ただし、goto は関数の外へ分岐することはできません(C++でも同じです)。また、setjmp と longjmp は必ずしも一般的ではありませんので、C++の例外のように、あたりまえのように使われるものではありません。普通は longjmp で関数から飛び出してくることを考慮する必要はないでしょう。

名前空間

C++の名前空間の機能はC言語にはありません。C言語の標準規格にも「名前空間」という用語が出てきますが、まったく別の意味です。すなわち、識別子は次に挙げるどれかの名前空間に属し、異なる名前空間どうしであれば、同じ名前をつけても別物として扱われるというものです。

  • 関数原型
  • ラベル名
  • 構造体、共用体、列挙体のタグ名
  • 構造体と共用体のメンバ
  • その他の識別子

C++における名前空間がないため、関数の外部の有効範囲(いわゆるグローバルなスコープ)は、「大域的名前空間有効範囲」ではなく「ファイル有効範囲」という呼びかたをします。また、クラス有効範囲というものもありませんので、構造体や共用体のメンバは特別な有効範囲に属しているのではなく、(C言語でいうところの)名前空間が異なるという扱いになります。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/563