【问题标题】:C++ References vs pointers for variable inside for loop?C ++引用与for循环内变量的指针?
【发布时间】:2011-12-23 21:37:21
【问题描述】:

我可以使用 c 的引用变量(例如,Customer &c)吗?如果有怎么办?这比使用指针变量更可取吗?

    for(std::vector<Customer*>::const_iterator it = customers_.begin();
        it != customers_.end() ; it ++)
    {
        Customer *c = (*it);
        c->PrintName();
        ...
    }

【问题讨论】:

  • 为什么不直接使用迭代器呢?它->PrintName();
  • @Ferruccio:因为迭代器引用的是指针,而不是对象。你必须这样做(*it)-&gt;
  • 请注意,虽然指针可以处于无效或空状态(即它们是空指针),但引用不能。当然,情况似乎并非如此,因为您也没有在自己的代码中执行任何检查,但是指向指针的向量实际上并没有传达对其内容的承诺。如果它是对象的向量,您可以确定它们都是有效的对象。

标签: c++ for-loop iterator reference


【解决方案1】:

是的:

for(std::vector<Customer*>::const_iterator it = customers_.begin();
    it != customers_.end() ; it ++)
{
    Customer &c = *(*it);
    c.PrintName();
    ...
}

(括号不是必需的,但可能会更清楚。)

【讨论】:

  • 我认为应该是const Customer &amp;c,因为itconst_iterator
  • @OliCharlesworth:不,它是 pointee,它是 const。另外,想想如果customersconst vector&lt;Customer&gt; &amp;
【解决方案2】:

你可以:

for(std::vector<Customer*>::const_iterator it = customers_.begin();
    it != customers_.end() ; it ++)
{
    Customer const &c = **it;
    c.PrintName();
    ...
}

不过,您可能不想这样做。很有可能customers_ 应该是vector&lt;Customer&gt; 而不是vector&lt;Customer *&gt;,而不是调用它的PrintName 成员,你应该为operator&lt;&lt; 重载Customer。完成后,您将能够使用以下内容:

std::copy(customers_.begin(), customers.end(), 
          std::ostream_iterator<Customer>(std::cout, "\n"));

【讨论】:

  • +1 好点。我已经完成了大部分代码,并从引用语义转换为值语义。我正在查看的特定代码我不确定这是否可能,但我会记住它。也开始学习算法的使用,尽管它们是否有助于或损害可读性并不总是很明显。
  • @User:在 C++03 中,这经常值得商榷(尤其是从 for_each 调用成员函数与使用显式循环)。在 C++11 中,我很少看到算法不能更好地工作的情况(我怀疑一旦我知道 lambda 等更好,即使很少的坚持可能会消失)。
  • 您添加到引用变量中的const 是否导致无法调用客户的非常量方法?如果是这样,这与我的原始代码的行为不同,尽管我可以在其他循环中使用这个事实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
相关资源
最近更新 更多