【发布时间】:2017-09-17 20:06:31
【问题描述】:
基本上,我的问题如下:假设我为一个类创建了一个赋值运算符,是否违反约定或不赞成让我的复制构造函数只是 this = item?
假设我正在创建一个仅包含以下数据的模板类:
private:
int _size;
ItemType* _array;
如果我的赋值运算符如下:
template<class ItemType>
void obj<ItemType>::operator = (const obj & copyThis){
_size = copyThis.getSize();
_array = new ItemType[_size];
for (int i = 0; i < _size; i++){
//assuming getItemAt is a function that returns whatever is in given location of object's _array
_array[i] = copyThis.getItemAt(i);
}
}
如果我的复制构造函数简单如下,会不会违反约定/被看不起/被认为不正确?
template<class ItemType>
obj<ItemType>::obj(const obj & copyThis){
this = copyThis;
}
【问题讨论】:
-
你试过编译吗?
-
你的赋值操作符会泄漏内存并且不处理自赋值。
-
你的复制构造函数坏了。是内存泄漏。因此,您最终会得到一个基本正常的构造函数,以及一个像筛子一样泄漏内存的损坏的复制构造函数。
-
operator=将数据从现有对象复制到另一个现有对象,因此您必须在替换现有旧数组之前delete[]。你没有这样做,所以你正在泄漏旧数组。 -
@ethanbin 你对
this的理解不正确。请参阅 C++ 标准的第 9.3.2 节,“classX 的成员函数中this的类型是X*。”
标签: c++ copy-constructor assignment-operator