Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 C++ における OOP を用いた 書き方講座 H108137 山崎貴英. 2 今回の内容 OOP とは? C++ の超基礎 注釈 書いてあるコードはすべて一部抜粋。 コピペだと動かないよ!

Similar presentations


Presentation on theme: "1 C++ における OOP を用いた 書き方講座 H108137 山崎貴英. 2 今回の内容 OOP とは? C++ の超基礎 注釈 書いてあるコードはすべて一部抜粋。 コピペだと動かないよ!"— Presentation transcript:

1 1 C++ における OOP を用いた 書き方講座 H108137 山崎貴英

2 2 今回の内容 OOP とは? C++ の超基礎 注釈 書いてあるコードはすべて一部抜粋。 コピペだと動かないよ!

3 3 OOP とは? Object Oriented Programming オブジェクト指向プログラミング ソフトウェア構成技法の一つ メッセージを送りあう物体の集合として ソフトウェアを構成する技法

4 4 OOP の言語 Java C++ Objective-C C# Ruby etc …

5 5 クラスとは? 物体を抽象化したもの 「鈴木一郎」に対する「人間」とか これを基にインスタンスを生成する 基本的に 2 つのモノを持たせられる 状態を示すフィールド(メンバ変数) 手続きであるメソッド(メンバ関数)

6 6 クラス定義 class cls{ private: int number; string name; string *course; public: cls(); int getNumber(); string getName(); string getCourse(); ~cls(); }; フィールド メソッド

7 7 メソッドの実装 int cls :: getNumber() { return number; } メソッドを持つクラス 名 メソッド名と引数 メソッドの処 理

8 8 クラスの使い方 int main() { cls test; cout<< “ Number: ” << test.getNumber() <<endl; cout<<"Name :"<<test.getName()<<endl; cout<<"Course:"<<test.getCourse()<<endl; return 0; } 宣言 メンバアクセ ス

9 9 「 :: 」について スコープ演算子 スコープとは シンボルが参照可能な有効範囲 (クラス名など) :: (シンボル名)でア クセス 以下の三通りでアクセス出来る クラス名 → (クラス名) :: (シンボル 名) 名前空間 → (名前空間名) :: (シンボル 名) グローバル → :: (シンボル名)

10 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 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 12 名前空間とは? スコープの一種 名前がどこに所属するかを定義するも の 名前:クラス、変数、関数などのこと 名前空間を含めることもできる 苗字のようなものと考えればよい 「一郎」という名前を、「鈴木」や「佐藤」で 識別する

13 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 14 using ディレクティブ 名前空間の名前を省略できるもの 名前空間 nmspc の変数 number に アクセスするには nmspc::number とする これを用いることで、 number だけで アクセスすることができるようになる

15 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 16 using 宣言 using ディレクティブに似たもの こちらは名前空間の一つの シンボルについて省略できるようにする

17 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 18 コンストラクタとは? メソッドの一種 インスタンスが生成されるときに 呼び出される特殊なメソッド クラス名と同名のメソッド フィールドの初期化などを行う

19 19 コンストラクタの使い方 cls::cls() { number=0; name="Unknown"; course=new string("Unknown course."); } フィールド初期 化 コンストラクタは返却値を持たないことに注 意。

20 20 new 演算子 インスタンスを生成するための演算子 C++ の場合メモリは動的に確保する C で言う malloc とかその辺 この場合「 -> 」でメンバにアクセスす る (クラス名) * (インスタンス名) ; (インスタンス名) =new (クラス名) (引数) ;

21 21 デストラクタとは? メソッドの一種 インスタンスが破棄されるときに 呼び出される特殊なメソッド 「 ~ (クラス名)」という名前 インスタンスが確保したメモリの開放など 行う

22 22 デストラクタの使い方 cls::~cls() { delete course; } メモリ解放 デストラクタも返却値を持たないことに注意。

23 23 delete 演算子 インスタンスを破棄するための演算子 C で言う free delete (インスタンス名) ;

24 24 継承とは? クラスを基に新しいクラスを定義する こと 基となったクラスを基底クラスと呼ぶ 新しいクラスを派生クラスと呼ぶ

25 25 C++ の継承の使い方 class cls2 : public cls { private: double gpa; public: cls2():cls(){gpa=0.0;} double getGPA(){return gpa;} }; 基底クラスの可視性 基底クラス名 クラス定義

