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でも行うことができますが、
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勉強用の中古パソコンおすすめショップランキング - 水瓶座列車
QTableWidgetクラスの使い方をプログラムをもとに解説 - 水瓶座列車
vimエディタの使い方とインストール手順を解説 - 水瓶座列車