24
C++ For Researchers 研究生のためのC++ 企画・立案 難波知宏

研究生のためのC++ no.3

Embed Size (px)

Citation preview

Page 1: 研究生のためのC++ no.3

C++ For Researchers 研究生のためのC++

企画・立案 難波知宏

Page 2: 研究生のためのC++ no.3

クラス

第三回

2

Page 3: 研究生のためのC++ no.3

クラスを作ろう

第一節

3

Page 4: 研究生のためのC++ no.3

数学の三次元ベクトルを作ってみよう

Exercise 3-1

4

Page 5: 研究生のためのC++ no.3

皆さんの意見

• 例)ベクトルの加算

• 逆行列の計算

• ベクトルの内積・外積

数学の三次元ベクトルを作ってみよう

Exercise 3-1

⓪ どんなことがしたいか考えよう

(ベクトルに関する処理にはどんなものがあるだろうか?)

5

Page 6: 研究生のためのC++ no.3

どんな機能が必要か?

• ベクトル+ベクトル

• -ベクトル

• ベクトルの大きさ

• ベクトルの内積

ベクトルクラスを使う側 (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

Page 7: 研究生のためのC++ no.3

exercise 3-01/Vector3.h

class Vector3 {};

数学の三次元ベクトルを作ってみよう

Exercise 3-1

① クラスを定義しよう

class C {}; でクラスを定義.

7

Page 8: 研究生のためのC++ no.3

exercise 3-01/Vector3.h

class Vector3

{

public:

private:

};

数学の三次元ベクトルを作ってみよう

Exercise 3-1

② public領域とprivate領域を定義しよう

public: でクラス外部から参照できる領域を定義.

private: でクラス内部からのみ参照できる領域を定義. (この演習問題では未使用)

8

Page 9: 研究生のためのC++ no.3

exercise 3-01/Vector3.h

class Vector3

{

public:

float x, y, z;

};

数学の三次元ベクトルを作ってみよう

Exercise 3-1

③ メンバ変数を定義しよう

class C { int x; }; でメンバ変数を定義.

9

Page 10: 研究生のためのC++ no.3

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

Page 11: 研究生のためのC++ no.3

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

Page 12: 研究生のためのC++ no.3

#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

Page 13: 研究生のためのC++ no.3

#include <cmath>

class Vector3

{

~Vector3()

{

}

};

exercise 3-01/Vector3.h

数学の三次元ベクトルを作ってみよう

Exercise 3-1

⑦ デストラクタを定義しよう

class C

{

~C() { … }

}; でデストラクタを定義.

13

Page 14: 研究生のためのC++ no.3

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

Page 15: 研究生のためのC++ no.3

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

Page 16: 研究生のためのC++ no.3

exercise 3-01/Vector3.h

#include <cmath>

namespace math

{

class Vector3

{

};

Vector3 operator +(Vector3 a, Vector3 b) { … }

}

数学の三次元ベクトルを作ってみよう

Exercise 3-2

⑩ 作ったクラスを名前空間内に配置しよう

namespace math { … } で名前空間を定義.

16

Page 17: 研究生のためのC++ no.3

クラスを使おう

第二節

17

Page 18: 研究生のためのC++ no.3

標準で提供されている便利なクラスを知ろう

Exercise 3-2

18

Page 19: 研究生のためのC++ no.3

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でも同じことが

できる

Page 20: 研究生のためのC++ no.3

exercise 3-02-2

省略

標準で提供されている便利なクラスを知ろう

exercise 3-02

ファイル入出力

20

std::ofstream ファイル出力

std::ifstream ファイル入力

Page 21: 研究生のためのC++ no.3

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で楽に 使おう

Page 22: 研究生のためのC++ no.3

用語集

22

Page 23: 研究生のためのC++ no.3

用語集 (1)

メンバ関数 クラスのインスタンスに対して呼び出す関数。

メンバ変数 クラスのインスタンスが持つ変数。

クラス関数 クラスに関連付けられる関数。staticをつけて定義する。

クラス変数 クラスに関連付けられる変数。staticをつけて定義する。

public領域 クラス外部からもアクセスできる領域。

protected領域 クラス内部と、そのクラスを継承したクラスの内部からアクセスできる領域。

private領域 クラス内部からのみアクセスできる領域。

thisポインタ インスタンス自身のアドレス。(メンバ関数内でのみ使用可能)

継承 既存のクラスの機能を別のクラスに引き継ぐこと。

コンストラクタ インスタンスが作成されるタイミングで呼び出される関数。

デストラクタ インスタンスが破棄されるタイミングで自動で呼び出される関数。

引数を受け渡すことはできない。

23

Page 24: 研究生のためのC++ no.3

用語集 (2)

デフォルト

コンストラクタ

引数なしのコンストラクタ。

インスタンス クラスから生成された実体。

組み込み型 intとかdoubleなどの最初からある型。

名前空間 関数やデータ型を整理整頓するもの。

24