我在过去的几天里一直在教自己C ++,并遇到了一些我可以使用一些进一步解释的情况。除了明显的类,命名等之外,下列方法之间有什么区别?
void OnTimer(wxTimerEvent &event) ...
void addNPC(Sprite *spr) ...
接收值的那些方法是否通过引用传递并执行相同的操作?如果是这样,有什么区别?当我第一次开始阅读时,我看到了这样的方法:
addNPC( &sprite );
所以我假设当你编写一个接收内存指针的方法时,在方法参数中你必须像声明一个内存指针/位置一样编写它,而不仅仅是一个值。但后来我看看OnTimer方法,我发现它也有一个传递的引用。有什么区别?
最后,这两件事情是否相同,只是实际的编码风格?
void addNPC(Sprite& spr) ...
void addNPC(Sprite &spr) ...
答案 0 :(得分:4)
最后一个问题:两个函数原型是等价的。在C或C ++中,空格大多不重要。
至于引用和指针之间的区别,可以将引用视为指针的“语法糖”,并附加限制,它不能为NULL。有关详细信息,请参阅C ++ FAQ:https://isocpp.org/wiki/faq/references
答案 1 :(得分:1)
wxTimerEvent &event
是对象的引用。它的行为类似于普通变量,但它引用了函数之外的变量。对本地引用所做的任何更改实际上都在更改原始引用。它本质上是一个指针,您可以作为普通变量访问它,它不能是NULL
。
Sprite *spr
是指向外部变量的真实指针。在本地进行的任何更改也在函数外部进行。它可以是NULL
!
最后两项完全相同。空格在C / C ++代码中并不重要。
答案 2 :(得分:1)
void addNPC(Sprite *spr)
在上面的代码中,你需要传递Sprite对象的地址,如下所示,因为它接收指针。
addNPC( &sprite );
对于功能
void OnTimer(wxTimerEvent &event)
调用必须如下所示,因为它引用了wxTimerEvent对象。
wxTimerEvent evt;
OnTimer(evt);//Passing object by reference.
在呼叫地点,语法是相同的 都是按价值传递并经过 参考
对于你的上一个问题,它们都是相同的,只是编码风格的区别。
答案 3 :(得分:1)
除了其他答案之外,还有一个const引用的特性 - 你可以为它分配临时对象,只要const引用处于活动状态,对象就会存在。
string its_alive();
void foo() {
const string& some_string = its_alive();
...
}
因此,如果引用的用户不负责对象的破坏,并且NULL对象没有意义,那么你使用引用。
这是名誉GotW #88,用于解释const对临时对象的引用。