2010-09-15 148 views
3

在下面的代碼中,我在change()函數中使用了一個指向C++字符串的指針。指向C++的字符串

反正在使用字符串類的操作符時使用指向字符串的指針嗎?例如,at()適用於[]運算符,但有什麼方法可以使用[]運算符?

#include <string> 
#include <iostream> 

using namespace std; 

void change(string * s){ 

    s->at(0) = 't'; 
    s->at(1) = 'w'; 
    // s->[2] = 'o'; does not work 
    // *s[2] = 'o'; does not work 


} 

int main(int argc,char ** argv){ 

    string s1 = "one"; 

    change(&s1); 

    cout << s1 << endl; 

    return 0; 
} 
+0

'* S [2]'是接近,但不足夠接近。你打算寫'(* s)[2]'。 Postfix運算符總是綁定比前綴運算符強的,所以你必須在'* s'周圍使用括號。 – sellibitze 2010-09-15 21:46:05

回答

6

你正在運行到運算符優先級問題,請嘗試

(*s)[0] 
12

取消對它的引用:

(*myString)[4] 

不過,我建議,而不是一個指針,使用參考:

void change(string &_myString){ 
    //stuff 
} 

那個你可以像使用物體一樣使用所有的東西。

+0

謝謝!我將它作爲參考,但我的教授說不要使用它們,因爲當你讀取函數調用「change(s1);」時你不希望變量被修改。 – mmmmaaaatttttttttttttt 2010-09-15 21:14:16

+5

@mmmmaaaatttttttttttttt:這是一個不使用引用的不好理由。使用引用的好處是它明確表示參數不能爲空的條件。在一個大型項目中,這有助於明確需要進行空值檢查的位置,並消除了許多冗餘檢查的可能性。你的職能應該明確命名,以便預計他們的名字會有變異的行爲。 「變化」至少可以通過某種方式實現。 – 2010-09-15 21:25:34

+0

@mmmmaaaatttttttttttttt - 這可能是一個問題 - 當函數調用不如變化(s1)那麼明顯時 - 但更大的問題是NULL是否爲有效值。在你的profressor類之外,使用一個引用「如果參數是必需的,函數不會存儲指向它的指針或以其他方式影響它的所有權」(Sutter&Alexandrescu,「C++編碼標準」)。 – 2010-09-15 21:31:43

3

首先,沒有理由在這裏通過指針傳遞std::string,請使用引用。其次,我認爲這可能是工作:

(*s)[i] 

但更好的是:

void change(string &s) 
{ 
    s.at(0) = 't'; 
    s.at(1) = 'w'; 
    s[2] = 'o'; 
    s[2] = 'o';  
} 

減少了提領爲好。

5

另一種解決方案,爲了完整性的緣故:

s->operator[](2) = 'o';