将'&'放在函数的参数中的位置?

Tho*_*mas 5 c++ function parameter-passing

任何人都能告诉我它们之间有什么区别

void fun(MyClass &mc);
Run Code Online (Sandbox Code Playgroud)

void fun(MyClass& mc);
Run Code Online (Sandbox Code Playgroud)

在C++中?

Jon*_*nna 8

没有给出.

最初,C允许:

int x, *y;
Run Code Online (Sandbox Code Playgroud)

要声明的双方int,x和指针为int y.

因此,类型定义的一部分 - 使其成为指针的位 - 可以与另一部分分开.

C++复制了这个批发.

然后引用添加的地方,并且他们得到了类似的声明风格,除了&而不是*.这意味着,无论MyClass &mcMyClass& mc被允许.

关于它的选择*,Strousup 写道:

两者都是"正确的",因为它们都是有效的C和C++,并且两者具有完全相同的含义.就语言定义和编译器而言,我们也可以说"int*p;" 或"int*p;"

"int*p;"之间的选择 和"int*p;" 不是对与错,而是关于风格和重点.C强调表达; 声明通常被认为只是一种必要的邪恶.另一方面,C++非常重视类型.

"典型的C程序员"写"int*p;" 并解释它"*p是什么是int"强调语法,并可能指向C(和C++)声明语法来争论样式的正确性.实际上,*绑定到语法中的名称p.

"典型的C++程序员"写"int*p;" 并解释它"p是指向int的指针"强调类型.实际上,p的类型是int*.我显然更喜欢这种强调,并认为它对于使用C++的更高级部分非常重要.

当人们试图用单个声明声明几个指针时,(仅)会产生严重的混淆:

int*p,p1; //可能的错误:p1不是int*

将*放置得更接近名称不会使这种错误显着降低.

int*p,p1; //可能的错误?

为每个声明声明一个名称可以最大限度地减少问题 - 特别是在我们初始化变量时.人们不太可能写作:

int*p =&i; int p1 = p; //错误:由int*初始化的int

如果他们这样做,编译器会抱怨.

每当某些事情可以通过两种方式完成时,某人会感到困惑.每当某件事情成为品味问题时,讨论就会永远拖延下去.坚持每个声明一个指针,并始终初始化变量,混乱的来源消失.有关C声明语法的详细讨论,请参阅C++的设计和演变.

通过扩展,当涉及到时&,MyClass& mc匹配"典型的C++"风格.


Luc*_*ore 5

编译器没有区别.

第一个更接近通常的C语法,后者更多是C++ - ish.