c参考语义在调用者的代码中不明确

Yua*_*Wen 0 c c++

任何人都能解释一下吗?

旧行C程序员有时不喜欢引用,因为它们提供了调用者代码中不明确的引用语义.

pax*_*blo 7

当您使用C++函数时:

void make42 (int &x) { x = 42; }
Run Code Online (Sandbox Code Playgroud)

并称之为:

int y = 7;
make42 (y); // y is now 42
Run Code Online (Sandbox Code Playgroud)

那么有没有在指示make42 (y)该呼叫y是可以改变的.如果它不是 pass-by-reference参数,则会进行完全相同的函数调用:

void trymake42 (int x) { x = 42; }

int y = 7;
trymake42 (y); // y is still 7
Run Code Online (Sandbox Code Playgroud)

在C代码中,它将是这样的:

void make42 (int *px) {
    *px = 42;
}
int y = 7;
make42 (&y);
Run Code Online (Sandbox Code Playgroud)

明确表示y在调用函数时,更改是一种真正的可能性.

那么这些"旧线"C编码器会关注的是:

someFunction (x);
Run Code Online (Sandbox Code Playgroud)

在那里他们将不知道从刚才这是否x会改变与否.

我不得不说,作为这些旧线路编码器之一,它远不如引用似乎暗示的问题.在没有看到原型的情况下,我甚至无法分辨参数类型应该是什么,或者有多少参数类型,或者它们的顺序.

因此,必须参考所述原型来确定参数是按值传递还是按引用传递并不是一件大事.

C#使用outref参数修饰符采用不同的方法,但仍然使它在调用中显式是变量是值传递还是传递引用.

  • "作为这些旧线路编码器之一,它远不如引用似乎暗示的问题" - 同样在这里.如果我将`char*`传递给函数,函数是否会修改字符串?这取决于功能.即使在C#中,如果您在对象上调用方法或将对象引用作为参数传递,您也不知道该方法是否会更改该对象.更改需要调用站点语法的参数值有什么特别之处? (2认同)