是否为引用分配了一个有效的操作?

时间:2012-02-23 19:00:48

标签: c++

我有以下代码:

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;

它运作得很好。

有人可以解释一下这里发生了什么。谢谢!

3 个答案:

答案 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,这很愉快。一旦设置了本地引用,它将引用该对象,直到它的作用域结束,周期。如果你需要改变它所引用的内容,那么你不需要引用,你想要一个指针。它们完全不同。