我正在学习 C++,我正在尝试理解基于范围的 for 循环。 考虑下面的代码
std::array<int,5> items{1,2,3,4,5};
for(int item: items){
std::cout << std::setw(10) << item;
}
std::cout << std::endl;
for(int item: items){
item++;
std::cout << std::setw(10) << item;
}
std::cout << std::endl;
for(int item: items){
std::cout << std::setw(10) << item;
}
std::cout << std::endl;
打印出来了
1 2 3 4 5
2 3 4 5 6
1 2 3 4 5
因此,我理解
item
取相应元素的值。这让我想知道更复杂的类型会发生什么。我的猜测是 item
是一个局部变量,它获取 items
中相应元素的副本。这是否意味着如果 items 是较大对象的数组,比如
std::array<MyObject,5> items
for 循环获取每个元素的副本?
(ps,我知道我可以使用
int& item: items
更改原始项目的值)。
默认情况下它会复制元素。但是,当引用您得到的项目时,好吧,引用和值将会被更改。
for(int &item: items){
item++;
}
使用对象时,请避免以这种方式调用复制构造函数。
调用复制构造函数。
for (Object item: items) { }
没有调用复制构造函数
for (Object &item: items) { }
当您需要无复制构造函数调用的性能但又不更改对象时,请将它们设置为 const。
for (const Object &item: items) { }