計算機実習 I
第八回 (2015 年 5 月 28 日)
C++ の初歩
http://www.sw.it.aoyama.ac.jp/2015/CP1/lecture8.html
Martin J. Dürst
© 2005-15 Martin
J. Dürst 青山学院大学
目次
- ミニテスト
- 前回の総合復習テスト
- 前回の演習
- オブジェクト指向と C++
- 今週の演習問題
ミニテスト
- 授業開始までにログイン済み
- 授業開始まで教科書、資料、筆箱、財布などを鞄に入れ、鞄を椅子の下に
- テスト終了後その場で待つ
総合復習テスト
- 満点: 103点
- 平均: 53.6点
- 最高: 94点
- 最低: 19点
40点は欲しい
配布は説明後
授業に対する意見や改善案
- 意見無しは今年多かった
- 用語の日本語の翻訳 / もっと沢山のヒント / TA
が来ない
- インデントの評価
- プログラムの例を見たい
前回の演習結果
|
07A1 |
07B1 |
07C1 |
07C2 |
07C3 |
100点 |
52 |
34 |
8 |
2 |
0 |
60点 |
42 |
55 |
72 |
53 |
16 |
部分点 |
- |
- |
- |
- |
17 |
エラー |
- |
5 |
9 |
11 |
12 |
未提出 |
- |
- |
5 |
28 |
49 |
前回の演習と用語
- 07C3: 関数を別の関数で再利用!
- 「関数の出力」→ 戻り値
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 にオブジェクト指向を追加
クラス、メンバ関数 (member function) など
C++ 言語の応用: Browsers
- オープンソースのブラウザは C++ で記述
- Firefox (Mozilla)
- Chrome (Blink, Chromium, Opera)
- オブジェくて思考言語は GUI
のプログラミングに最適
- 低レベル・高速な処理が必要なので、C++
- Mozialla browser compressed source ca. 180MB
オブジェクト指向の位置づけ
(名: 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);
→
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/08C2
ではメインプログラムを提出プログラムの最後に
#include
次回までの準備
- 今日の復習
- 残りの演習問題を宿題として完成、提出
- 参考書の第 11 章 (pp. 282-311) をよく読む。
分かるところと分からないところをよく考える。