C++

情報理工学部情報システム工学科
3年 神谷真輝
3年 山下陽平
目次
 C++とは?
 C++におけるオブジェクト指向
 課題
C++(C Puls Puls)とは?
 Cに足りないものが付与されたもの
 主にオブジェクト指向




可視制御
共通の名前付け
再利用の仕組み
簡素化
・・・・今回はこのオブジェクト指向を勉強
します
⇒大規模プログラミングの修正、追加、保守を可能に
した
C++におけるオブジェクト指向








オブジェクト
クラス
属性とメソッド
コンストラクタ
デストラクタ
カプセル化
多相性
継承
C++の基本的な雛形
//hello.cpp(ファイル名)
#include<iostream>
int main(){
int a;
std::cout<<“hello”<<std::endl;
std::cin>>a;
std::cout<<a<<std::endl;
return 0;
}
拡張子はcpp
iostreamはCでいうstdio.h
cout
出力
endl
改行
cin 入力
<<
>>
出力演算子
入力演算子
オブジェクト
 オブジェクトとは簡単に言うと、実体がある物
具体的には、教員、学生、車といった物
クラス
 個々のオブジェクトに対して、共通の性質を求めて
一緒にした単位。
 「車1」「車2」「車3」は「車」というクラスで
まとめることが出来る。
 オブジェクトを抽象化した物がクラス
属性とメソッド
 クラス内で定義される物
 属性(フィールド)
クラスの持つ性質。
車でたとえると、「名前」「定員」など
 メソッド
オブジェクトが持つ機能、振る舞いのこと。
車でたとえると、「走行する」「停車する」など
クラスの書き方
struct car{
 Cでは構造体
string name;/* 車の名前*/
int price;/*値段*/
int capacity;/*定員*/
};
 C++ではクラス
class cardata{
public:
string name;// 車の名前
int price;//値段
int capacity;/*定員*/
};
属性
クラスの使い方
#include <iostream>
#include <string>
class cardata{
public:
char name;// 車の名前
int price;//値段
int capacity;/*定員*/
void ShowData();
//メンバ関数
//クラスないではメンバ関数の
//プロトタイプだけが記述でき
る
void cardata::ShowData(){//メンバ関数の実装
//関数の前にクラス名と2つのコロンをつける、これをス
コープ演算子と呼ぶ
std::cout<<“車種名:”<<name<<std::
endl;
std::cout<<“値段:”<<price<<std::endl;
std::cout<<“定員人数:”<<capacity<<
std::endl;
return 0;
}
main(){
cardata car1;
//cardata型の変数宣言
};
strcpy(car1.name,”イプサム”);
car1.price=30000000;
car1.capacity=6;
return 0;
}
コンストラクタ(1)
 クラスの中で定義出来る特殊なメンバ関数
 オブジェクトが構築されるときに
自動的に呼び出されるメンバ関数
 メンバ変数に初期値を代入するのが
