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