当我们使用指针参数创建参数化构造函数时会发生什么?

时间:2016-02-03 09:23:25

标签: c++

例如,你能解释下面的代码会发生什么吗?

class Vector{
  int v[3];
  Vector(int *x);//parameterized constructor created
};

Vector::Vector(int *x)//definition of the parameterized constructor
{
  for (int i=0;i<size;i++)
    v[i]=x[i];//what happens here?? why did we take pointer as arguement?
}

根据我的理解,通过v[i]=x[i]我们创建了一个新数组,其中v的所有元素现在都在x中。为什么这需要一个指针参数?不能用引用&完成吗?

3 个答案:

答案 0 :(得分:2)

这可以追溯到旧式C习惯,当你可以将指针用作数组时,通过“索引”它的元素。

取自:https://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays

  • 声明为某种类型数组的变量充当指向该类型的指针。当它本身使用时,它指向数组的第一个元素。
  • 指针可以像数组名称一样索引。

然而,有几点说明:

  

v[i]=x[i]我们创建了一个新数组

不,你没有在这里创建一个新数组,当构造函数的主体被执行时,数组已经被创建了。这里发生的是,对于值v[i],我们将赋值:*(x + i)即。 ix。地址x指向的元素。除非您知道如何创建和初始化int,否则这是非常危险的代码。想象一下,您可以使用单个size的地址来调用此方法。我想,{{1}}是3或更少,否则此代码存在严重的安全问题。

在尝试访问它们指向的值之前,您应始终检查空指针。

答案 1 :(得分:1)

如果在编译时知道x的大小,可以通过引用传入数组:

Vector(int (&x)[3]);

如果您在编译时不知道大小,那么您所做的就是从不安全的代码到明显错误的代码。

如果您在编译时知道大小,则使用std::array,如果不知道,则使用std::vector

答案 2 :(得分:0)

为了向先前的答案添加一点,索引操作符[]实际上取消引用指针并同时将其转换为索引* sizeof(类型)。这同样涉及数组的声明。比如说,如果你声明int a[1];,这意味着a现在是指向int的指针,即int*。因此,如果您想将其作为参数传递给函数,则需要将其类型指定为int*