问题描述及代码:
/*
*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