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