2016-11-14 105 views
1

我有一些沒有用的代碼,解決方案非常簡單:只需要​​以更長的方式編寫代碼即可。也就是說,執行以下操作:爲什麼我不能一次定義兩個指針?

我知道下面是正確的代碼:

int main() { 
    int a = 1, 
     b = 2; 
    return 0; 
} 

但我很驚訝地看到,下面給出了一個錯誤:

struct Foo { 
    int a = 0; 
}; 


int main() { 
    Foo* f = new Foo; 
    Foo* x = f, 
     y = f; 
    return 0; 
} 

這提供了以下錯誤:

error: conversion from ‘Foo*’ to non-scalar type ‘Foo’ requested 
      y = f; 
      ^

即使它會工作,如果你想更換的定義和y有:

Foo* x = f; 
Foo* y = f; 

所以能不能有人解釋爲什麼這是不允許的(或重定向我不可避免的其他SO問題,說明這一點,這是我不能用這個錯誤找到)?

回答

1

這就是爲什麼寫Foo* x的常見的C++風格,而不是Foo *x作爲優先採用C風格的,是錯錯就錯。

一元*行事權利,不在其左邊的東西。你

Foo* x = f, 
    y = f; 

的含義一樣

Foo *x = f; 
Foo y = f; 

如果你想堅持的簡寫,你必須寫爲每個變量的星號你聲明:

Foo *x = f, 
    *y = f; 

修飾符像const是相反的;他們將事情修改到他們的左邊。

Foo const x, y; 

相同

Foo const x; 
Foo const y; 

但是留意

Foo *const x, 
    *y; 

其中x常量指針非const美孚y非一個- 包含指針再次爲非常量富。

(在C和C++如今,首選風格是在寫每分號只有一個變量聲明,這確實是少了很多混亂。我會偶爾還是寫int i, j, k;但只有當它就是這麼簡單。)

4
Foo* x = f, 
y = f; 

這相當於:

Foo* x = f; 
Foo y = f; 

您需要添加另一個*

Foo* x = f, 
*y = f; 
1
Foo* x = f, 
     y = f; 

在功能上等同於:

Foo* x = f, 
    Foo y = f; 

如您所見,xy不是同一類型。因此,錯誤。

這是C和C++的「特性」之一。我個人總是附上*的標識,以減少此類問題:

Foo *x, y; 
0

需要重複*爲定義的每個變量:

Foo *x = f, 
    *y = f; 

否則,您聲明xFoo*yFoo(不能收到Foo*值)爲Foo *x = f, y = f;相當於Foo *x = f; Foo y = f;不是Foo *x = f; Foo *y = f;正如人們所想的那樣...

相關問題