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++ 参考的主要内容,如果未能解决你的问题,请参考以下文章