我有以下代码:
void cStatisticDBSerializer::GetStats (std::map <std::string, long long >& ioCounterStats,
std::map <std::string, long long >& ioGaugeStats,
bool iSwitch)
{
// Before getting the stats, clear the containers
ioCounterStats.clear ();
ioGaugeStats.clear ();
std::map <std::string, long long >& lStats = ioCounterStats;
if (iSwitch)
{
lStats = ioGaugeStats;
}
// Do something with lStats
}
问题是:将函数输入引用赋给局部变量lStats是否有效?由于某种原因,这编译得很好,但是没有按预期运行。但是,如果我将lStats更改为指针并按如下方式分配(例如):
std::map <std::string, long long >* lpStats = &ioCounterStats;
它运作得很好。
有人可以解释一下这里发生了什么。谢谢!
答案 0 :(得分:3)
创建参考后,您无法重新分配参考。相反,每次使用它都会“引用”原始作业。你的第一个例子相当于:
ioCounterStats /*lStats*/ = ioGaugeStats;
答案 1 :(得分:3)
初始化后,您无法更改引用引用的容器,但您可以使用该标志来控制初始化引用的容器。如果你想让lSwitch标志控制你引用的容器,你可以这样做:
void cStatisticDBSerializer::GetStats (std::map <std::string, long long >& ioCounterStats,
std::map <std::string, long long >& ioGaugeStats,
bool iSwitch)
{
// Before getting the stats, clear the containers
ioCounterStats.clear ();
ioGaugeStats.clear ();
std::map <std::string, long long >& lStats = iSwitch ? ioGaugeStats : ioCounterStats;
// Do something with lStats
}
如果iSwitch为true,则使lStats引用与ioGaugeStats相同的容器,如果为假,则引用ioCounterStats引用。
答案 2 :(得分:1)
是的,它完全有效。但是,正如您所指出的,它并不总能达到您的预期。小学:参考不是指针。有一个比较大的差异。 vs - &gt;。
如您所述,指针指向对象的地址(或null),并且可以随时更改。
引用,始终是对特定对象的引用。您的代码会收到您将ioCounterStats
引用到对象A
的引用,以及名为ioGaugeStats
的引用到对象B
的引用。然后,您lStats
也引用了A
。然后你说if (iSwitch)
将B
分配给A
,这很愉快。一旦设置了本地引用,它将引用该对象,直到它的作用域结束,周期。如果你需要改变它所引用的内容,那么你不需要引用,你想要一个指针。它们完全不同。