for 循环中的 C++ 参考
C++ reference in for loop
如下面代码的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
,因为那样会复制每个角色的副本,更新副本,然后将其丢弃。引用(或指针)是 C++ 用来传播对象变化的结构。
如果是:
for (auto cCpy : s1)
cCpy 是当前位置字符的副本。
如果是:
for (auto &cRef : s1)
cRef 是对当前位置字符的引用。
与参数和参量无关。它们连接到函数调用(您可以在这里阅读:"Parameter" vs "Argument")。
如果不使用引用,那么代码在逻辑上看起来像
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
的值。为什么我们不能在 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
,因为那样会复制每个角色的副本,更新副本,然后将其丢弃。引用(或指针)是 C++ 用来传播对象变化的结构。
如果是:
for (auto cCpy : s1)
cCpy 是当前位置字符的副本。
如果是:
for (auto &cRef : s1)
cRef 是对当前位置字符的引用。
与参数和参量无关。它们连接到函数调用(您可以在这里阅读:"Parameter" vs "Argument")。
如果不使用引用,那么代码在逻辑上看起来像
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语句的范围