#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; } |