for 循环中的 C++ 参考

Posted

技术标签:

【中文标题】for 循环中的 C++ 参考【英文标题】:C++ reference in for loop 【发布时间】: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;

【问题讨论】:

【参考方案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语句。

【讨论】:

非常感谢您的回答。真的帮助我理解。

以上是关于for 循环中的 C++ 参考的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的变量对象名称

如何在 C++ 'for' 循环中放置两个增量语句?

c++中for循环和switch语句哪个更高效

qt 循环函数都有哪些?像c语言的for while类似的那种?

求自然数1到100之和,用for语句实现,C++

c++ 在 for 循环中的 vector<char> 中的 for 循环中的内存分配