获取传递给对象时的数组长度
Getting length of an array when passed to an object
我正在学习指针,以及如何使用它们将数组(未分配大小)发送到对象。最终,我试图学习如何使用运算符重载而不是在 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 工作。
没办法,你应该将长度作为附加函数的参数传递。
将数组作为参数传递几乎就像将指针传递给它的第一个元素一样,你会丢失有关其大小的所有信息。
相关文章:
- 销毁C++中动态分配的内存(数组对象)
- 数组对象的生存期是否在重用其元素存储时结束?
- 为什么顶点数组对象会导致错误?
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- OpenGL 顶点数组对象与 tinyobjloader
- 将数组/对象/结构列表从C#库中传递给C MFC应用程序
- C++ RapidJson 帮助反序列化数组对象
- ptrdiff_t可以表示指向同一数组对象元素的指针的所有减法吗?
- 检查成员函数是否返回临时对象或数组对象
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 当数组对象以函数参数传递时,为什么复制构造函数会自称
- 如何使用箭头指针打印出一类数组对象,这些对象中有多个分数
- C++17 std::shared_ptr<> 类数组对象的重载运算符 []
- 添加两个具有运算符重载的数组对象,从而导致分段错误
- opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗
- 使用相同的数据填充数组对象或使用指针
- 方法用于最快的分配,并且不需要将动态大小的数组对象作为局部变量
- 如何将2d数组对象传递给c++中的函数
- ReferenceTable溢出(jni-android),数组对象释放