在C语言中结构体支持嵌套,同样,c++的类也支持嵌套。也就是让某个类的对象作为另一个类的数据成员出现,这就是对象组合。
下面的例子是让IntArray类的对象作为Customer类的共有数据成员存在。
在这里,IntArray类其实就充当了我们自己定义的一个抽象数据类型,通过各种运算符重载函数,实现对字符串很方便的操作与管理。
IntArray类:
class IntArray
{
private:
char *aptr;
int arraySize;
void memError(); //处理内存非配错误
void subError(); //处理下标越界
public:
IntArray(){aptr = NULL;arraySize = 0;}
IntArray(const char *);
IntArray(const IntArray &);
~IntArray();
//返回对象元素个数
int size(){return arraySize;}
//重载[]运算符
char &operator[](const int &);
//重载赋值运算符
char *operator=(const char *);
//重载流插入符
friend ostream &operator<<(ostream &,IntArray &);
};
Customer类:
class Customer
{
public:
//对象组合,其他类的实例对象作为该类中的数据成员
IntArray name;
IntArray address;
IntArray city;
IntArray state;
//内联构造函数
Customer(char *n,char *a,char *c,char *s)
{
//这里直接将字符串赋值给对象,因此要定义intArray类的赋值运算符重载函数
name = n;
address = a;
city = c;
state = s;
}
};
使用对象组合的时候,尤其要注意内部类的运算符重载函数是否充分。
在调试这个程序的时候,一开始我没有重载流插入运算符<<,但是在主函数中又直接输出了IntArray类的对象:
//重载流插入运算符
ostream &operator<<(ostream &strm,IntArray &obj)
{
strm<<obj.aptr;
return strm;
}
关于流插入运算符<<的重载函数具体可查看这篇笔记:
https://blog.youkuaiyun.com/m0_37655357/article/details/89500782
抽象数据类型IntArray类的函数成员具体实现:
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#include "intArray.h"
//带参构造函数
IntArray::IntArray(const char *str)
{
arraySize = strlen(str);
aptr = new char [arraySize+1];
if(aptr == NULL)
memError();
strcpy(aptr,str);
}
//拷贝构造函数
IntArray::IntArray(const IntArray &obj)
{
arraySize = obj.arraySize;
if((aptr = new char [arraySize]) == 0)
memError();
for(int n=0; n<arraySize; n++)
{
*(aptr + n) = *(obj.aptr + n);
}
}
//析构函数
IntArray::~IntArray()
{
if(arraySize > 0)
delete [] aptr;
arraySize = 0;
}
//内存分配出错,显示错误信息并终止程序。
void IntArray::memError()
{
cout<<"错误:内存分配出错!\n";
exit(0);
}
//数组下标越界
void IntArray::subError()
{
cout<<"错误:数组下标越界!\n";
exit(0);
}
/*
** 重载[]运算符
** 参数:数组下标
** 返回值:数组元素的引用
*/
char &IntArray::operator[](const int &n)
{
//检查下标是否越界
if(n<0 || n>arraySize)
subError();
//返回string对象的数组元素
return aptr[n];
}
//重载=运算符
char *IntArray::operator=(const char *right)
{
if(arraySize != 0)
delete [] aptr;
arraySize = strlen(right);
aptr = new char [arraySize + 1];
if(aptr == NULL)
memError();
strcpy(aptr,right);
return aptr;
}
//重载流插入运算符
ostream &operator<<(ostream &strm,IntArray &obj)
{
strm<<obj.aptr;
return strm;
}
主函数测试:
Customer andrew("andrew","china","taiyuan","shanxi");
//这里相当于直接输出了intArray类的对象,因此需要定义该类的流插入运算符重载函数
cout<<"andrew's name is:"<<andrew.name<<endl;
cout<<"andrew's address is:"<<andrew.address<<endl;
运行结果: