C++におけるOOPを用いた 書き方講座 H108137 山崎貴英 1 今回の内容 OOPとは? C++の超基礎 注釈 書いてあるコードはすべて一部抜粋。 コピペだと動かないよ! 2 OOPとは? Object Oriented Programming オブジェクト指向プログラミング ソフトウェア構成技法の一つ メッセージを送りあう物体の集合として ソフトウェアを構成する技法 3 OOPの言語 Java C++ Objective-C C# Ruby etc… 4 クラスとは? 物体を抽象化したもの 「鈴木一郎」に対する「人間」とか これを基にインスタンスを生成する 基本的に2つのモノを持たせられる 状態を示すフィールド(メンバ変数) 手続きであるメソッド(メンバ関数) 5 クラス定義 class cls{ private: int number; フィールド string name; string *course; public: cls(); メソッド int getNumber(); string getName(); string getCourse(); ~cls(); }; 6 メソッドの実装 メソッドを持つクラス名 メソッド名と引数 int cls :: getNumber() { メソッドの処理 return number; } 7 クラスの使い方 int main() { 宣言 メンバアクセス cls test; cout<<“Number:”<< test.getNumber() <<endl; cout<<"Name :"<<test.getName()<<endl; cout<<"Course:"<<test.getCourse()<<endl; return 0; } 8 「::」について スコープ演算子 スコープとは シンボルが参照可能な有効範囲 (クラス名など)::(シンボル名)でアクセス 以下の三通りでアクセス出来る クラス名 → 名前空間 → グローバル → (クラス名)::(シンボル名) (名前空間名)::(シンボル名) ::(シンボル名) 9 「::」の使い方 class cls{ public: int number; } namespace nmspc{ int number; } int number; int main(){ int number; cls::number=0; nmspc::number=1; ::number=2; number=3 return 0; } クラスのnumber 名前空間のnumber グローバルのnumber 関数内部のnumber 10 「::」の使い方 class cls{ public: int number; } namespace nmspc{ クラスのnumber int number; } int number; 名前空間のnumber int main(){ int number; cls::number=0; nmspc::number=1; グローバルのnumber ::number=2; number=3; return 0; 関数内部のnumber } 11 名前空間とは? スコープの一種 名前がどこに所属するかを定義するもの 名前:クラス、変数、関数などのこと 名前空間を含めることもできる 苗字のようなものと考えればよい 「一郎」という名前を、「鈴木」や「佐藤」で識別する 12 名前空間の使い方 namespace nmspc{ int number; void display(){cout<<“nmspc”<<endl;} class cls{public : int number;}; } int main(){ nmspc::number=0; nmspc::display(); nmspc::cls test; test.number=0; return 0; } 名前空間の定義 13 usingディレクティブ 名前空間の名前を省略できるもの 名前空間nmspcの変数numberに アクセスするにはnmspc::numberとする これを用いることで、numberだけで アクセスすることができるようになる 14 usingの使い方 namespace nmspc{ int number; void display(){cout<<“nmspc”<<endl;} class cls{public : int number;}; } int main(){ using namespace nmspc; number=0; display(); cls test; test.number=0; return 0; } usingディレクティブ nmspcが省略 15 using宣言 usingディレクティブに似たもの こちらは名前空間の一つの シンボルについて省略できるようにする 16 using宣言の使い方 namespace nmspc{ int number; void display(){cout<<“nmspc”<<endl;} class cls{public : int number;}; } int main(){ using nmspc::number; number=0; nmspc::display(); nmspc::cls test; test.number=0; return 0; } using宣言 nmspcが省略 nmspcが 省略できない 17 コンストラクタとは? メソッドの一種 インスタンスが生成されるときに 呼び出される特殊なメソッド クラス名と同名のメソッド フィールドの初期化などを行う 18 コンストラクタの使い方 cls::cls() { フィールド初期化 number=0; name="Unknown"; course=new string("Unknown course."); } コンストラクタは返却値を持たないことに注意。 19 new演算子 インスタンスを生成するための演算子 C++の場合メモリは動的に確保する Cで言うmallocとかその辺 この場合「->」でメンバにアクセスする (クラス名) *(インスタンス名); (インスタンス名)=new (クラス名)(引数); 20 デストラクタとは? メソッドの一種 インスタンスが破棄されるときに 呼び出される特殊なメソッド 「~(クラス名)」という名前 インスタンスが確保したメモリの開放など行う 21 デストラクタの使い方 cls::~cls() メモリ解放 { delete course; } デストラクタも返却値を持たないことに注意。 22 delete演算子 インスタンスを破棄するための演算子 Cで言うfree delete (インスタンス名); 23 継承とは? クラスを基に新しいクラスを定義すること 基となったクラスを基底クラスと呼ぶ 新しいクラスを派生クラスと呼ぶ 24 C++の継承の使い方 基底クラスの可視性 基底クラス名 class cls2 : public cls { private: double gpa; クラス定義 public: cls2():cls(){gpa=0.0;} double getGPA(){return gpa;} }; 25 基底クラスの可視性 派生クラスから見た基底クラスの可視性 public protected 基底クラスの宣言の通り 基底クラスでpublic、protectedの アクセス指定ならprotectedの扱い private すべてprivate扱い 26 基底クラスの可視性の関係 基底クラスの宣言 基 底 ク ラ public ス の protected 可 視 private 性 public protected private public protected private protected protected private private private private 27 カプセル化とは? フィールドやメソッドを隠蔽すること これによりプログラマは必要最低限の フィールドやメソッドを知っていればよくなる アクセス修飾子によりどの程度隠すかを設定 ただしこれはC++におけるカプセル化 他の言語ではアクセス修飾子がないことも 28 アクセス修飾子とは? メンバへのアクセス権を決定する修飾子 public、protected、privateの三種類がある 29 アクセス修飾子について public protected どこからでも何からでもアクセス出来る 宣言されたクラスと、その派生クラスからのみ アクセス出来る private 宣言されたクラスからのみアクセス出来る 30 多相性とは? OOPの持つ性質の一つ 関数や型を複数の型に対して使用できる 今回は多相性のうち2つを説明 オーバーロード オーバーライド 31 オーバーロードとは? 同名メソッド、関数を多重定義すること 引数の型の違い、数の違いにより識別 下のようなこと int twice (int a); メソッド名は 2つとも 「twice」 double twice (double a); 32 オーバーロードの使い方 class cls{ private: int number; string name; public: コンストラクタを オーバーロード cls(); cls(int a); cls(string a); cls(int a,string b); }; 33 オーバーライドとは? メソッドの上書き 基底クラスのメソッドを 派生クラスで上書きすること 返却値、名前、引数すべて同じにする 基底クラスではvirtual修飾子を付けておく このような関数を仮想関数という 34 オーバーライドの使い方 class cls{ virtual修飾子 public: virtual int method(int a,int b){return a+b;} }; class cls2:public cls{ methodメソッドを オーバーライド public: int method(int a,int b){return a*b;} }; 35 純粋仮想関数 純粋仮想関数とは virtual修飾子をつけ、基底クラスでの 定義がない関数のこと 関数の宣言のあと「=0」とする virtual void draw()=0; 36 純粋仮想関数の注意事項 抽象クラス 純粋仮想関数を含むクラス このクラスはインスタンス化できない インスタンス化したい場合 継承したクラスを作る必要がある 継承したクラスでメソッドを再定義する 37 C++の基本形 #include<iostream> int main() { 正直あまりCと 変わらない…… /* 処理記述 */ while文、if文などは Cと同じ return 0; } 38 標準出力と標準入力 標準出力 std::cout std::cout<<“Hello,World!”<<std::endl; 標準入力 std::cin int tmp; std::cin>>tmp; usingディレクティブ使うと…… 39 課題1 名前を入力させ、入力されたら 名前を出力するプログラムを作成せよ 条件 システムの状態がわかるようにすること 実行したら無言で入力待ち、とかは駄目 40 課題2-A Personクラスを作り、 そのデータを表示させよ 条件 Personクラスは以下のフィールドを持つ 名前、年齢 データはプログラムに埋め込む方式で良い データ表示はフィールドにアクセスしても、 一つのメソッドですべてのフィールドを 表示しても良い 41 課題2-B 条件 Personクラスのフィールドの可視性を すべてprivateに設定せよ ユーザからデータの入力を受け付け、 それをコンストラクタで代入せよ 42 課題3 課題2のPersonクラスを継承し、 Studentクラス、Teacherクラスを作成せよ 条件 StudentクラスにはGPA、Teacherクラスには給 料のフィールドを追加すること 追加したデータはprivateに設定すること データの代入はコンストラクタで行うこと これらを含み、データを表示させること 43 課題4 イニシャライザとデフォルト引数の2つを調 べ、課題3の内容に組み込むこと 条件 イニシャライザ、デフォルト引数を用いる 派生クラスでイニシャライザを必ず用いる 44 ラシゼミ恒例課題 C++を用いてオリジナルプログラムを作成 せよ 条件 今回の内容は出来る限り盛り込むこと 努力目標 自分でC++の機能を調べ、それを使うこと 45 提出について 11月10日までに [email protected] このアドレスに提出してください 46
© Copyright 2024 ExpyDoc