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

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
復習ー I (General Review I) クラスとオブジェクトの概念 Concepts of class and object クラスの宣言とオブジェクトの生成 Definition of a class and creation of an object コンストラクタとメソッドのオーバーロー.
C++ 基礎. 目次 C++ とは? C++ におけるオブジェクト指向 課題 C++ とは? Cには足りなかったものが付与されて出来た物 具体的には、 情報の隠蔽(カプセル化) 共通の名前付け(関数のオーバーロード) 再利用の仕組み クラスの導入 など オブジェクト指向 C++ では大規模なプログラミングの.
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
~手続き指向からオブジェクト指向へ(Ⅰ)~
第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス- 鷲見政明.
プログラミング基礎I(再) 山元進.
Javaのための暗黙的に型定義される構造体
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
構造体.
アルゴリズムとプログラミング (Algorithms and Programming)
社会人学習講座 「Javaプログラミング概論」
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
補足説明.
コンパイラの解析 (2) GCJのデータ構造 - 1.
~手続き指向からオブジェクト指向へ[Ⅱ]~
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
第11週:super/subクラス、継承性、メソッド再定義
Nakano School of Business 経営情報ビジネス科 【 Java概論(Test5)】
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
Java8について 2014/03/07.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
もっと詳しくArrayクラスについて調べるには → キーワード検索
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
第8回放送授業.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
メンバとメソッド C言語の構造体 変数の集まり C#言語のクラス + それを処理する関数の集まり フィールド または メンバ変数 メンバ
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
cp-3. サブクラス,継承 (C++ オブジェクト指向プログラミング入門)
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
ソフトウェア工学 知能情報学部 新田直也.
フレンド関数とフレンド演算子.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

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 日までに このアドレスに提出してください