2013-06-05 90 views
-6

我剛剛遇到好幾個在線例子。C++:高級函數定義

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) { 
    std::stringstream ss(s); 
    std::string item; 
    while (std::getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 


std::vector<std::string> split(const std::string &s, char delim) { 
    std::vector<std::string> elems; 
    split(s, delim, elems); 
    return elems; 
} 

斯普利特正在調用裏面的其他分裂。這是否允許?這兩個函數具有相同的名稱,C++能夠根據參數的數量選擇使用哪一個?

此外,我想定義類Event的對象如何用字符串表示。這是一段代碼,爲我的作品:

inline ostream & operator << (ostream & Str, Event const & event) 
{ 
     //do stuff here  
     return Str; 
} 

除了在線,我不明白這個聲明是如何工作的(&,運營商,< <,等...)

謝謝你爲你的時間。

+5

「教我C++」不是一個特定的編程問題。閱讀教程。 – 2013-06-05 21:20:42

+0

爲了理解第一個例子查找函數重載,那麼當你明白這一點時,查閱操作符重載來理解第二位。 – Joel

+0

這裏是Google的一個開始:1)函數重載2)轉換構造函數。 – andre

回答

0
  1. Function overloading允許具有相同名稱但具有不同數目的參數或者類型中的用途的多重功能/方法。這些函數被放入重載解析中,並且根據傳遞給split的參數類型(或參數數量),編譯器將在調用它們時嘗試選擇正確的函數。

  2. T& x意味着x是有史以來T對象的參考它是必然的。當在參數列表中使用參考時,表示沒有執行復制/移動構造,並且對象x現在是其變量的別名。請注意,非const引用不能綁定到臨時對象(又名右值)。

    對於您的其他問題,請搜索Operator Overloading

+0

爲什麼ostream $ Str作爲參數被傳遞?這就是<< operator是如何工作的? –

+0

@quannguyen這是一個全局運算符重載。運算符有兩個參數,其中一個必須是類類型,第一個參數是std :: ostream的一個對象,'&'表示一個引用,總的來說,第一個參數類型是'std :: ostream& 'str'只是參數的名字,你可以這樣使用它:'std :: cout << str'(其中'evt'是'Event'類型的對象)。 – 0x499602D2

+0

很有意義,謝謝! 我認爲你的意思是std :: cout << evt –