2013-02-16 78 views
11

以下兩行可以壓縮成一個嗎?變量是否可以在聲明的同一行上用istream初始化?

int foo; 
std::cin >> foo; 
+0

也許'int old; std :: cin >> old;'? – 2013-02-16 20:23:00

+0

不是,仍然是重複的。 http://stackoverflow.com/questions/12279601/are-there-any-tricks-to-use-stdcin-to-initialize-a-const-variable – djechlin 2013-02-18 00:30:43

+0

我重新命名這個古老和尷尬的問題,因爲它已經得到最近很受關注。 – 2017-04-22 01:29:03

回答

16

的絕頂聰明的笨蛋回答:

int old; std::cin >> old; 

可怕的答案:

int old, dummy = (std::cin >> old, 0); 

正確答案:old必須用聲明定義可以通過之前以operator>>作爲參數。在變量聲明中獲得函數調用的唯一方法是將其放置在上面的初始化表達式中。接受的方式來聲明一個變量,讀投入它是你寫的:

int old; 
std::cin >> old; 
+0

不錯,適當。 +1。 – 2013-02-16 20:25:35

+0

爲什麼另一個變量? – 6502 2013-02-16 20:32:50

+1

聰明的屁股答案,哈哈。謝謝,這是資料豐富的 – 2013-02-16 20:54:40

9

你可以...用

int old = (std::cin >> old, old); 

但你真的不應該這樣做

+1

啊,好點!聰明。 – 2013-02-16 20:55:30

+1

@ 6502爲什麼我們不應該做你說的? – Mohammasd 2017-07-19 07:25:03

2

使用功能:

int inputdata() 
{ 
    int data; 
    std::cin >> data; 
    return data; 
} 

然後:

int a=inputdata(); 

對於數據本身:

int inputdata() 
{ 
    static bool isDataDeclared=false; 
    if (isDataDeclared==true) 
    { 
    goto read_data; 
    } 
    else 
    { 
     isDataDeclared=true; 
    } 
    static int data=inputdata(); 
    return data; 
    read_data: 
    std::cin >> data; 
    return data; 
} 
+1

但是,現在呢也是用'data'來做! – 2013-02-16 20:56:05

+0

@JosephMansfield我認爲,在原始問題中,有時您只想將變量初始化爲用戶輸入值,而不是系統默認值,未定義值或您自己拒絕定義的值。儘管爲了數據的目的,我覺得沒有必要對它做「相同」操作,因爲它只存在於函數的本地範圍內,用於所有三行執行時間,並且可能在標記函數時作爲內聯,它甚至可能完全被優化。 'int old = inputdata();'可能最終等同於'int old; std :: cin >> old;'如果發生這種情況。 – thegreatjedi 2015-12-22 07:46:07

1

也許不是int,但對於自己的類型:

class MyType { 
    int value; 
public: 
    MyType(istream& is) { 
     is >> *this; 
    } 

    friend istream& operator>>(istream& is, MyType& object); 
}; 

istream& operator>>(istream& is, MyType& object) { 
    return is >> object.value; 
} 

然後你可以用istream傳遞給構造函數創建類型:

int main() { 
    istringstream iss("42"); 
    MyType object(iss); 
}