2015-05-04 89 views
2

與以下代碼的for循環一樣,爲什麼我們必須使用引用(&c)更改c的值。爲什麼我們不能在for循環中使用c。 也許它是關於參數和參數之間的區別?for循環中的C++引用

#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; 
} 

回答

2

如果不使用引用,則代碼看起來像邏輯

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); 
} 

那麼在這種情況下,cs1[i]時的參考聲明

c = toupper(c); 

改變s1[i]本身。

這同樣適用於基於範圍的陳述。

+0

Thx很多爲您的答案。真的幫助我理解。 – LiuHao

1

你不能只用c,因爲那會複製創建的每個字符的副本,升級副本,然後把它扔掉。引用(或指針)是C++用來傳播對象變化的結構。

4

在的情況下:

爲(自動cCpy:S1)

cCpy是字符的當前位置的拷貝

在的情況下:

爲(自動& CREF:S1)

CREF爲參考到字符上的當前位置。

它與參數和參數無關。他們連接到函數調用(你可以在這裏閱讀:"Parameter" vs "Argument")。