もどる

 ここでは、C++を使用するにあたって、その恩恵を受けるために最低限必要な文法を記載します。

  1. クラスの宣言
  2. 文法:
    class クラス名 {
            プライベート変数とプライベート関数

    public:
            パブリック変数とバブリック関数
    }

    例:
    class human{
            int Age;
    public:
            int SetAge(int Num);
            int HowOldAreYou( );
    }
     C++では変数を宣言するかわりに、クラスを宣言します。クラスとは
    • プログラムで使用する変数をグループ化 したもの(ここまでは構造体宣言と大差ありません)
    • およびその変数の値を参照・更新するための手順
    を宣言したものです。
     基本的に、C++でプログラムを作成する場合は最初にこのクラス設計から始めます。Cでは、とりあえずmain()を書くことから始めますが、C++ではプログラムで使用する変数を大方洗いだしてグループ化し、それを参照・更新するための関数を考え出すことから始めます。ここでプログラムの設計方針をあらかた決めてしまいます。
    【注意!】
     パブリック変数・関数はどのルーチンからもアクセス可能であることを示します。これが一つも無いクラスは誰も参照・更新できません。
     ただし、パブリック“変数”というのはオブジェクト指向で言うところの「データのカプセル化」に反する思想です。誰からもアクセスできるのならば、Cの構造体宣言と同じです。C++のプログラマーは特に性能等でシビアな設計を要求されない限り、パブリック変数は使用してはいけません。

  3. パブリック関数
  4. 文法:
    タイプ クラス名::関数名(引数リスト){
             関数本体;
    }
    例:
    class human{
          int Age;
    public:
          int SetAge(int Num);
          int HowOldAreYou();
    }
    int human::SetAge(int Num){
          Age = Num;
    }
    int human::HowOldAreYou( ){
          return( Age );
    }
     クラスの「パブリック」関数は同一クラスの「プライベート」変数を参照・更新できます。プライベート変数は他からは参照・更新できません。よって、パブリック変数を使用しない限り、他からクラス内のプライベート変数を参照・更新する手段はパブリック関数しかありません。パブリック関数で取り決めたやり方でしかクラス内のデータを触ることはできません。これが、オブジェクト指向で言う「カプセル化」です。
     また(ここで言うと混乱するかもしれませんが)、クラス名が違えば関数名が同じでも、別ものになります。すなわち“自転車::走る( )”と“車::走る( )”では走る( )関数の中身を変えることが可能です。これと後述する関数のオーバーロードによって、オブジェクト指向のもう一つのキーワード「ポリモーフィズム」が実現されています。
     ちなみに、オブジェクト指向にはもう一つ「継承」というキーワードがあります(これも後述)。本稿はC++の文法を解説するものであり、オブジェクト指向のキーワードに関しては別稿で解説します。

  5. インスタンス(実体)とプライベート変数の参照・更新
  6. 文法(インスタンスの宣言):
    クラス名 インスタンス名;
    文法(プライベート変数の参照・更新)
    変数 = インスタンス名.パブリック関数名(引数リスト);
    例:
    class human{
          int Age;
    public:
          int SetAge(int Num);
          int HowOldAreYou();
    }
    int human::SetAge(int Num){
          Age = Num;
    }
    int human::HowOldAreYou( ){
          return( Age );
    }
    main(){
          int OutAge;
          human MrNomo;
          MrNomo.SetAge( 20 );
          OutAge = MrNomo.HowOldAreYou( );
    }
     クラスを宣言しただけでは実体がありません。これは構造体宣言と同じです。上の例では"human MrNomo;"の部分で初めて、humanクラスの性質を持ったMrNomoという実体が出来上がったことになります。
     では、MrNomoのAgeの値を参照したい場合はどうしたら良いのでしょう?
     プライベート変数は直接さわることはできませんから、構造体宣言の様に"MrNomo.Age = 20;" というような表現はできません 。必ずプライベート変数を参照・更新するためのパブリック関数を用意して、パブリック関数によって参照・更新します。Cでは“変数 = 関数( );”の形式ですが、C++では"変数 = インスタンス名.パブリック関数名(引数リスト);"と表現します。
     このように常にインスタンスを意識してパブリック関数を使う点がC++の特徴です。これがオブジェクト指向と呼ばれる由縁ですが、実際に使ってみると、想像以上にプログラミングの印象が変わってきます。

  7. パブリック関数の特別な形式・コンストラクタとデストラクタ
  8. 文法(コンストラクタ):
    タイプ クラス名::クラス名(引数リスト){ };
    文法(デストラクタ):
    タイプ クラス名::~クラス名(引数リスト){ };
    例:
    class human{
          int Age;
    public:
          void human( );
          void ~human( );
          int SetAge(int Num);
          int HowOldAreYou();
    }
    void human::human( ){
          Age = 0;
    }
    void human::~human( ){
          ・・・
    }
    main( ){
          human MrNomo;
          ・・・
    }
     コンストラクタとデストラクタは、呼ばれた場合の処理を記述しますが、main関数内で陽に呼ぶことはありません。上の例では、"human MrNomo;"でインスタンスを生成した時点でコンストラクタが呼ばれます。よって、インスタンスを生成した時点では、常にAgeは0になっています。
     逆にデストラクタはインスタンスが消滅する時点で呼ばれます。上ではmain関数を抜ける時点で呼ばれます。共有メモリなどの解放し忘れを回避するためには有効な手段です。

  9. クラスの継承
  10. 文法:
    class クラス名 : public 親クラス名{
    }
    例:
    class human{
          int Age;
    public:
          int SetAge(int Num);
          int HowOldAreYou();
    }
    ・・・
    class workman : public human{
          int salary;
    public:
          int HowMuchYouGet();
    }
    main( ){
          workman MrBill;
          MrBill.SetAge( 30 );
          ・・・
    }
     継承とは親のクラスの宣言を受け継ぐことです。上の例では、workmanはhumanを継承しているため、Ageというデータを内含しています。またそれを更新する手段(ここではSetAge)も継承しているので、上の様な使い方ができます。子クラスは自分で作ったプライベート変数の参照・更新手段さえ作成すれば良いのです。これを「差分プログラミング」と呼びます。
    【注意!】
     クラスの継承ではclass クラス名 : public 親クラス名{ }という様に"public"というオマジナイが必要です。実はこのオマジナイを付けなくても親子の継承関係は成立しますが、ちょっと不都合な事が起きるのです。興味のある人は調べてみてください。ここでは、「常に"public"と記述するもんだ」くらいに考えていただいて何等問題ありません。

  11. 関数のオーバロード
  12. 文法:
    タイプ クラス名::関数名(引数リスト1){・・・};
    タイプ クラス名::関数名(引数リスト2){・・・}; (関数名は同じ、引数は違う)
    例:
    class human{
          int Age;
    public:
          int SetAge( );
          int SetAge(int Num);
          int HowOldAreYou();
    }
    int human::SetAge( ){
          Age = 100;
    }
    int human::SetAge(int Num){
          Age = Num;
    }
    main( ){
          int InAge = 0;
          human MrNomo,MrBill;
          MrNomo.SetAge(InAge);
          MrBill.SetAge( );
          ・・・
    }
     同一クラス・同一関数名でありながら、引数の数やタイプが違う場合は別関数として動作させることができます。上の場合、MrNomoのAgeは0、MrBillのAgeは100になります。Cではよく引数が文字列か整数値かで、StrToInt( )とかIntToStr( )という様に関数名を変えますが、C++の場合、Chang( )という様な一つの関数名で良くなります。引数が文字列か数値かで別々の関数が呼ばれます。これは機能を拡張する様な場合、非常に便利ですが、多用するとプログラムが読みづらくなります。また、あまりにも違う機能に対して同一関数名を用いると誤解を招くため、注意が必要です。

     これだけの文法を使うだけでもC++の便利さを実感できます。ぜひ自分の手でプログラムを作ってみてください。
     他にもフレンド関数・インライン関数といったトピックスがありますが、興味があれば専門書をお読みください。

禁 無断転載 (C)1997 宮川 清嗣