【问题标题】:C++ reference in for loopfor 循环中的 C++ 参考
【发布时间】:2015-07-13 13:53:36
【问题描述】:

正如下面代码的for循环,为什么我们必须使用引用(&c)来改变c的值。为什么我们不能在for 循环中使用c。 也许是关于argument和parameter的区别?

#include "stdafx.h"
#include<iostream>
#include<string>

using std::string;
using std::cout;
using std::cin;
using std::endl;
int main()
{
    string s1("Hello");
        for (auto &c : s1)
            c = toupper(c);
            cout << s1 << endl;
    return 0;
}

【问题讨论】:

    标签: c++ loops for-loop reference


    【解决方案1】:

    您不能只使用c,因为那样会复制为每个角色创建一个副本,更新该副本,然后将其丢弃。引用(或指针)是 C++ 用来传播对象变化的结构。

    【讨论】:

      【解决方案2】:

      如果发生:

      for (auto cCpy : s1)

      cCpy 是当前位置字符的副本

      如果发生:

      for (auto &cRef : s1)

      cRef 是对当前位置字符的引用

      它与参数和参数无关。它们连接到函数调用(您可以在此处阅读:"Parameter" vs "Argument")。

      【讨论】:

        【解决方案3】:

        如果不使用引用,那么代码在逻辑上看起来类似于

        for ( size_t i = 0; i < s1.size(); i++ )
        {
            char c = s1[i];
            c = toupper( c );
        }
        

        即每次在循环中都会有更改的对象c 获取s1[i] 的副本。 s1[i] 本身不会改变。 但是如果你会写

        for ( size_t i = 0; i < s1.size(); i++ )
        {
            char &c = s1[i];
            c = toupper( c );
        }
        

        那么在这种情况下,c 是对 s1[i] when 语句的引用

            c = toupper( c );
        

        更改 s1[i] 本身。

        同样适用于基于范围的for语句。

        【讨论】:

        • 非常感谢您的回答。真的帮助我理解。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 2018-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多