c++(对象组合)

在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<

关于流插入运算符<<的重载函数具体可查看这篇笔记:

https://blog.csdn.net/m0_37655357/article/details/89500782

抽象数据类型IntArray类的函数成员具体实现:

#include 
#include 
#include 
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 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<

主函数测试:

    Customer andrew("andrew","china","taiyuan","shanxi");

    //这里相当于直接输出了intArray类的对象,因此需要定义该类的流插入运算符重载函数
    cout<<"andrew's name is:"<

运行结果:

c++(对象组合)_第1张图片

你可能感兴趣的:(C++)