【发布时间】:2011-09-07 17:12:34
【问题描述】:
我正在查看我在旧代码库中发现的一些东西,我很困惑。
这是一个函数定义:
void vUpdateSequenceDetailsAndIncrement(
const CallEvent& roCPEvent,
const CallInfo& roCallInfo,
BOOL bCreationEvent);
这里被调用:
vUpdateSequenceDetailsAndIncrement(roCPEvent, NULL, FALSE);
这里 NULL 被直接传递给引用参数roCallInfo。该函数最终调用:
vTimeChange(*pSeqDetails, roCPEvent, roCallInfo);
定义:
void vTimeChange(const SequenceDetails& roSequenceDetails,
const CallEvent& roCPEvent,
const CallInfo& roCallInfo)
再次将可能为 NULL 的值传递给 roCallInfo。我认为 NULL 不能作为参考传递?有谁知道 VC++ 4.x 是否有某种问题使这种代码没问题?如果 NULL 可以作为引用传递,那么在 vTimeChange 中会发生这样的事情:
roCallInfo.getCallStartTime();
这不是像我一样取消引用 NULL 吗
CallInfo * info = NULL;
info->getCallStartTime();
? 无论如何,我可能会在那里放置一个警卫,并让编译器在不必要时将其删除,但我很想深入了解这是如何发生的!
谢谢。
【问题讨论】:
-
@Mark Ransom - 实际上是的。这确实有帮助。我以为我已经阅读了所有这些问题。下面的 c-smiles 答案仍然很有趣。
-
对
info->getCallStartTime()的调用不一定取消引用NULL。该语法只会导致info的地址作为this传递。如果函数中的第一条语句是if (this == NULL) return,那么就不会有解引用和未定义的行为。
标签: c++ visual-c++ reference null-pointer