2010-12-20 10 views
13

CおよびC++で変数のconst修飾はどのように異なるのですか?CとC++での "const"の違いは何ですか?

から:Does "const" just mean read-only or something more?

「何この質問を促したことは、この答えた:彼はCONST述べhttps://stackoverflow.com/questions/4024318#4024417 『単なる』手段は、読み取り専用C.に私はそれがすべてのconstは関係なく、CまたはCであったかどうかの意味だと思っ++彼はどういう意味ですか?

+0

http:// stackoverflow。com/questions/455518/how-many-of-the-use-of-const-in-c – karlphillip

+1

@karlphillip:答えではありません。これはC++でのconstの使用を列挙しますが、CとC++の間のconstの違いはリストしません。全然違う。 –

+0

答えがあれば、私はそれを投稿するでしょう。 – karlphillip

答えて

8

constを定数式の構築に使用することはできません。例えば

:ケースラベルが整数定数に減少させないため

#include <stdio.h> 
int main() 
{ 
    int i = 2; 
    const int C = 2; 
    switch(i) 
    { 
     case C : printf("Hello") ; 
     break; 

     default : printf("World"); 
    } 
} 

はCで動作しません。

+0

私は間違ったことを覚えているかもしれませんが、これはC99で変更されたと思います。 – ephemient

+0

@ephemient:Nopes。私の答えをもう一度チェックしてください。 –

7

constは、を意味します。変数を変更しないことを約束します。それはまだ変更することができます。

class A { 
    public: 
    A(const int& a); 
    int getValue() const; 
    void setValue(int b); 
    private: 
    const int& a; 
}; 
A::A(a) : a(a) {} 
int A::getValue() const { 
    return a; 
} 
void A::setValue(int b) { 
    a = b; // error 
} 

int main() { 
    int my_a = 0; 
    A a(my_a); 
    std::cout << a.getValue() << std::endl; // prints 0 
    my_a = 42; 
    std::cout << a.getValue() << std::endl; // prints 42 
} 

aが、main缶を変更することができませんA::*方法。それはCとC++の間ではほとんど同じです。持っていないどのようなC++


は不適切constを捨てるからプログラマを阻止することになっているconstをバイパスするカップル(制限)の方法、です。

このようなクラスをとってください。

class A { 
    public: 
    A(); 
    int getValue(); 
    private: 
    static int expensiveComputation(); 
    int cachedComputation; 
}; 

A::A() : cachedComputation(0) {} 

A::getValue() { 
    if (cachedComputation == 0) 
     cachedComputation = expensiveComputation(); 
    return cachedComputation; 
} 

cachedComputationは暗黙的にthis->cachedComputationを意味します。これを覚えておいてください。

int main() { 
    A a1; 
    const A a2; 
    std::cout << a1.getValue() << std::endl; 
    std::cout << a2.getValue() << std::endl; // error 
} 

a2.getValue()const方法はconst A a2で呼び出されているため、違法です。コンパイラは唯一const -nessは、他に何もキャストされていないことを確認しますので、一つは...

std::cout << ((A&)a2).getValue() << std::endl;   // C-style cast 
    std::cout << const_cast<A&>(a2).getValue() << std::endl; // C++-style cast 

const -nessを離れ唱えられる第二は、好ましいです。しかし、これはまだ理想的ではありません。代わりに、新しいメソッドがクラスに追加されるはずです。

class A { 
    public: 
    int getValue() const; 
}; 

A::getValue() const { 
    if (cachedComputation == 0) 
     cachedComputation = expensiveComputation(); // error 
    return cachedComputation; 
} 

は今const方法があるので、a2.getValue()で結構です。ただし、末尾のconstは、通常のようにA *thisポインターではなく、const A *thisポインターが指定されており、this->cachedComputationconst int &であり、突然変異ができないことを意味します。

const_castはメソッド内に適用できますが、このメンバーの宣言を変更する方が良いでしょう。今

class A { 
    private: 
    mutable int cachedComputation; 
}; 

、でもconst A *thisで、this->cachedComputationは、鋳造せずに突然変異させることができます。

+0

あなたの投稿は彼の質問に答えないと思う。あなたは** C **で 'const'について何も書いていません。 –

+0

@ephemient:@ Prasoonのビットを答えに加えると、私はそれを受け入れます。残念ながら、この時点ではどちらの回答も完全にその質問に答えられません。私はあなたの方がより完全であると信じています。 (FYI、gcc -std = c99でPrasoonの答えをテストして、彼が正しいことを確かめました) –

+1

@Prasoon:C++は可変キーワードを提供していますが、Cはそうではありません。私はそれが言語内のconstの使用に直接関係すると思います、間違っていますか?あなたの答えはまた重要な違いがあると私は信じています。 –

関連する問題