2012-09-05 24 views
5

誰能告訴我是什麼在C++將'&'放在函數的參數中的位置?

void fun(MyClass &mc); 

void fun(MyClass& mc); 

之間的區別?

+1

我相信這在大多數介紹性材料中都有解釋。 –

+1

爲了認識到這是一個語法問題,我不得不閱讀這個問題3次。 – 2012-09-05 11:59:28

+0

可能的[C++參考語法]重複(http://stackoverflow.com/questions/4515306/c-reference-syntax) –

回答

8

因爲沒有。

本來,C將使:

int x, *y; 

要聲明既是intx和指針爲int,y

因此,類型定義的一部分 - 使它成爲指針的位 - 可以與另一部分分開。

C++複製此批發。

然後引用添加的地方,他們得到了類似的聲明風格,除了&而不是*。這意味着允許MyClass &mcMyClass& mc

上上之選,當談到*,Strousup wrote

Both are "right" in the sense that both are valid C and C++ and both have exactly the same meaning. As far as the language definitions and the compilers are concerned we could just as well say "int*p;" or "int * p;"

The choice between "int* p;" and "int *p;" is not about right and wrong, but about style and emphasis. C emphasized expressions; declarations were often considered little more than a necessary evil. C++, on the other hand, has a heavy emphasis on types.

A "typical C programmer" writes "int *p;" and explains it "*p is what is the int" emphasizing syntax, and may point to the C (and C++) declaration grammar to argue for the correctness of the style. Indeed, the * binds to the name p in the grammar.

A "typical C++ programmer" writes "int* p;" and explains it "p is a pointer to an int" emphasizing type. Indeed the type of p is int*. I clearly prefer that emphasis and see it as important for using the more advanced parts of C++ well.

The critical confusion comes (only) when people try to declare several pointers with a single declaration:

int* p, p1; // probable error: p1 is not an int*

Placing the * closer to the name does not make this kind of error significantly less likely.

int *p, p1; // probable error?

Declaring one name per declaration minimizes the problem - in particular when we initialize the variables. People are far less likely to write:

int* p = &i; int p1 = p; // error: int initialized by int*

And if they do, the compiler will complain.

Whenever something can be done in two ways, someone will be confused. Whenever something is a matter of taste, discussions can drag on forever. Stick to one pointer per declaration and always initialize variables and the source of confusion disappears. See The Design and Evolution of C++ for a longer discussion of the C declaration syntax.

推而廣之,當它涉及到&MyClass& mc 「典型C++」 的風格相匹配。

5

編譯器沒有區別。

第一個更接近通常的C語法,後者更多的是C++ - ish。

相關問題