Upload
tomohiro-namba
View
63
Download
2
Embed Size (px)
Citation preview
C++ For Researchers 研究生のためのC++
企画・立案 難波知宏
クラス
第三回
2
クラスを作ろう
第一節
3
数学の三次元ベクトルを作ってみよう
Exercise 3-1
4
皆さんの意見
• 例)ベクトルの加算
• 逆行列の計算
• ベクトルの内積・外積
数学の三次元ベクトルを作ってみよう
Exercise 3-1
⓪ どんなことがしたいか考えよう
(ベクトルに関する処理にはどんなものがあるだろうか?)
5
どんな機能が必要か?
• ベクトル+ベクトル
• -ベクトル
• ベクトルの大きさ
• ベクトルの内積
…
ベクトルクラスを使う側 (exercise 3-1/main.cpp)
#include "Vector3.h"
int main() {
// ベクトルを初期化する.
Vector3 a(0.1f, 0.2f, 0.3f);
Vector3 b(0.9f, 0.8f, 0.7f);
// ベクトルの加算をする.
Vector3 c = a + b;
// ベクトルの符号を反転する.
Vector3 d = -c;
// 大きさを計算する.
float m = c.magnitude();
// 内積を計算する.
float i = Vector3::dot(a, b);
}
数学の三次元ベクトルを作ってみよう
Exercise 3-1
⓪ どんなことがしたいか考えよう
6
exercise 3-01/Vector3.h
class Vector3 {};
数学の三次元ベクトルを作ってみよう
Exercise 3-1
① クラスを定義しよう
class C {}; でクラスを定義.
7
exercise 3-01/Vector3.h
class Vector3
{
public:
private:
};
数学の三次元ベクトルを作ってみよう
Exercise 3-1
② public領域とprivate領域を定義しよう
public: でクラス外部から参照できる領域を定義.
private: でクラス内部からのみ参照できる領域を定義. (この演習問題では未使用)
8
exercise 3-01/Vector3.h
class Vector3
{
public:
float x, y, z;
};
数学の三次元ベクトルを作ってみよう
Exercise 3-1
③ メンバ変数を定義しよう
class C { int x; }; でメンバ変数を定義.
9
exercise 3-01/Vector3.h
#include <cmath>
class Vector3
{
public:
float magnitude()
{
return sqrt(x * x + y * y + z * z);
}
float x, y, z;
};
数学の三次元ベクトルを作ってみよう
Exercise 3-1
④ メンバ関数を定義しよう
class C
{
int func(…) { … }
}; でメンバ関数を定義.
10
exercise 3-01/Vector3.h
class Vector3
{
public:
float magnitude() { … }
static float dot(Vector3 a, Vector3 b)
{
return a.x * b.x + a.y * b.y + a.z * b.z;
}
float x, y, z;
};
数学の三次元ベクトルを作ってみよう
Exercise 3-1
⑤ クラス関数を定義しよう
class C { static void func(…) { … }
}; でクラス関数を定義.
11
#include <cmath>
class Vector3
{
public:
Vector3() : x(0), y(0), z(0) {}
Vector3(float x, float y, float z) : x(x), y(y), z(z) {}
…
};
exercise 3-01/Vector3.h
数学の三次元ベクトルを作ってみよう
Exercise 3-1
⑥ コンストラクタを定義しよう
class C
{
C(…) { … }
}; でコンストラクタを定義.
class C
{
C() { … }
}; でデフォルトコンストラクタ を定義.
12
#include <cmath>
class Vector3
{
…
~Vector3()
{
}
…
};
exercise 3-01/Vector3.h
数学の三次元ベクトルを作ってみよう
Exercise 3-1
⑦ デストラクタを定義しよう
class C
{
~C() { … }
}; でデストラクタを定義.
13
exercise 3-01/Vector3.h
#include <cmath>
class Vector3
{
…
Vector3 operator -()
{
return Vector3(-x, -y, -z);
}
…
};
数学の三次元ベクトルを作ってみよう
Exercise 3-1
⑧ オリジナルの演算子を定義しよう(1)
class C { void operator ○○ (…) { … } }; で ○○ 演算子の定義.
14
exercise 3-01/Vector3.h
#include <cmath>
class Vector3
{
…
};
Vector3 operator +(Vector3 a, Vector3 b)
{
return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
}
数学の三次元ベクトルを作ってみよう
Exercise 3-1
⑨ オリジナルの演算子を定義しよう(2)
void operator △△(…) { … } で △△ 演算子の定義.
15
exercise 3-01/Vector3.h
#include <cmath>
namespace math
{
class Vector3
{
…
};
Vector3 operator +(Vector3 a, Vector3 b) { … }
}
数学の三次元ベクトルを作ってみよう
Exercise 3-2
⑩ 作ったクラスを名前空間内に配置しよう
namespace math { … } で名前空間を定義.
16
クラスを使おう
第二節
17
標準で提供されている便利なクラスを知ろう
Exercise 3-2
18
exercise 3-02-1
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!!!" << endl;
int x = 137;
cout << x << endl;
double y = 3.14;
cout << y << endl;
}
標準で提供されている便利なクラスを知ろう
exercise 3-02
標準入出力
19
std::cout 標準出力
std::cin 標準入力
std::cerr 標準エラー出力
printfでも同じことが
できる
exercise 3-02-2
省略
標準で提供されている便利なクラスを知ろう
exercise 3-02
ファイル入出力
20
std::ofstream ファイル出力
std::ifstream ファイル入力
exercise 3-02-3
#include <string>
#include <iostream>
using std::cout;
using std::endl;
using std::string;
int main()
{
string s = "Hello, world";
// append : 末尾に追加
s.append("!!!");
// [] : 先頭の文字にアクセス
s[0] = 'A';
// length : 長さを取得
size_t len = s.length();
// find : 文字列検索
size_t idx = s.find("or");
// + : 文字列の連結
string s2 = "Tom says '" + s + "'";
// substr : 部分文字列の取得
string s3 = s.substr(7, 5);
}
標準で提供されている便利なクラスを知ろう
exercise 3-02
文字列
21
文字列はstd::stringで楽に 使おう
用語集
22
用語集 (1)
メンバ関数 クラスのインスタンスに対して呼び出す関数。
メンバ変数 クラスのインスタンスが持つ変数。
クラス関数 クラスに関連付けられる関数。staticをつけて定義する。
クラス変数 クラスに関連付けられる変数。staticをつけて定義する。
public領域 クラス外部からもアクセスできる領域。
protected領域 クラス内部と、そのクラスを継承したクラスの内部からアクセスできる領域。
private領域 クラス内部からのみアクセスできる領域。
thisポインタ インスタンス自身のアドレス。(メンバ関数内でのみ使用可能)
継承 既存のクラスの機能を別のクラスに引き継ぐこと。
コンストラクタ インスタンスが作成されるタイミングで呼び出される関数。
デストラクタ インスタンスが破棄されるタイミングで自動で呼び出される関数。
引数を受け渡すことはできない。
23
用語集 (2)
デフォルト
コンストラクタ
引数なしのコンストラクタ。
インスタンス クラスから生成された実体。
組み込み型 intとかdoubleなどの最初からある型。
名前空間 関数やデータ型を整理整頓するもの。
24