#include <iostream>
#include <cstdlib> // for exit(1)
using namespace std;
template <class T> class array{ // クラス宣言
T *p; // 配列の先頭を指すポインタ
int size;
public:
array(); // デフォルトコンストラクタ
array(int sz); // 要素数を指定するコンストラクタ
array(const array &a); // コピーコンストラクタ
~array(){ delete[] p;} // デストラクタ
array &operator=(const array &a);
T &operator[](int i); // [] 演算子の多重定義
int getsize(){ return size; } // 配列のサイズ取得
};
template <class T> array<T>::array(){ // デフォルトコンストラクタ
p = new T[10];
if(!p) exit(1);
size = 10;
// cout << "デフォルトコンストラクタ\n";
}
template <class T> array<T>::array(int sz){ // 要素数を指定するコンストラクタ
p = new T[sz];
if(!p) exit(1);
size = sz;
// cout << "要素数を指定するコンストラクタ\n";
}
template <class T> array<T>::array(const array &a){ // コピーコンストラクタ
size = a.size;
p = new T[size];
if(!p) exit(1);
for(int i=0 ; i<a.size ; i++) p[i] = a.p[i]; // 内容をコピー
// cout << "コピーコンストラクタ\n";
}
template <class T> array<T> &array<T>::operator=(const array &a){
delete[] p;
size = a.size;
p = new T[size];
if(!p) exit(1);
for(int i=0 ; i<a.size ; i++) p[i] = a.p[i]; // 内容をコピー
cout << "代入演算子\n";
return(*this);
}
template <class T> T &array<T>::operator[](int i){ // [] 演算子の多重定義
if(i<0){
cout << "配列の範囲から外れています!";
return p[0];
}else if(i>=size){
cout << "配列の範囲から外れています!";
return p[size-1];
}else{
return p[i];
}
}
int main(){ // main 関数
cout << "***** array を int で利用 *****\n";
array<int> a1(10);
a1[0] = 0;
a1[1] = 1;
a1[2] = 2;
a1[3] = 3;
for(int i=0 ; i<4 ; i++) cout << a1[i];
cout << "\n";
cout << "***** array を char で利用 *****\n";
array<char> a2(10);
a2[0] = 'T';
a2[1] = 'e';
a2[2] = 's';
a2[3] = 't';
for(int i=0 ; i<4 ; i++) cout << a2[i];
cout << "\n";
return 0;
}
|