c++(对象组合)

本文探讨了C++中的对象组合,通过示例展示了如何将IntArray类作为Customer类的数据成员,强调了对象组合时对内部类运算符重载函数的重要性。在调试过程中,由于未重载流插入运算符<<导致输出问题,提醒读者注意此类细节。并提供了相关笔记链接以了解更多信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值