水瓶座列車

どこまで行けるか、とりあえず発車します。

C++のクラス構造の解説とプログラミングの始め方

 

C++は、オブジェクト指向言語なので、プログラミングを行うためには、

クラス構造を理解する必要があります。

クラスの構造を理解すると、C言語よりもC++の方がプログラミングは、やりやすいと思います。

それでは、C++のクラス構造の解説とプログラミングの始め方について、解説していきます。

 

 

 

 

1.クラス構造について

 

まず始めに、C++の基本であるクラス構造について、クラス構造について、理解する必要があります。

 

クラス構造は、例えばこんな感じです。

class Sample {
  public:
    Sample();         // コンストラクタ
    ~Sample();         // デストラクタ
    void setMember( int a ) { iNumber = a ; } // 外部公開の関数
    int getMember() { return iNumeber; }    // 外部公開の関数   private:
    testfunction();   // 自クラス内だけで使用できる関数
    int iNumber;    // 自クラス内だけで使用できるメンバ変数   protected:     string strNumber; // 自クラスト継承先クラスも使用できるメンバ変数 }

 

クラス構造で、まず理解することは、アクセス指定子のpublic、private、protectedです。

publicの後に宣言した関数やメンバ変数は、外部公開となり他のクラスからアクセスすることができます。

privateの後に宣言した関数やメンバ変数は、自分のクラス内でのみ使用することができます。

なので、他のクラスからアクセスすることができません。

protectedの後に宣言した関数やメンバ変数は、外部からアクセスはできませんが、

派生クラスからは、アクセスすることができます。

ここでは、派生クラスについての説明は省略します。

また、public、private、protectedを宣言していない区間は、private区間になります。

 

イメージとしては、こんな感じです。

 

 

2.インスタンスについて

 

C++のプログラムは、C言語と同じようにmain()関数から始まります。

main()関数から、クラスのインスタンスを生成して、そこから処理が広がっていくように、

プログラミングを行っていきます。

クラスのインスタンスを生成するとは、実体化するという意味で、

下記のように2種類の方法があります。

Sample pSample = new Sample(); // 静的メモリで実体化
Sample sample;          // 動的メモリで実体化

 

インスタンスを生成する際には、上記のように、

new演算子を使用する場合と、使用しない場合で、生成することができます。

new演算子を使用すると、クラスが静的にメモリ確保されますので、delete演算子を使用して、

自分でメモリ開放を行うまで、関数を抜けたとしてもクラス内の値がずっと保持されます。

new演算子を使用しない場合は、動的メモリに確保されますので、

関数を抜けると、メモリが解放されて、クラス内の値も保持されません。

 

new演算子インスタンスを生成した場合は、処理が終了してから必ずdelete演算子を使用します。

もしdelete演算子を使用しなければ、メモリリークになりバグの原因になりますので、注意してください。

 

 

3.コンストラクタについて

 

コンストラクタは、クラスのインスタンスが生成された時に実行される関数で、

主にクラスのメンバ変数の初期化や初期処理を行います。

例えば、こんな感じです。

Sample::Sample(){  // コンストラクタ
  iNumber = 1000;
} int main() {   Sample pSample = new Sample(); // <- この時点でコンストラクタが実行される。
  Sample sample; // <- この時点でコンストラクタが実行される。
}

 

もしコンストラクタで、行いたい処理がなければ、空関数でも大丈夫です。

 

 

4.デストラクタについて

 

デストラクタは、インスタンスを破棄する際に実行される関数で、

主にクラス内で生成したインスタンスのメモリ解放や、

malloc()関数などを使用したメンバ変数のメモリ解放を行います。

Sample::Sample(){
  iNumber = 1000;
}
Sample::~Sample(){ // デストラクタ
} int main() {   Sample pSample = new Sample(); // <- この時点でコンストラクタが実行される。
  delete pSample;  // <- この時点で、デストラクタ関数が実行される。 }

 

もしデストラクタで、行いたい処理がなければ、空関数でも大丈夫です。

 

 

5.クラスの外部公開関数にアクセスする

 

クラス構造を把握した後は、別のクラスからアクセスできる外部公開関数を作成します。

C++のプログラミングを行う場合は、クラスにどのような外部公開関数を設計するか、

また、プログラムを読む場合には、どのような外部公開関数があるかを見ておく必要があります。

ここでは、外部公開関数として、よく作成されるセッターやゲッターという関数について、

解説していきます。

セッターやゲッターの関数は、関数名にgetやsetを頭に付け、関数処理も短いので、

ほとんどの場合、下記のようにクラス定義内に記述します。

class Sample {
  public:
    Sample();         // コンストラクタ
    ~Sample();         // デストラクタ
    void setMember( int a ) { iNumber = a ; } // セッター
    int getMember() { return iNumeber; }    // ゲッター
  private:
    int iNumber; // プライベートのメンバ変数
  protected:
    string strNumber; // プロテクテッドのメンバ変数
}

 

セッター/ゲッターの用途としては、簡単で、

・セッターは、クラスのプライベートメンバ変数に、外部から値をセットする関数

・ゲッターは、クラスのプライベートメンバ変数の値を外部に渡す関数

です。

 

new演算子を使用した場合の外部公開のアクセスのやり方は、

下記のように、インスタンスを制した後、クラス変数の後に「->」を入れて、続けて関数名を書きます。

Sample pSample = new pSample();
pSample->setNumber( 500 );

 

new演算子を使用しない場合の外部公開のアクセスのやり方は、

下記のように、クラス変数の後に「. (ドット)」を入れて、続けて関数名を書きます。

Sample pSample;
pSample.setNumber( 500 );

 

 

6.C++のプログラミングの始め方

 

C++のプログラミングの始め方は、Windowsでも行うことができますが、

UbuntuのようなLinuxで行う方が良いです。

LinuxでもWindowsでも、C++コンパイラが必要になります。

 

LinuxであるUbuntu上でのコンパイラがあるかどうかの確認は、下記で見ることができます。

$ g++ --version

 

バージョンが表示されずにg++のコマンドが無ければ、下記のようにインストールします。

$ sudo apt -y install g++

 

Windowsの場合は、下記リンクで、コンパイル環境を構築することができますので、

WindowsでC言語のプログラミング環境構築手順 - 水瓶座列車

で、参考にしてみてください。

 

ここでは、Ubuntuを使用して、5項のクラスの外部公開関数であるゲッターとセッターを使用した、

下記のような簡単なプログラムを作成してみました。

/** sample.cpp **/
class Sample {
  public:
    Sample();         // コンストラクタ
    ~Sample();         // デストラクタ
    void setMember( int a ) { iNumber = a ; } // セッター
    int getMember() { return iNumeber; }    // ゲッター
  private:
    int iNumber; // プライベートのメンバ変数
  protected:
    string strNumber; // プロテクテッドのメンバ変数
}

Sample::Sample(){
  std::cout << "コンストラクタ\n";
  iNumber = 1000;
}
Sample::~Sample(){
  std::cout << "デストラクタ\n";
}

int main() {
  int num = 0;

  Sampel pSample = new Sample();
  std::cout << "getNumber:" <<  pSample->getNumber() << "\n" ;
  pSample->setNumber( 200 );
  std::cout << "getNumber:" <<  pSample->getNumber() << "\n" ;
  delete pSample;

  Sampel sample;
  std::cout << "getNumber:" <<  sample.getNumber() << "\n" ;
  sample.setNumber( 500 );
  std::cout << "getNumber:" <<  sample.getNumber() << "\n" ;

  return 0;
}

 

上記のプログラムをコンパイルし実行してみます。

コンパイルは、下記です。

$ g++ sample.cpp

 

実行は、下記です。

$ ./a.out

 

実行結果は、下図のようになります。

 

このプログラムでは、コンストラクタ/デストラクタがコールされるタイミングと、

外部公開関数のコールのやり方を理解することができます。

 

アプリケーションは、多数のクラスから構成されますので、

C++のプログラミングを0から始める際には、必ずクラス設計から始まります。

次に、クラス間でどのように処理を行っていくかを検討し、プログラミングを行っていきます。

また、C++のプログラムを読む場合には、どのようなクラスがあるか、

クラス間の関係はどのようになっているかを、クラス図などでクラス関係を把握し、

クラス図が無ければ、自分で大まかなクラス図を書いて理解していくと良いです。

 

 

7.最後に

 

C++のプログラミングは、C言語の文法が理解できていると、クラスの概念さえ理解できれば、

大まかにできるようになります。

理解できるまで時間がかかると思いますが、勉強を続けることが大切なので、頑張ってみてください。

 

 

<関連・おすすめ記事>

Qt5とQtCreatorをUbuntu20.04にインストールする手順と使い方を解説 - 水瓶座列車

Linux勉強用の中古パソコンおすすめショップランキング - 水瓶座列車

Qtで入力した文字を取り込むやり方 - 水瓶座列車

QTableWidgetクラスの使い方をプログラムをもとに解説 - 水瓶座列車

vimエディタの使い方とインストール手順を解説 - 水瓶座列車