一般的な使い方
コンストラクタ(2)
class cardata{
public:
char name;
int price;
int capacity;
cardata(int a);
};
// コンストラクタの実装
cardata::cardata(int
a){
strcpy(name,"未設定
");
price = a;
capacity = 0;
}
コンストラクタ
初期化
// クラスを使う側のコー
ド
main(){
cardata car1(50000);
return 0;
}
デストラクタ
 コンストラクタと対で呼び出されるもの
 オブジェクトがメモリから破棄されるときに
自動的に呼び出される
カプセル化(1)
 オブジェクト(属性とメソッドのセット)の外部か
らアクセス出来るのは振る舞いだけにし、直接属性
をアクセス出来ないようにすること
 カプセル化により、オブジェクト内部属性が隠蔽化
され、外部にはメソッドだけが公開される
カプセル化(2)
 アクセス演算子には
private>protected>publicがある。
 アクセス演算子により、クラスの利用者に
とって必要のないメンバを隠すこと
 具体例:リモコン
内部機能
ボタン機能
private:
メンバ変数;
メンバ関数;
public:
メンバ変数;
メンバ関数;
カプセル化の使い方
#include <iostream>
// クラスの定義
class Book {
private:
int page; // 内部で用いる変数
public:
int GetPage();// ページ数の獲得
void SetPage(int p); // ページ数の設
定
};
// メンバ関数の実装
Int Book::GetPage(){
return page;
}
void Book::SetPage(int p){
if ((p >=1) && (p <= 1000)){
page = p;
}else{
cout<< "ページ数は1~1000で設
定して下さい!" << endl;
}
return;
// クラスを使う側のコード
main(){
Book bk;
// 適切な値の代入
bk.SetPage(123);//メンバ変数の値の代入
std::cout<< bk.GetPage() << std::endl;
// 不適切な値の代入bk.SetPage(3000);
// メンバ変数の値の表示
std::cout<< bk.GetPage() << std::endl;
return 0;
}
多相性
 複数の異なるオブジェクトに同じ名前の送信をして
も、それぞれのオブジェクトが固有の振る舞いを実
行して結果を戻す。
 今回は多相性を実現する機能の
うちの1つのオーバーロードについて勉強
オーバーロード(多相性)
 オーバーロードを
使わないと
// クラスの定義
Calculation obj;
class Calculation {
public:
int twice(int a);
// int型のメンバ関数
double twice(double a);
// double型のメンバ関数
};
// メンバ関数の実装
int Calculation::twice(int a){
return a*2;
}
double Calculation::twice(double a){
return a * 3;
}
int a;
double b;
a = obj. twice(123);
b = obj. twice(1.23);
クラスを使う側は、覚える
メンバ関数が多くなる
オーバーロード(多相性)
 オーバーロードを使う
と
// クラスの定義
Calculation obj;
class Calculation{
public:
int twice(int a);
// int型のメンバ関数
double twice(double a);
// double型のメンバ関数
};
int n;
int Calculation::twice(int a){
return a * 2;
}
double Calculation::twice(double
a){
return a * 2;
}
double m;
n = obj.twice(314);
m = obj.twice(3.14);
メンバ関数が同じですむ
オーバーロードの活用のパターン
#include <iostream>
void Messages::ShowMessage(char* s,
int n){
class Messages{
public:
void ShowMessage(); // 引数のないメンバ関数
void ShowMessage(char* s);
// 引数1個のメンバ関数
endl;
void ShowMessage(char* a, int n);
// 引数2個のメンバ関数
};
// メンバ関数の実装
void Messages::ShowMessage(){
std::cout<< “引数ゼロです” << std::endl;
return;
}
void Messages::ShowMessage(char*s){
std::cout<< s << std::endl;
return;
}
int i;
for (i=0; i < n; i++){
std::cout<< s << std::
}
return;
}
// クラス側を使う側のコードmain(){
Messages obj;
obj.ShowMessage();
obj.ShowMessage("これは1回");
obj.ShowMessage(“これは5回入力", 5);
return 0;
}
継承(1)
 ある性質を引き継ぐこと
 スーパークラス(親クラス)で定義した性質は
サブクラス(子クラス)に継承することが出来
る。
これによってサブクラスでは追加すべき性質だ
けを定義すればよくなる
 継承の利点
性質の再利用が可能となった。
継承(2)
 図で表すとこんな感じ
cardataクラス
+name
+price
+capacity
Normalクラス
Lightクラス
Sportsクラス
+carry
+navi
+wheel
スーパークラスのcardataには3つのクラスの共通する属性が
書かれており、normalクラス、lightクラス、sportsクラスでは、
それぞれ、そのクラス特有の属性が記述されている。
class Normal:public cardata{
継承(3)
public:
class cardata{
string carry;
};
public:
string name;
int price;
int capacity;
};
サ
ブ
ク
ラ
ス
class Light:public cardata{
public:
string navi;
};
class Sports:public cardata{
スーパークラス
public:
char wheel;
};
継承(4)
 メインではどのように書くか
main(){
Normal car1;//変数宣言
strcpy(car1.name,“イプサム”);
car1.price=2500000;
car1.capacity=6;
strcpy(car1.carry,”スキー用キャリー”);
}
課題
 課題(0)
Hello Worldと表示するプログラムの作成
 課題(1)
名前を入力し、
それを出力するプログラムの作成
 課題(2)
Personクラスで「名前」、「年齢」を宣言し、
Personクラスを継承し、Teacherクラスでは、
「給料」、Studentクラスでは、「GPA」の属性を
加えて、それぞれ値を入力し出力するプログラムの作成
 課題(3)
課題(2)の属性をprivateを使って、カプセル化し、
属性を扱うメソッドを使い、それぞれ値を入力し、出力するプログラムの
作成
 課題(4)
オリジナルで何か作って!(動的にオブジェクト宣言)
(扱う属性の値は、自由にしてかまわないが、わかりやすいものにするこ