計算機実習 I
第八回 (2014 年 5 月 29 日)
C++ の初歩
http://www.sw.it.aoyama.ac.jp/2014/CP1/lecture8.html
Martin J. Dürst
© 2005-14 Martin
J. Dürst 青山学院大学
目次
- ミニテスト
- 前回の総合復習テスト
- 前回の演習
- オブジェクト指向と C++
- 今週の演習問題
ミニテスト
- 授業開始までにログイン済み
- 授業開始まで教科書、資料、筆箱、財布などを鞄に入れ、鞄を椅子の下に
- テスト終了後その場で待つ
情テクソフトボール大会
参加チーム申し込み締め切り: 6月2日 (月)
総合復習テスト
- 満点: 100点
- 平均: 42.6点
- 最高: 78点
- 最低: 16点
授業に対する意見や改善案
- 用語の日本語の翻訳 / もっと沢山のヒント / TA
が来ない
- エラーが分かりにくい
- エラーの判断が根本的に困難
- 細かいところまで気を配るのは IT で大事
- 最初の赤文字のではなく、もっと下の方に注目
- Cygwin と Program Checking System の差異
- 現実的にありうる (コンパイラの差異)
- 初期化が大事
- インデントの評価
- 統一が大事
- 最低ラインが存在
- struct/class への対応が不完全
- プログラムの例を見たい
前回の演習問題について
- 未提出 (またはエラー): 07A1: 1人、07B1: 5人、07C1:
18人、07C2: 42人、07C3 (発展問題): 68人 (完成: 9)
C++ 用演習環境
- ファイルの拡張子:
.c
→ .cpp
- コンパイラ:
gcc
→ g++
(必要なら、個人パソコンで cygwin の setup.exe で gcc-g++
を追加)
- 入出力は今までと同様 (C の
#include
<stdio.h>
, printf
, scanf
,...)
- 他の環境も今までと同様
C++ の位置づけ
- C の「間違い」を修正
例 1: // 行末までのコメント
例 2: typedef struct {...} Person;
→ struct Person
{...};
- C にオブジェクト指向を追加
クラス、メンバ関数など
オブジェクト指向の位置づけ
(名: object-orientation, 形: object-oriented)
- データと操作をセットに
- データをカプセル化、不正なアクセスや変更を阻止
- 実用的な言語はほぼすべて採用 (C/C++
みたいな分割は例外)
- プログラムが大きくなるにつれ力を発揮
- 大規模なプロジェクトで大変有効
(今回対象外:)
- クラスの継承 (inheritance)
- 多態性 (polymorphism)
- ...
クラスの定義
class クラス名 {
メンバ変数名の定義
public:
コンストラクタの定義
メンバ関数の定義
};
クラスの定義の例
class Point {
double x, y;
public:
Point ();
Point (double new_x, double new_y);
void set_x (double new_x);
void set_y (double new_y);
double get_x ();
double get_y ();
};
(set_...
と get_...
はセッタ (setter) とゲッタ (getter) で、カプセル化を実装)
メンバ関数の注意点
- クラス内: クラス名なし
例: void set_x (double new_x);
- (クラス外の) 実装: クラス名が必要
例: void Point::set_x (double new_x) { ... }
- 使用:
- メンバなので、記述は構造体のメンバ (メンバ変数)
と同様
- 関数なので、
()
が必要
- 例:
Point p(2, 3); p.get_x();
関数からメンバ関数への変換
- 関数: 引数と戻り値
- メンバ関数: レシーバ (receiver)、引数、戻り値
- 多くの場合、関数の第一引数がレシーバに
- 結果的、引数が一つ少ない
- 呼出しの具体例:
distance(start, end);
→
double start.distance(end);
- 宣言の具体例:
double distance(Point start, Point end);
→
double distance(Point other);
- 関数内のメンバ (変数・関数) の使用:
レシーバのメンバはメンバ名のみ
具体例: x - other.x
コンストラクタの注意点
- 役割: インスタンスの生成と初期化
- クラス名と同名
- 戻り値がない (
void
も不要)
- 引数の型の違う複数のコンストラクタが可能
- 引数なしのコンストラクタ (default constructor):
- 他にコンストラクタがなければ自動的に用意
- 他にコンストラクタがある場合、自動的に用意されない
C++ のヘッダファイル
- 拡張子は C と同じく
.h
- クラスの定義
(コンストラクタやメンバ関数の宣言を含む)
- コンストラクタ、メンバ関数の定義 (実装) は
.cpp
- ファイル名がクラス名と一致のが通例 (
Point.h
と Point.cpp
)
今日の演習
- 08A1: 以前作ったプログラムで
struct
を
class
に変更、public:
/private:
の体験
- 08A2: クラスを使って点の距離の計算
- 08B1: 日付のクラスの作成
- 08C1: 複素数クラス
- 08C2: 温度クラスによる単位変換 (内部表現の隠蔽;
必須が、締め切りは月曜日)
08B1/08C1/2
ではメインプログラムを提出プログラムの最後に
#include
次回までの準備
- 今日の復習
- 残りの演習問題を宿題として完成、提出
- 参考書の第 11 章 (pp. 282-311) をよく読む。
分かるところと分からないところをよく考える。