【发布时间】:2018-09-11 19:19:34
【问题描述】:
我正在尝试在类中创建一个带有动态数组的示例,以便使用析构函数和复制构造函数。
该程序的想法如下。我有两个私有字段的类 Labtest。 ntest 一个整数,其中包含测试和值的数量,它是具有 ntest 元素的动态数组。
我添加了方法 add 将动态数组扩展一并将参数添加到最后一个位置。
我添加了一个友元函数 max,它返回动态数组的最大元素(通过值对象进行调用),以证明复制构造函数的必要性。
为了打印对象,我重载了
我添加了默认构造函数、析构函数、复制构造函数。
目前我写的代码是
#include<iostream>
using namespace std;
class Labtest {
public:
Labtest();
Labtest(const Labtest& a);
~Labtest();
friend int max(Labtest a);
friend ostream& operator <<(ostream& out, const Labtest& lab);
void add_value(int a);
private:
int ntests;
int *values;
};
int main()
{
Labtest chem;
chem.add_value(10); chem.add_value(20);
cout << chem;
cout << "the maximum is " << max(chem) << endl;
cout << chem;
return 0;
}
Labtest::Labtest() : ntests(0), values(NULL)
{
}
Labtest::Labtest(const Labtest & a) : ntests(a.ntests)
{
values = new int(ntests);
for (int i = 0; i < ntests; i++)
values[i] = a.values[i];
}
Labtest::~Labtest()
{
ntests = 0;
delete[] values;
}
void Labtest::add_value(int a)
{
int *newvalues = new int(ntests+1);
for (int i = 0; i < ntests; i++)
newvalues[i] = values[i];
newvalues[ntests] = a;
delete[] values;
values = newvalues;
ntests++;
}
int max(Labtest a)
{
int m = a.values[0];
for (int i = 1; i < a.ntests; i++)
if (m < a.values[i])
m = a.values[i];
return m;
}
ostream& operator <<(ostream & out, const Labtest& lab)
{
for (int i = 0; i < lab.ntests; i++)
out << lab.values[i] << " ";
out << endl;
return out;
}
我在 Visual Studio 中遇到堆外边界错误。即使我评论了对 max 函数的调用。
任何帮助将不胜感激!
【问题讨论】:
-
new int(10)创建一个值为10的数组。new int[10]创建一个包含 10 个ints 的数组。 -
您应该知道
int max(Labtest a)在每次调用时都会复制a。你应该改用const Labtest & a。 -
你是对的!我不能相信这样的错误!!!此外,对于 a 的副本,每次 max 完成时,析构函数都会释放 a 的内存。对吗?
-
是的,额外的副本在技术上不是问题。尽管了解何时通过引用传递很重要,但何时通过值而不是参数传递应该是
const。在这种情况下,Labtest仅包含ints,并且可能永远不会包含太多值。但在实践中,不必要地复制容器是一个坏习惯。 -
谢谢,我只是为了演示复制构造函数的需要。请回答以便给您投票。 :-)
标签: c++ copy-constructor dynamic-arrays