情報理工学部情報システム工学科 3年 神谷真輝 3年 山下陽平 目次 C++とは? C++におけるオブジェクト指向 課題 C++(C Puls Puls)とは? Cに足りないものが付与されたもの 主にオブジェクト指向 可視制御 共通の名前付け 再利用の仕組み 簡素化 ・・・・今回はこのオブジェクト指向を勉強 します ⇒大規模プログラミングの修正、追加、保守を可能に した C++におけるオブジェクト指向 オブジェクト クラス 属性とメソッド コンストラクタ デストラクタ カプセル化 多相性 継承 C++の基本的な雛形 //hello.cpp(ファイル名) #include<iostream> int main(){ int a; std::cout<<“hello”<<std::endl; std::cin>>a; std::cout<<a<<std::endl; return 0; } 拡張子はcpp iostreamはCでいうstdio.h cout 出力 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> class cardata{ public: char name;// 車の名前 int price;//値段 int capacity;/*定員*/ void ShowData(); //メンバ関数 //クラスないではメンバ関数の //プロトタイプだけが記述でき る void cardata::ShowData(){//メンバ関数の実装 //関数の前にクラス名と2つのコロンをつける、これをス コープ演算子と呼ぶ std::cout<<“車種名:”<<name<<std:: endl; std::cout<<“値段:”<<price<<std::endl; std::cout<<“定員人数:”<<capacity<< std::endl; return 0; } main(){ cardata car1; //cardata型の変数宣言 }; strcpy(car1.name,”イプサム”); car1.price=30000000; car1.capacity=6; return 0; } コンストラクタ(1) クラスの中で定義出来る特殊なメンバ関数 オブジェクトが構築されるときに 自動的に呼び出されるメンバ関数 メンバ変数に初期値を代入するのが 一般的な使い方 コンストラクタ(2) class cardata{ public: char name; int price; int capacity; cardata(int a); }; // コンストラクタの実装 cardata::cardata(int a){ strcpy(name,"未設定 "); price = a; capacity = 0; } コンストラクタ 初期化 // クラスを使う側のコー ド main(){ cardata car1(50000); return 0; } デストラクタ コンストラクタと対で呼び出されるもの オブジェクトがメモリから破棄されるときに 自動的に呼び出される カプセル化(1) オブジェクト(属性とメソッドのセット)の外部か らアクセス出来るのは振る舞いだけにし、直接属性 をアクセス出来ないようにすること カプセル化により、オブジェクト内部属性が隠蔽化 され、外部にはメソッドだけが公開される カプセル化(2) アクセス演算子には private>protected>publicがある。 アクセス演算子により、クラスの利用者に とって必要のないメンバを隠すこと 具体例:リモコン 内部機能 ボタン機能 private: メンバ変数; メンバ関数; public: メンバ変数; メンバ関数; カプセル化の使い方 #include <iostream> // クラスの定義 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);//メンバ変数の値の代入 std::cout<< bk.GetPage() << std::endl; // 不適切な値の代入bk.SetPage(3000); // メンバ変数の値の表示 std::cout<< bk.GetPage() << std::endl; return 0; } 多相性 複数の異なるオブジェクトに同じ名前の送信をして も、それぞれのオブジェクトが固有の振る舞いを実 行して結果を戻す。 今回は多相性を実現する機能の うちの1つのオーバーロードについて勉強 オーバーロード(多相性) オーバーロードを 使わないと // クラスの定義 Calculation obj; 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 * 3; } int a; double b; a = obj. twice(123); b = obj. twice(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); メンバ関数が同じですむ オーバーロードの活用のパターン #include <iostream> void Messages::ShowMessage(char* s, int n){ class Messages{ public: void ShowMessage(); // 引数のないメンバ関数 void ShowMessage(char* s); // 引数1個のメンバ関数 endl; void ShowMessage(char* a, int n); // 引数2個のメンバ関数 }; // メンバ関数の実装 void Messages::ShowMessage(){ std::cout<< “引数ゼロです” << std::endl; return; } void Messages::ShowMessage(char*s){ std::cout<< s << std::endl; return; } int i; for (i=0; i < n; i++){ std::cout<< s << std:: } 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クラスでは、 それぞれ、そのクラス特有の属性が記述されている。 class Normal:public cardata{ 継承(3) 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) メインではどのように書くか main(){ Normal car1;//変数宣言 strcpy(car1.name,“イプサム”); car1.price=2500000; car1.capacity=6; strcpy(car1.carry,”スキー用キャリー”); } 課題 課題(0) Hello Worldと表示するプログラムの作成 課題(1) 名前を入力し、 それを出力するプログラムの作成 課題(2) Personクラスで「名前」、「年齢」を宣言し、 Personクラスを継承し、Teacherクラスでは、 「給料」、Studentクラスでは、「GPA」の属性を 加えて、それぞれ値を入力し出力するプログラムの作成 課題(3) 課題(2)の属性をprivateを使って、カプセル化し、 属性を扱うメソッドを使い、それぞれ値を入力し、出力するプログラムの 作成 課題(4) オリジナルで何か作って!(動的にオブジェクト宣言) (扱う属性の値は、自由にしてかまわないが、わかりやすいものにするこ
© Copyright 2024 ExpyDoc