第12周实践项目(4)-数组类运算的实现

问题描述及代码:

/*
*copyright (c) 2016,烟台大学计算机学院
*All rights reserved.
*文件名称:hellow.cpp
*作者:田甜
*完成日期:2016年5月26日
*版本号:v1.0
*
*问题描述:设计数组类Array,为了实现测试函数中要求的功能,请补足相关的函数(构造、析构函数)和运算符重载的函数。 
  实现策略提示:可以将测试函数中的语句加上注释,取消一句的注释,增加相应的函数,以渐增地实现所有的功能,避免全盘考虑带来的困难。


*输入描述: 
*程序输出:
*/

#include <iostream>
#include <cassert>
#include <cstring>
using namespace std;
class Array
{
public:
    Array(int s=50);
    Array(int a[],int s);
    Array(const Array& a);
    Array operator+(const Array &a);
    Array& operator=(const Array &a);
    int& operator[](int n);
    const int& operator[](int n)const;
    int get_size() const;
    void mod_size(int s);
    ~Array();
    void show() const;//注意这里const在前面代表返回值是const的,在后面才是代表常成员函数
private:
    int size;
    int* list;
};


Array::Array(int s)
{
    assert(s>=0);
    size=s;
    list=new int[size];
}


Array::Array(int a[],int s)
{
    assert(s>=0);
    size=s;
    list=new int[s];
    for(int i=0;i<size;i++)
        list[i]=a[i];
}


Array::Array(const Array &a)
{
    size=a.size;
    list=new int[size];
    for(int i=0;i<size;i++)
        list[i]=a.list[i];
}


Array::~Array()
{
    delete []list;
}


Array Array::operator+(const Array& a)
{
    assert(size==a.size);
    Array total(size);
    for(int i=0;i<size;i++)
    total.list[i]=list[i]+a.list[i];
    return total;


}


//Array& Array::operator=(const Array& a)
//{
//    if(&a!=this)
//    {
//        if(size!=a.size)
//        {
//            size=a.size;
//            list=new int[size];
//            for(int i=0;i<size;i++)
//            list[i]=a.list[i];
//        }
//    }
//
//
//    return *this;
//}

Array& Array::operator=(const Array& a)
{
    if(&a!=this)
    {
        if(size!=a.size)
        {
            size=a.size;
            list=new int[size];
        }//其实问题不主要在这儿
            for(int i=0;i<size;i++)
            list[i]=a.list[i];

    }


    return *this;
}
void Array::show() const
{
    for(int i=0;i<size;i++)
        cout<<list[i]<<" ";
    cout<<endl;
}


int& Array::operator[](int n)
{
    assert(n>=0&&n<size);
    return list[n];
}


const int& Array::operator[](int n)const
{
    assert(n>=0&&n<size);
    return list[n];
}


int Array::get_size() const
{
    return size;
}


void Array::mod_size(int s)
{
    assert(s>=0);
    if(s==size)
        return;
    int* newlist=new int[s];
    //int n=(s>size)?s:size;  这里我将较大的值给了n
    int n=(s>size)?size:s;
    for(int i=0;i<n;i++)//这里应该是<n
    {
        newlist[i]=list[i];
    }
    delete []list;
    list=newlist;
    size=s;
}
int main()
{
    int a[4]={1,2,3,4};
    int b[4]={10,20,30,40};
    Array array1(a,4),array2(array1);
    const Array array3(b,4);
    Array array4(array3);
    array4=array1+array3;
    //array4=array3+array1;  注意这样写是错误的,因为array3是const对象,不能调用operator+函数但可以做函数的参数
    array1.show();
    array2.show();
    array3.show();
    array4.show();
    return 0;
}


运行结果:

 

这个是我修改之后的代码,修改了一些细节,具体已在程序中用注释写出。第一遍写的代码运行黑框里出现了之前没有遇到过的问题terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_allocAborted

贺老师说跟内存的动态分配有关,但我现在还是没发现具体是因为什么,下面贴出来,希望以后能慢慢解决

#include <iostream>
#include <cassert>
#include <cstring>
using namespace std;
class Array
{
public:
    Array(int s=50);
    Array(int a[],int s);
    Array(const Array& a);
    Array operator+(const Array &a);
    Array& operator=(const Array &a);
    int& operator[](int n);
    const int& operator[](int n)const;
    int get_size() const;
    void mod_size(int s);
    ~Array();
    void show() const;//注意这里const在前面代表返回值是const的,在后面才是代表常成员函数
private:
    int size;
    int* list;
};


Array::Array(int s)
{
    assert(s>=0);
    list=new int[s];
}


Array::Array(int a[],int s)
{
    assert(s>=0);
    size=s;
    list=new int[s];
    for(int i=0;i<size;i++)
        list[i]=a[i];
}


Array::Array(const Array &a)
{
    size=a.size;
    list=new int[size];
    for(int i=0;i<size;i++)
        list[i]=a.list[i];
}


Array::~Array()
{
    delete []list;
}


Array Array::operator+(const Array& a)
{
    assert(size==a.size);
    Array total(size);
    for(int i=0;i<size;i++)
    total.list[i]=list[i]+a.list[i];
    return total;


}


Array& Array::operator=(const Array& a)
{
    if(&a!=this)
    {
        if(size!=a.size)
        {
            size=a.size;
            list=new int[size];
            for(int i=0;i<size;i++)
            list[i]=a.list[i];
        }
    }


    return *this;
}
void Array::show() const
{
    for(int i=0;i<size;i++)
        cout<<list[i]<<" ";
    cout<<endl;
}


int& Array::operator[](int n)
{
    assert(n>=0&&n<size);
    return list[n];
}


const int& Array::operator[](int n)const
{
    assert(n>=0&&n<size);
    return list[n];
}


int Array::get_size() const
{
    return size;
}


void Array::mod_size(int s)
{
    assert(s>=0);
    if(s==size)
        return;
    int* newlist=new int[s];
    int n=(s>size)?s:size;
    for(int i=0;i<size;i++)
    {
        newlist[i]=list[i];
    }
    delete []list;
    list=newlist;
    size=s;
}
int main()
{
    int a[4]={1,2,3,4};
    int b[4]={10,20,30,40};
    Array array1(a,4),array2(array1);
    const Array array3(b,4);
    Array array4(array3);
    array4=array1+array3;
    //array4=array3+array1;  注意这样写是错误的,因为array3是const对象,不能调用operator+函数但可以做函数的参数
    array1.show();
    array2.show();
    array3.show();
    array4.show();
    return 0;
}


 

这里有一个描述此类问题的网址:http://blog.csdn.net/cwj649956781/article/details/8149677

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值