gpt4 book ai didi

c++ - 复制构造函数和动态分配的数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:27 24 4
gpt4 key购买 nike

我会保持简短明了 - 为了练习动态分配的内存,我决定制作一个圆,我将在一个动态分配的数组中存储它的参数(X 和 Y 的中心和半径长度)。由于数组是动态分配的,这意味着为了阻止泄漏,我必须实现一个构造函数。这也意味着为了避免其他一些错误,我需要实现一个复制构造函数并重载赋值运算符。 (使用几乎相同的代码)我认为我已经相当好地实现了析构函数。不过,我确实需要一些有关复制构造函数的帮助。

#include <iostream>

using namespace std;

class Circle
{
private:
int* data;
public:
Circle(){
cout <<"I am the default constructor" << endl;
data = NULL;
}
Circle(int* p){
cout <<"I am the set up constructor" << endl;
data = p;
}
~Circle(){
cout <<"I am the destructor" << endl;
delete data;
}
Circle& operator=(const Circle& tt1){
cout << "Overloaded assignment operator reporting in!" << endl;
if(this != &tt1){
//free old data
delete this->data;
data = new int(3);
*data = *(tt1.get_data());
*(arr+1) = *(tt1->get_data()+1);
*(arr+2) = *(tt1->get_data()+2);
return *this;
}
}
Circle(const Circle& tt1){
cout << "I am the copy constructor!" << endl;
if(this != &tt1){
//free old data
delete this->data;
data = new int(3);
*data = *(tt1.get_data());
*(arr+1) = *(tt1->get_data()+1);
*(arr+2) = *(tt1->get_data()+2);
return *this;
}
}
};

int main(){
//is this object constructed well?
int arr [] = { 16, 2, 7};
Circle a(arr);

return 0;
}

最佳答案

//is this object constructed well?
int arr [] = { 16, 2, 7};
Circle a(arr);

答案是“是和否”:您的构造函数不会复制数组,它只是复制指向数组第一个元素的指针。因此,如果您不希望您的 Circle 类拥有该数组,则无需提供析构函数、复制构造函数或赋值运算符。

但是您确实更有可能希望您的类拥有该数组,在这种情况下,您需要制作它的本地拷贝并存储它。为此,您需要一条额外的信息:数组的大小,当传递给(并实现析构函数、复制构造函数、赋值运算符)一个采用指针的函数时,它会完全丢失。

编辑 因为这是在输入数组大小始终为 3 的情况下进行动态分配的练习,所以这是一个采用数组的构造函数示例:

Circle(int* p)
{
data = new int[3];
std::copy(p, p+3, data); // UB if p doesn't point to an array of at least 3 elements
}

您需要在析构函数中调用 delete[],因为您调用了 new[]:

~Circle()
{
delete [] data;
}

实现赋值运算符时,请考虑 copy and swap idiom .

关于c++ - 复制构造函数和动态分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16746989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com