C++基礎 目次 C++とは? C++におけるオブジェクト指向 課題 C++とは? Cには足りなかったものが付与されて出来た物 具体的には、 情報の隠蔽(カプセル化) 共通の名前付け(関数のオーバーロード) 再利用の仕組み クラスの導入 など オブジェクト指向 C++では大規模なプログラミングの 修正、追加、保守が可能に。 C++におけるオブジェクト指向 オブジェクト クラス 属性とメソッド コンストラクタ デストラクタ カプセル化 多相性 継承 C++の基本的な雛形 拡張子はcpp //hello.cpp(ファイル名) #include<iostream> using namespace std: iostreamはCでいうstdio.h cout 出力 int main(){ int a; cout<<“hello”<<endl; cin>>a; cout<<a<<endl; return 0; } endl 改行 cin 入力 << 出力演算子 >> 入力演算子 オブジェクト オブジェクトとは簡単に言うと、実体がある物 具体的には、教員、学生、車といった物 クラス 個々のオブジェクトに対して、共通の性質を 求めて一緒にした単位。 「車1」「車2」「車3」は「車」というクラスで まとめることが出来る。 オブジェクトを抽象化した物がクラス 属性とメソッド クラス内で定義される物 属性(フィールド) クラスの持つ性質。 車でたとえると、「名前」「定員」など メソッド オブジェクトが持つ機能、振る舞いのこと。 車でたとえると、「走行する」「停車する」など クラスの書き方 struct car{ Cでは構造体 string name;/* 車の名前*/ int price;/*値段*/ int capacity;/*定員*/ }; C++ではクラス class cardata{ public: string name;// 車の名前 int price;//値段 int capacity;/*定員*/ }; 属性 クラスの使い方 #include <iostream> #include <string> using namespace std: class cardata{ public: string name;// 車の名前 int price;//値段 int capacity;/*定員*/ void ShowData(); //メンバ関数 //クラスないではメンバ関数の //プロトタイプだけが記述できる void cardata::ShowData(){//メンバ関数の実装 //関数の前にクラス名と2つのコロンをつける、 //これをスコープ演算子と呼ぶ cout<<“車種名:”<<name<<endl; cout<<“値段:”<<price<<endl; cout<<“定員人数:”<<capacity<< endl; return 0; } main(){ cardata car1; //cardata型の変数宣言 strcpy(car1.name,”イプサム”); car1.price=30000000; car1.capacity=6; }; return 0; } コンストラクタ(1) クラスの中で定義出来る特殊なメンバ関数 オブジェクトが構築されるときに 自動的に呼び出されるメンバ関数 メンバ変数に初期値を代入するのが 一般的な使い方 コンストラクタ(2) class cardata{ public: string name; int price; int capacity; // コンストラクタの実装 cardata::cardata(){ strcpy(name,"未設定 "); price = 500000; capacity = 0; cardata(); }; コンストラクタ } 初期化 // クラスを //使う側のコード main(){ cardata someone; return 0; } デストラクタ コンストラクタと対で呼び出されるもの オブジェクトがメモリから破棄されるときに 自動的に呼び出される カプセル化(1) オブジェクト(属性とメソッドのセット)の外部か らアクセス出来るのは振る舞いだけにし、直 接属性をアクセス出来ないようにすること カプセル化により、オブジェクト内部属性が隠 蔽化され、外部にはメソッドだけが公開される カプセル化(2) アクセス演算子には private>protected>publicがある。 アクセス演算子により、クラスの利用者に とって必要のないメンバを隠すこと 具体例:リモコン 内部機能 ボタン機能 private: メンバ変数; メンバ関数; public: メンバ変数; メンバ関数; カプセル化の使い方 #include <iostream> using namespace std: // クラスの定義 class Book { private: int page; // 内部で用いる変数 public: int GetPage();// ページ数の獲得 void SetPage(int p); // ページ数の設 定 }; // メンバ関数の実装 Int Book::GetPage(){ return page; } void Book::SetPage(int p){ if ((p >=1) && (p <= 1000)){ page = p;}else{cout<< "ページ 数は1~1000で設定して下さい!" << endl; } return; } // クラスを使う側のコード main(){ Book bk; // 適切な値の代入 bk.SetPage(123);//メンバ変数の値の表示 cout<< bk.GetPage() << endl; // 不適切な値の代入bk.SetPage(3000); // メンバ変数の値の表示 cout<< bk.GetPage() << endl; return 0; } 多相性 複数の異なるオブジェクトに同じ名前の送信 をしても、それぞれのオブジェクトが固有の振 る舞いを実行して結果を戻す。 今回は多相性を実現する機能の うちの1つのオーバーロードについて勉強 オーバーロード(多相性) オーバーロードを 使わないと // クラスの定義 Calculation obj; class Calculation { public: int Inttwice(int a); // int型のメンバ関数 double Dbltwice(double a); // double型のメンバ関数 }; // メンバ関数の実装 int Calculation::Inttwice(int a){ return a*2; } double Calculation::Dbltwice(double a){ return a * 2; } int a; double b; a = obj.Inttwice(123); b = obj.Dbltwice(1.23); クラスを使う側は、覚える メンバ関数が多くなる オーバーロード(多相性) オーバーロードを使うと // クラスの定義 Calculation obj; class Calculation{ public: int twice(int a); // int型のメンバ関数 double twice(double a); // double型のメンバ関数 }; int n; int Calculation::twice(int a){ return a * 2; } double Calculation::twice(double a){ return a * 2; } double m; n = obj.twice(314); m = obj.twice(3.14); メンバ関数が同じですむ オーバーロードの活用のパターン void Messages::ShowMessage(char* s, #include <iostream> int n){ using namespace std: class Messages{ int i; public: for (i=0; i < n; i++){ void ShowMessage(); // 引数のないメンバ関数 void ShowMessage(char* s); cout<< s <<endl; // 引数1個のメンバ関数 } void ShowMessage(char* a, int n); // 引数2個のメンバ関数 return; }; } // メンバ関数の実装 void Messages::ShowMessage(){ cout<< “引数ゼロです” << endl; return; } void Messages::ShowMessage(char*s){ cout<< s << endl; return; } // クラス側を使う側のコードmain(){ Messages obj; obj.ShowMessage(); obj.ShowMessage("これは1回"); obj.ShowMessage(“これは5回入力", 5); return 0; } 継承(1) ある性質を引き継ぐこと スーパークラス(親クラス)で定義した性質はサブク ラス(子クラス)に継承することが出来る。 これによってサブクラスでは追加すべき性質だけを 定義すればよくなる 継承の利点 性質の再利用が可能となった。 継承(2) 図で表すとこんな感じ cardataクラス +name +price +capacity Normalクラス Lightクラス Sportsクラス +carry +navi +wheel スーパークラスのcardataには3つのクラスの共通する属性が 書かれており、normalクラス、lightクラス、sportsクラスでは、 それぞれ、そのクラス特有の属性が記述されている。 継承(3) class Normal:public cardata{ public: class cardata{ string carry; }; public: string name; int price; int capacity; }; サ ブ ク ラ ス class Light:public cardata{ public: string navi; }; class Sports:public cardata{ スーパークラス public: char wheel; }; 継承(4) メインではどのように書くか Normal car1;//変数宣言 strcpy(car1.name,“イプサム”); car1.price=2500000; car1.capacity=6; strcpy(car1.carry,”スキー用キャリー”); 課題 課題(0) Hello Worldと表示するプログラムの作成 課題(1) 名前を入力し、 それを出力するプログラムの作成 課題(2) Personクラスで「名前」、「年齢」を宣言し、 Personクラスを継承し、Teacherクラスでは、 「給料」、Studentクラスでは、「GPA」の属性を 加えて、それぞれ値を入力し出力するプログラムの作成 ご清聴ありがとうございました
© Copyright 2024 ExpyDoc