template <typename T>
class SetClass
{
public:
const static int MAXSIZE;
SetClass(void);
SetClass(const T *a, int n);
~SetClass(void);
bool IsInSet(const T &e) const;
bool Insert(const T &e);
bool Delete(const T &e);
void Display(void) const;
SetClass<T> &Union(const SetClass<T> &S) const;
SetClass<T> &Intersection(const SetClass<T> &S) const;
SetClass<T> &Difference(const SetClass<T> &S) const;
private:
int *data;
int n;
};
template <typename T>
SetClass<T> &SetClass<T>::Union(const SetClass<T> &S) const
{
static SetClass<T> R;
for (int i = 0; i < n; ++i)
{
R.Insert(data[i]);
}
for (int i = 0; i < S.n; ++i)
{
if (!R.IsInSet(S.data[i]))
{
R.Insert(S.data[i]);
}
}
return R;
}
这个方法运行正常,但是若将返回值类型改为SetClass < T >,则在调用析构函数销毁static SetClass < T > R时似乎data被销毁了两次发生错误,为什么会出现这种情况,是因为返回值的时候发生了浅拷贝吗?但是为什么返回值类型为SetClass < T >, 并且去掉R的static属性这样却不会出错?