1

我正在学习 C++ 并且正在阅读一本关于它的书,我遇到了这个问题:

struct Vector{
   int size;
   double* elem;
}

void vector_init(Vector& v, int s){
   v.size = s;
   v.elem = new double[s];
}

所以在这里,如果void vector_init(Vector v, int s)没有引用运算符,会错吗?&在传递对象、结构、数组或其他任何东西作为参数时,我是否必须手动通过引用传递?还有其他方法可以做到这一点吗?喜欢说void vector_init(Vector *v, int s)

任何帮助表示赞赏。

4

3 回答 3

2

没有“参考运算符”。

&声明符仅被添加到您希望通过引用传递的函数参数中。传递引用参数看起来与传递值相同。

于 2013-01-18T04:21:38.817 回答
1

如果void vector_init(Vector v, int s)没有引用运算符,会出错吗?

如果你不通过v引用传递,v当进入函数时会创建一个副本,vector_init你在那个副本上进行操作。退回后vector_init,该临时副本将被销毁,因此vector_init对您的原始v. 要对 original进行操作v,您需要v通过引用传递(与其他类型相同)。

还有其他方法可以做到这一点吗?喜欢说void vector_init(Vector *v, int s)

与通过指针传递相比,通过引用传递是更好的选择。

于 2013-01-18T04:25:42.933 回答
1

实际上通过引用void vector_init(Vector &v, int s))或指针 void vector_init(Vector *v, int s)传递值具有基本相同的含义。

主要区别在于,当你通过引用传递时,你被迫传递一个有效的参数(NULL不起作用),当你通过指针传递时,你必须显式地将参数转换为指针(这在通过引用传递时自动完成)

当您在 void 中按值vector_init(Vector v, int s)传递某些内容时,情况有所不同:参数是通过复制构造函数复制的,并且在函数范围内进行的每个修改都对参数的本地副本是本地的,您不能通过按值传递来修改原始参数. 您并没有真正传递变量,而是传递了它的副本。

这甚至意味着,如果参数是大型类或结构或具有昂贵的复制构造函数,则也可能出现性能问题。

于 2013-01-18T04:29:03.393 回答