OOPとC++に触ってみよう
Download
Report
Transcript OOPとC++に触ってみよう
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