ベクトルの内積と大きさ

  任意の次元に対応するため,new 演算子を使用しています.このような場合,new 演算子で確保した領域を開放するためにデストラクタが必要になります.デストラクタ消滅子destructor )は,オブジェクトを消滅させる目的で作成する特別なメンバー関数であり,「~クラス名」という関数名に決まっています.デストラクタに引数を渡したり,デストラクタから値を返したり,また,デストラクタの多重定義をするなどのことはできません.

  大きさの決まっていないデータを扱うためには,オブジェクト内で new 演算子によりメモリを確保する方法が一般的です.このメモリの確保をコンストラクタの中で行うと,プログラムが非常に書きやすくなります.さらに,確保したメモリは,必要が無くなれば解放してやらなければなりませんが,この処理もデストラクタを使用すれば自動的に行ってくれます.この例においては問題になりませんが,Vector クラスのオブジェクトを他の Vector クラスのオブジェクトに代入するような操作を行うと,このプログラムのままでは問題が生じます.詳細については代入と初期化を参照してください.

/****************************/
/* ベクトルの内積と大きさ   */
/*      coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <math.h>
using namespace std;

/**********************/
/* Vectorクラスの定義 */
/**********************/
class Vector {
	public:
		int n;
		double *v;
		Vector (int n)   // コンストラクタ
		{
			this->n = n;
			v = new double [n];
		}
		~Vector()   // デストラクタ
		{
			if (n > 0)
				delete [] v;
		}
		double norm();   // 絶対値
		double naiseki(Vector &);   // 内積
		void input();   // 要素の入力
};

/**********/
/* 大きさ */
/**********/
double Vector::norm()
{
	double x = 0.0;
	for (int i1 = 0; i1 < n; i1++)
		x += v[i1] * v[i1];
	return sqrt(x);
}

/*********************/
/* 内積              */
/*      b : ベクトル */
/*********************/
double Vector::naiseki(Vector &b)
{
	double x = 0.0;
	for (int i1 = 0; i1 < n; i1++)
		x += v[i1] * b.v[i1];
	return x;
}

/********/
/* 入力 */
/********/
void Vector::input()
{
	for (int i1 = 0; i1 < n; i1++) {
		cout << "   " << i1+1 << "番目の要素は? ";
		cin >> v[i1];
	}
}

/******************/
/* mainプログラム */
/******************/
int main()
{
	Vector a(2), b(2);

	cout << "a\n";
	a.input();
	cout << "b\n";
	b.input();

	cout << "a と b の内積 " << a.naiseki(b) << endl;
	cout << "a,及び,b の大きさ " << a.norm() << " " << b.norm() << endl;

	return 0;
}