mm等于毫米 2024-05-27 19:27 采纳率: 25%
浏览 1

关于#c++#的问题:MyArray

#问题:C++拷贝构造中的形参类型和传进来的实参类型必须是同类型吗?

#include<iostream>

using namespace std;

template <class T>
class MyArray
{
public:
    MyArray(int capacity)
    {
        this->mCapacity = capacity;
        this->mSize = 0;
        this->pAddr = new T[this->mCapacity];
    }

    MyArray(const MyArray<T>& arr)//拷贝构造
    {
        this->mSize = arr.mSize;
        this->mCapacity = arr.mCapacity;

        this->pAddr = new T(this->mCapacity);
        for (int i = 0; i < this->mSize; i++)
        {
            this->pAddr[i] = arr.pAddr[i];
        }
    }

    T& operator[](int index)
    {
        return this->pAddr[index];
    }

    MyArray<T> operator= (const MyArray<T>& arr)
    {
        if (this->pAddr)
        {
            delete[] this->pAddr;
        }
        this->mSize = arr.mSize;
        this->mCapacity = arr.mCapacity;

        this->pAddr = new T(this->mCapacity);
        for (int i = 0; i < this->mSize; i++)
        {
            this->pAddr[i] = arr.pAddr[i];
        }

        return *this;
    }

    void PushBack(T& data)
    {
        //判断容器中是否有位置
        if (this->mSize >= this->mCapacity)
        {
            return;
        }
        this->pAddr[this->mSize] = data;//????想知道这行调用的是拷贝构造还是等号操作符重载还是等号赋值??
        this->mSize++;

    }

    void PushBack(T&& data)
    {
        //判断容器中是否有位置
        if (this->mSize >= this->mCapacity)
        {
            return;
        }
        this->pAddr[this->mSize] = data;
        this->mSize++;

    }

    ~MyArray()
    {
        if (this->pAddr)
        {
            delete[] this->pAddr;
        }
    }
public:
    //一共可以容下多少个元素
    int mCapacity;
    //当前数组有多少元素
    int mSize;
    //保存数据的首地址
    T* pAddr;
};

void test0401()
{
    MyArray<int> marray(20);
    int a = 10;
    marray.PushBack(a);
    marray.PushBack(100);
    for (int i = 0; i < marray.mSize; i++)
    {
        cout << marray[i] << " ";
    }
    cout << endl;
}

int main04_1(void)
{
    test0401();
    return 0;
}

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-27 19:27
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在C++中,拷贝构造函数的形参类型和传进来的实参类型通常需要是相同的。拷贝构造函数用于创建一个新对象,该对象是另一个同类型对象的副本。在模板类中,形参类型应该与模板实例化时指定的类型一致。

    关于你提供的代码,有几个关键点需要说明:

    1. 拷贝构造函数

      • 你的拷贝构造函数MyArray(const MyArray<T>& arr)是正确的,它接受一个同类型对象的引用作为参数。
      • 但在拷贝构造函数中,为pAddr分配内存时应该使用new T[this->mCapacity]而不是new T(this->mCapacity),因为new T[size]是用来分配数组的语法,而new T(n)是用于分配单个对象的语法。
    2. 赋值操作符重载

      • 赋值操作符operator=也是正确的,它接受一个同类型对象的引用作为参数。
      • 赋值操作符的实现中,首先检查自赋值情况,然后释放当前对象的内存,接着复制新对象的属性,并重新分配内存和复制数据。
    3. PushBack成员函数

      • PushBack(T& data)函数中,this->pAddr[this->mSize] = data;这行代码调用的是T类型的拷贝赋值操作符(即operator=),它将data的值拷贝到pAddr指向的数组中。
      • PushBack(T&& data)函数中,由于data是右值引用,这行代码实际上是通过移动语义来避免不必要的拷贝,这是C++11引入的特性,用于优化性能。
    4. 测试函数test0401()

      • 测试函数创建了一个MyArray<int>类型的数组,并向其中添加了两个整数值。
      • 然后通过下标操作符operator[]输出数组中的元素。
    5. 参考资料

      • C++ Primer (5th Edition) by Stanley B. Lippman, Josée Lajoie, and Barbara E. Moo
      • Effective Modern C++ by Scott Meyers
      • A Tour of C++ by Bjarne Stroustrup

    修正后的拷贝构造函数和赋值操作符重载如下:

    MyArray(const MyArray<T>& arr)
    {
        this->mSize = arr.mSize;
        this->mCapacity = arr.mCapacity;
        this->pAddr = new T[this->mCapacity]; // 正确分配数组内存
        for (int i = 0; i < this->mSize; i++)
        {
            this->pAddr[i] = arr.pAddr[i];
        }
    }
    
    MyArray<T>& operator=(const MyArray<T>& arr)
    {
        if (this != &arr) // 检查自赋值
        {
            delete[] this->pAddr;
            this->mSize = arr.mSize;
            this->mCapacity = arr.mCapacity;
            this->pAddr = new T[this->mCapacity]; // 正确分配数组内存
            for (int i = 0; i < this->mSize; i++)
            {
                this->pAddr[i] = arr.pAddr[i];
            }
        }
        return *this;
    }
    

    请注意,上述代码中使用的new T[this->mCapacity]是正确的语法,用于分配数组类型的内存。而new T(this->mCapacity)是错误的语法,应该被修正。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月27日

悬赏问题

  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码