首页 > 代码库 > 创建功能更强的类型
创建功能更强的类型
抽象的过程
1 #ifndef _array_h 2 #define _array_h 3 4 //可指定下标范围的数组的存储 5 struct IntArray 6 { int low; 7 int high; 8 int *storage; 9 }; 10 11 //根据low和high为数组分配空间。分配成功,返回值为true,否则为false 12 bool initialize(IntArray &arr, int low, int high); 13 //设置数组元素的值 14 //返回值为true表示操作正常,返回值为false表示下标越界 15 bool insert(const IntArray &arr, int index, int value); 16 //取数组元素的值 17 //返回值为true表示操作正常,为false表示下标越界 18 bool fatch(const IntArray &arr, int index, int &value); 19 //回收数组空间 20 void cleanup(const IntArray &arr); 21 #endif
Array库的实现文件
1 #include "array.h" 2 #include <iostream> 3 using namespace std; 4 5 //根据low和high为数组分配空间。 6 //分配成功,返回值为true,否则为false 7 bool initialize(IntArray &arr, int low, int high) 8 {arr.low = low; 9 arr.high = high; 10 arr.storage = new int [high - low + 1]; 11 if (arr.storage == NULL) return false; else return true; 12 } 13 14 //设置数组元素的值 15 //返回值为true表示操作正常,返回值为false表示下标越界 16 bool insert(const IntArray &arr, int index, int value) 17 {if (index < arr.low || index > arr.high) return false; 18 arr.storage[index - arr.low] = value; 19 return true; 20 } 21 //取数组元素的值 22 //返回值为true表示操作正常,为false表示下标越界 23 bool fatch(const IntArray &arr, int index, int &value) 24 {if (index < arr.low || index > arr.high) return false; 25 value = http://www.mamicode.com/arr.storage[index - arr.low] ; 26 return true; 27 } 28 //回收数组空间 29 void cleanup(const IntArray &arr) { delete [ ] arr.storage; }
Array库的应用
1 #include <iostream> 2 using namespace std; 3 #include "array.h" 4 5 int main() 6 { IntArray array; //IntArray是array库中定义的结构体类型 7 int value, i; 8 9 //初始化数组array,下标范围为20到30 10 if (!initialize(array, 20, 30)) 11 { cout << "空间分配失败" ; return 1;} 12 for (i=20; i<=30; ++i) { 13 cout << "请输入第" << i << "个元素:"; 14 cin >> value; 15 insert(array, i, value); 16 } 17 while (true) { 18 cout << "请输入要查找的元素序号(0表示结束):"; 19 cin >> i; 20 if (i == 0) break; 21 if (fatch(array, i, value)) cout << value << endl; 22 else cout << "下标越界\n"; 23 } 24 cleanup(array); //回收array的空间 25 return 0; 26 }
Array库的问题
Array库的改进
1 #ifndef _array_h 2 #define _array_h 3 struct IntArray 4 { 5 int low; 6 int high; 7 int *storage; 8 bool initialize(int lh, int rh); 9 bool insert(int index, int value); 10 bool fatch(int index, int &value); 11 void cleanup(); 12 }; 13 #endif
改进后的Array库的实现文件
与原来的实现有一个变化:函数名前要加限定
1 bool IntArray::initialize(int lh, int rh) 2 {low = lh; 3 high = rh; 4 storage = new int [high - low + 1]; 5 if (storage == NULL) return false; else return true; 6 }
改进后的Array库的应用
1 int main() 2 {IntArray array; 3 int value, i; 4 if (!array.initialize(20, 30)) { cout << "空间分配失败" ; return 1;} 5 for (i=20; i<=30; ++i) { 6 cout << "请输入第" << i << "个元素:"; cin >> value; 7 array.insert(i, value); 8 } 9 while (true) { 10 cout << "请输入要查找的元素序号(0表示结束):"; 11 cin >> i; 12 if (i == 0) break; 13 if (array.fatch(i, value)) cout << value << endl; 14 else cout << "下标越界\n"; 15 } 16 array.cleanup(); 17 return 0; 18 }
将函数放入结构体的意义
p = new IntArray(20, 30);
1 #include <iostream> 2 using namespace std; 3 class timer{ int second; 4 public: 5 timer(int t) {second=t;} 6 timer(int min, int sec) {second=60*min+sec;} 7 timer(int h, int min, int sec) {second=sec+60*min+3600*h;} 8 int gettime() {return second;} 9 } 10 main() 11 {timer a(20),b(1,20),c(1,1,10); 12 cout<<a.gettime()<<endl; 13 cout<<b.gettime()<<endl; 14 cout<<c.gettime()<<endl; 15 }
析构函数不能重载,没有参数,没有返回值
缺省的拷贝构造函数
arr1.low = arr2.low;
arr1.high = arr2.high;
arr1.storage = arr2.storage;
前两个操作没有问题,第三个操作中,storage是一个指针,第三个操作意味着使arr1的storage指针和arr2的storage指针指向同一块空间。
对象定义时
IntArray array2(array1);
IntArray array = IntArray(20, 30);
IntArray array1=array2;
自定义拷贝构造函数举例
1 class point{ int x, y; 2 public: point(int a, int b){x=a; y=b;} 3 point(const point &p) {x=2*p.x; y=2*p.y;} 4 void print() {cout<<x<<" "<<y<<endl;} 5 }; 6 void main() 7 {point p1(10, 20), p2(p1), p3 = p1, p4(1, 2); 8 p1.print(); p2.print(); p3.print(); p4.print(); 9 p4 = p1; p4.print(); //这个p4=p1并没有调用拷贝构造函数,而是调用的赋值函数 10 }
const对象
const MyClass obj(参数表);
class A { int x;
public:
A(int i) {x=i;}
int getx() const
{return x;}
};
常量成员
在该成员声明前加上const。如
class abc {
const int x;
…
};
class A
{
//错误,企图在类声明中初始化const数据成员
const int SIZE = 200;
int array[SIZE]; //错误,未知的SIZE
};
const数据成员的初始化
class A
{
A(int size); //构造函数
const int SIZE;
}
A::A(int size) : SIZE(size) //构造函数的初始化表
{…}
A a(100); //对象a的SIZE的值为100
A b(200); //对象b的SIZE的值为200
静态数据成员
double SavingAccount::rate = 0.05;
该定义为rate分配了空间,并给它赋了一个初值0.05。
static void SetRate(double newRate) {rate = newRate;}
静态成员函数使用说明
类名::静态成员函数名()
对象名.静态成员函数名()
静态的常量数据成员
static const 类型 数据成员名 = 常量表达式;
class sample {
enum {SIZE = 10};
int storage[SIZE];
…
};
创建功能更强的类型