Transcript C++基礎

C++基礎
目次

C++とは?

C++におけるオブジェクト指向

課題
C++とは?

Cには足りなかったものが付与されて出来た物

具体的には、
情報の隠蔽(カプセル化)
共通の名前付け(関数のオーバーロード)
再利用の仕組み
クラスの導入 など

オブジェクト指向

C++では大規模なプログラミングの
修正、追加、保守が可能に。
C++におけるオブジェクト指向
オブジェクト
 クラス
 属性とメソッド
 コンストラクタ
 デストラクタ
 カプセル化
 多相性
 継承

C++の基本的な雛形
拡張子はcpp
//hello.cpp(ファイル名)
#include<iostream>
using namespace std:
iostreamはCでいうstdio.h
cout 出力
int main(){
int a;
cout<<“hello”<<endl;
cin>>a;
cout<<a<<endl;
return 0;
}
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>
using namespace std:
class cardata{
public:
string name;// 車の名前
int price;//値段
int capacity;/*定員*/
void ShowData();
//メンバ関数
//クラスないではメンバ関数の
//プロトタイプだけが記述できる
void cardata::ShowData(){//メンバ関数の実装
//関数の前にクラス名と2つのコロンをつける、
//これをスコープ演算子と呼ぶ
cout<<“車種名:”<<name<<endl;
cout<<“値段:”<<price<<endl;
cout<<“定員人数:”<<capacity<< endl;
return 0;
}
main(){
cardata car1;
//cardata型の変数宣言
strcpy(car1.name,”イプサム”);
car1.price=30000000;
car1.capacity=6;
};
return 0;
}
コンストラクタ(1)
クラスの中で定義出来る特殊なメンバ関数
 オブジェクトが構築されるときに
自動的に呼び出されるメンバ関数
 メンバ変数に初期値を代入するのが
一般的な使い方

コンストラクタ(2)
class cardata{
public:
string name;
int price;
int capacity;
// コンストラクタの実装
cardata::cardata(){
strcpy(name,"未設定
");
price = 500000;
capacity = 0;
cardata();
};
コンストラクタ
}
初期化
// クラスを
//使う側のコード
main(){
cardata someone;
return 0;
}
デストラクタ

コンストラクタと対で呼び出されるもの

オブジェクトがメモリから破棄されるときに
自動的に呼び出される
カプセル化(1)

オブジェクト(属性とメソッドのセット)の外部か
らアクセス出来るのは振る舞いだけにし、直
接属性をアクセス出来ないようにすること

カプセル化により、オブジェクト内部属性が隠
蔽化され、外部にはメソッドだけが公開される
カプセル化(2)



アクセス演算子には
private>protected>publicがある。
アクセス演算子により、クラスの利用者に
とって必要のないメンバを隠すこと
具体例:リモコン
内部機能
ボタン機能
private:
メンバ変数;
メンバ関数;
public:
メンバ変数;
メンバ関数;
カプセル化の使い方
#include <iostream>
using namespace std:
// クラスの定義
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);//メンバ変数の値の表示
cout<< bk.GetPage() << endl;
// 不適切な値の代入bk.SetPage(3000);
// メンバ変数の値の表示
cout<< bk.GetPage() << endl;
return 0;
}
多相性

複数の異なるオブジェクトに同じ名前の送信
をしても、それぞれのオブジェクトが固有の振
る舞いを実行して結果を戻す。

今回は多相性を実現する機能の
うちの1つのオーバーロードについて勉強
オーバーロード(多相性)

オーバーロードを
使わないと
// クラスの定義
Calculation obj;
class Calculation {
public:
int Inttwice(int a);
// int型のメンバ関数
double Dbltwice(double a);
// double型のメンバ関数
};
// メンバ関数の実装
int Calculation::Inttwice(int a){
return a*2;
}
double Calculation::Dbltwice(double a){
return a * 2;
}
int a;
double b;
a = obj.Inttwice(123);
b = obj.Dbltwice(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);
メンバ関数が同じですむ
オーバーロードの活用のパターン
void Messages::ShowMessage(char* s,
#include <iostream>
int n){
using namespace std:
class Messages{
int i;
public:
for (i=0; i < n; i++){
void ShowMessage(); // 引数のないメンバ関数
void ShowMessage(char* s);
cout<< s <<endl;
// 引数1個のメンバ関数
}
void ShowMessage(char* a, int n);
// 引数2個のメンバ関数
return;
};
}
// メンバ関数の実装
void Messages::ShowMessage(){
cout<< “引数ゼロです” << endl;
return;
}
void Messages::ShowMessage(char*s){
cout<< s << endl;
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クラスでは、
それぞれ、そのクラス特有の属性が記述されている。
継承(3)
class Normal:public cardata{
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)

メインではどのように書くか
Normal car1;//変数宣言
strcpy(car1.name,“イプサム”);
car1.price=2500000;
car1.capacity=6;
strcpy(car1.carry,”スキー用キャリー”);
課題



課題(0)
Hello Worldと表示するプログラムの作成
課題(1)
名前を入力し、
それを出力するプログラムの作成
課題(2)
Personクラスで「名前」、「年齢」を宣言し、
Personクラスを継承し、Teacherクラスでは、
「給料」、Studentクラスでは、「GPA」の属性を
加えて、それぞれ値を入力し出力するプログラムの作成
ご清聴ありがとうございました