文法:C++では変数を宣言するかわりに、クラスを宣言します。クラスとは
class クラス名 {
プライベート変数とプライベート関数
public:
パブリック変数とバブリック関数
}
例:
class human{
int Age;
public:
int SetAge(int Num);
int HowOldAreYou( );
}
文法:クラスの「パブリック」関数は同一クラスの「プライベート」変数を参照・更新できます。プライベート変数は他からは参照・更新できません。よって、パブリック変数を使用しない限り、他からクラス内のプライベート変数を参照・更新する手段はパブリック関数しかありません。パブリック関数で取り決めたやり方でしかクラス内のデータを触ることはできません。これが、オブジェクト指向で言う「カプセル化」です。
タイプ クラス名::関数名(引数リスト){
関数本体;
}
例:
class human{
int Age;
public:
int SetAge(int Num);
int HowOldAreYou();
}
int human::SetAge(int Num){
Age = Num;
}
int human::HowOldAreYou( ){
return( Age );
}
文法(インスタンスの宣言):クラスを宣言しただけでは実体がありません。これは構造体宣言と同じです。上の例では"human MrNomo;"の部分で初めて、humanクラスの性質を持ったMrNomoという実体が出来上がったことになります。
クラス名 インスタンス名;
文法(プライベート変数の参照・更新)
変数 = インスタンス名.パブリック関数名(引数リスト);
例:
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( );
}
文法(コンストラクタ):コンストラクタとデストラクタは、呼ばれた場合の処理を記述しますが、main関数内で陽に呼ぶことはありません。上の例では、"human MrNomo;"でインスタンスを生成した時点でコンストラクタが呼ばれます。よって、インスタンスを生成した時点では、常にAgeは0になっています。
タイプ クラス名::クラス名(引数リスト){ };
文法(デストラクタ):
タイプ クラス名::~クラス名(引数リスト){ };
例:
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;
・・・
}
文法:継承とは親のクラスの宣言を受け継ぐことです。上の例では、workmanはhumanを継承しているため、Ageというデータを内含しています。またそれを更新する手段(ここではSetAge)も継承しているので、上の様な使い方ができます。子クラスは自分で作ったプライベート変数の参照・更新手段さえ作成すれば良いのです。これを「差分プログラミング」と呼びます。
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 );
・・・
}
文法:同一クラス・同一関数名でありながら、引数の数やタイプが違う場合は別関数として動作させることができます。上の場合、MrNomoのAgeは0、MrBillのAgeは100になります。Cではよく引数が文字列か整数値かで、StrToInt( )とかIntToStr( )という様に関数名を変えますが、C++の場合、Chang( )という様な一つの関数名で良くなります。引数が文字列か数値かで別々の関数が呼ばれます。これは機能を拡張する様な場合、非常に便利ですが、多用するとプログラムが読みづらくなります。また、あまりにも違う機能に対して同一関数名を用いると誤解を招くため、注意が必要です。
タイプ クラス名::関数名(引数リスト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( );
・・・
}
これだけの文法を使うだけでもC++の便利さを実感できます。ぜひ自分の手でプログラムを作ってみてください。
他にもフレンド関数・インライン関数といったトピックスがありますが、興味があれば専門書をお読みください。