获取传递给对象时的数组长度

Getting length of an array when passed to an object

本文关键字:数组 对象 获取      更新时间:2023-10-16

我正在学习指针,以及如何使用它们将数组(未分配大小)发送到对象。最终,我试图学习如何使用运算符重载而不是在 c++ 中使用"vector"来添加和多重数组。

我定义了一个名为 vector 的类,如下所示,

class vector
{
private:
    int len;
    int *pvec;
}
public:
    vector(int array[])
    {
        len = sizeof(array)/sizeof(*array);
        cout<<len<<endl;
        pvec = new int[len+1];
        for(int i = 0;i<len;i++)
         {
            pvec[i] = *(array + i);
         }
    }
    void display()
    {
        cout<<"[";
        for(int i = 0;i<len;i++)
        {
            cout<<pvec[i];
            if(i < len-1)
            {
                cout<<",";
            }
        }
        cout<<endl;
    }
};

我声明了一个类向量的对象,如下所示

int vec1[] = {1,2,3,4};
vector v(vec1);

当我尝试使用成员函数显示向量中的元素时

v.display();

输出如下

2
[1,2]

但如您所见,向量的长度为 4,但在输出中显示为 2。如果我尝试将 main 中的数组长度显示为

cout<<sizeof(vec1)/sizeof(*vec1)<<endl;

长度显示为 4,但如果我将相同的数组传递给对象,它显示为 2。

如果有人能指出这个程序中的错误,我将不胜感激。

一旦数组作为指针传递给函数,就无法计算数组的大小。

但是,您可以使用构造函数的几个重载来帮助您满足需求。

在第一个中,期望一个指向数组和大小的指针。

vector(int array[], int size) : len(size)
{
   cout<<len<<endl;
   pvec = new int[len+1];
   for(int i = 0;i<len;i++)
   {
      pvec[i] = *(array + i);
   }
}

在第二个中,使用数组大小为模板参数。使其成为调用第一个的委托构造函数一个来做工作。

template <int N> vector(int (&array)[N]) : vector(array, N) {}

有了这个,您可以使用:

// Use the first constructor
int* array1 = new int[20];
vector v1(array1, 20);
// Use the second constructor
int array2[10] = {0};
vector v2(array2);

看到它在 http://ideone.com/RJN1gd 工作。

没办法,你应该将长度作为附加函数的参数传递。

数组作为参数传递几乎就像将指针传递给它的第一个元素一样,你会丢失有关其大小的所有信息。