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