26 26 基底クラスの可視性 派生クラスから見た基底クラスの可視 性 public 基底クラスの宣言の通り protected 基底クラスで public 、 protected の アクセス指定なら protected の扱い private すべて private 扱い

27 27 基底クラスの可視性の関係 publicprotectedprivate public protectedprivate protected private 基底クラスの宣言

28 28 カプセル化とは? フィールドやメソッドを隠蔽すること これによりプログラマは必要最低限の フィールドやメソッドを知っていればよく なる アクセス修飾子によりどの程度隠すかを設 定 ただしこれは C++ におけるカプセル化 他の言語ではアクセス修飾子がないことも

29 29 アクセス修飾子とは? メンバへのアクセス権を決定する修飾 子 public 、 protected 、 private の三種類がある

30 30 アクセス修飾子について public どこからでも何からでもアクセス出来る protected 宣言されたクラスと、その派生クラスから のみアクセス出来る private 宣言されたクラスからのみアクセス出来る

31 31 多相性とは? OOP の持つ性質の一つ 関数や型を複数の型に対して使用できる 今回は多相性のうち 2 つを説明 オーバーロード オーバーライド

32 32 オーバーロードとは? 同名メソッド、関数を多重定義するこ と 引数の型の違い、数の違いにより識別 下のようなこと int twice (int a); double twice (double a); メソッド名 は 2 つとも 「 twice 」

33 33 オーバーロードの使い方 class cls{ private: int number; string name; public: cls(); cls(int a); cls(string a); cls(int a,string b); }; コンストラクタ をオーバーロー ド

34 34 オーバーライドとは? メソッドの上書き 基底クラスのメソッドを 派生クラスで上書きすること 返却値、名前、引数すべて同じにする 基底クラスでは virtual 修飾子を付けてお く このような関数を仮想関数という

35 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 36 純粋仮想関数 純粋仮想関数とは virtual 修飾子をつけ、基底クラスでの 定義がない関数のこと 関数の宣言のあと「 =0 」とする virtual void draw()=0;

37 37 純粋仮想関数の注意事項 抽象クラス 純粋仮想関数を含むクラス このクラスはインスタンス化できない インスタンス化したい場合 継承したクラスを作る必要がある 継承したクラスでメソッドを再定義する

38 38 C++ の基本形 #include int main() { /* 処理記述 */ return 0; } 正直あまり C と 変わらない …… while 文、 if 文などは C と同じ

39 39 標準出力と標準入力 標準出力 std::cout 標準入力 std::cin std::cout<< “ Hello,World! ” <<std::endl; int tmp; std::cin>>tmp; using ディレクティブ使うと ……

40 40 課題 1 名前を入力させ、入力されたら 名前を出力するプログラムを作成せよ 条件 システムの状態がわかるようにすること 実行したら無言で入力待ち、とかは駄目

41 41 課題 2 - A Person クラスを作り、 そのデータを表示させよ 条件 Person クラスは以下のフィールドを持つ 名前、年齢 データはプログラムに埋め込む方式で良い データ表示はフィールドにアクセスしても、 一つのメソッドですべてのフィールドを 表示しても良い

42 42 課題 2 - B 条件 Person クラスのフィールドの可視性を すべて private に設定せよ ユーザからデータの入力を受け付け、 それをコンストラクタで代入せよ

43 43 課題 3 課題 2 の Person クラスを継承し、 Student クラス、 Teacher クラスを作成 せよ 条件 Student クラスには GPA 、 Teacher クラスに は給料のフィールドを追加すること 追加したデータは private に設定すること データの代入はコンストラクタで行うこと これらを含み、データを表示させること

44 44 課題 4 イニシャライザとデフォルト引数の 2 つ を調べ、課題 3 の内容に組み込むこと 条件 イニシャライザ、デフォルト引数を用いる 派生クラスでイニシャライザを必ず用いる

45 45 ラシゼミ恒例課題 C++ を用いてオリジナルプログラムを 作成せよ 条件 今回の内容は出来る限り盛り込むこと 努力目標 自分で C++ の機能を調べ、それを使うこと

46 46 提出について 11 月 10 日までに h108137@st.chukyo-u.ac.jp このアドレスに提出してください


Download ppt "1 C++ における OOP を用いた 書き方講座 H108137 山崎貴英. 2 今回の内容 OOP とは? C++ の超基礎 注釈 書いてあるコードはすべて一部抜粋。 コピペだと動かないよ!"

Similar presentations


Ads by Google