作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下 C++11 中的简单代码,摘自 C++ Primer, 5th Edition :
#include <iostream>
#include <string>
using std::cout;
using std::string;
using std::endl;
int main()
{
string s("Hello World!!!");
for (auto &c : s) // for every char in s (note: c is a reference)
c = toupper(c); // c is a reference, so the assignment changes the char
cout << s << endl;
return 0;
}
该代码使用 range for
循环遍历 string
中的每个字符并将其更改为大写,这非常简单。令我困惑的是,引用 c
似乎在运行时发生了变化。在书中的其他地方,作者提到引用不是对象,不能在运行时更改。谁能阐明编译器究竟是如何解释这段代码的?
最佳答案
您说得对,不能更改引用以引用不同的对象;它必须被初始化以引用一个特定的对象,并且在它的整个生命周期中保持该对象的别名。
在这种情况下,引用不会改变;相反,为循环的每次迭代创建和销毁一个新引用。此范围式循环被定义为(或多或少)等同于旧式循环
for (auto it = s.begin(); it != s.end(); ++it) {
auto &c = *it;
// loop body
}
这样写,很明显每次都有一个新的引用,而不是(以某种方式)更新的单个引用。
关于c++ - 在 C++11 中,引用在运行时明显发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25849287/
我是一名优秀的程序员,十分优秀!