【问题标题】: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语句。