2013-12-20 76 views
-8

這是一個相當簡單的問題,但難以找到一個簡單的答案。 (編輯)const修改的結構變量和(編輯:)非常量結構變量,但結構具有所有常量成員之間的區別是什麼? :const struct {x} vs struct {const x}

typedef struct mystruct { 
    const int x; 
} t1; 
const t1 s1; 

VS

typedef struct { 
    int x; 
} t2; 
const t2 s2; 

? (如果答案與「班級相同」,請將其解釋爲課程或鏈接到解釋。)

+6

-1甚至沒有嘗試編譯代碼。 –

+0

@JesseGood:代碼不是一個完整的語句,當然它不會編譯。但它可以完成一個完整的,可編輯的聲明(參見[sftrabbit的答案](http://stackoverflow.com/a/20704183/1593077))。無論如何,修改這個問題有一個可編輯的聲明。請考慮刪除你的-1。 – einpoklum

+0

@einpoklum問題已編輯 – mathematician1975

回答

6

有沒有這樣的事情作爲const struct。你可能已經看到了這樣的事情:

const struct { 
    int x; 
} y; 

這是一個變量y與結構類型的聲明。變量yconst,而不是結構。你可以把它看作類似於:

struct mystruct { 
    int x; 
}; 

const mystruct y; 

沒有給結構類型一個名字。

+3

還有'struct {int x;} const y;',我比第一個更喜歡。我認爲在這種情況下'const'適用於對象是很合理的。 – chris

4

假設

const struct mystruct1 { 
    int x1; 
    int x2; 
} s1; 

struct mystruct2 { 
    const int x1; 
    int x2; 
} s2; 

對於s1你不應該賦值的任何成員。

對於s2只有會員x1不應該分配一個值。其中一個可以免費試用x2


爲了更接近你的榜樣,一個可以做:

typedef const struct mystruct1 { 
    int x1; 
    int x2; 
} S1; 

typedef struct mystruct2 { 
    const int x1; 
    int x2; 
} S2; 

S1 s1; 
S2 s2; 

對於s1s2此相同的規則,上述申請。


Upate

參考您的問題從字面上(暗示修正通過我的例子),還有在他們攜帶的價值而言constantness兩個結構之間沒有實際區別。

+0

在你的例子中,只有一些成員在非const結構中是const的,有些不是,這不是我所問的。當然,這兩個構念(辯解雙關)是不同的。 – einpoklum

+0

@einpoklum:請看我更新的答案。 – alk

+0

恩,我知道你寫了一個很好的和詳細的答案,但最後一點是我更新的問題的答案,所以你會介意只留下那部分,以便我可以接受? :-) – einpoklum

1

兩個對象a及以下b之間有效相差無幾:

struct A 
{ 
    int x, y; 
}; 

struct B 
{ 
    const int x, y; 
}; 

const A a; // (plus initialiser) 
B b;   // (plus initialiser) 

(你知道,當然,A其他情況下可能無法const -qualified然後你有明顯的區別。)

在一種情況下,您不能以任何不同的方式訪問成員。但是:

  1. 必須確保你初始化的成員,在這兩種情況下(我還沒有在這裏做);

  2. const -qualifiying的類型(而不是成員)影響參考結合:

    void foo(A& a); 
    void foo(B& b); 
    
    int main() 
    { 
        const A a; 
        B b; 
    
        foo(a); // Error! 
        foo(b); // OK 
    } 
    

    也是一樣的,當然,如果使用的指針,而不是一個參考的。當const上下文僅適用於類型而不是封裝在成員中時,它只會擴展到調用代碼。

+0

順便說一句,謝謝你沒有擊敗我。 – einpoklum

相關問題