2013-02-16 75 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); 
}