2011-01-30 6 views
0

メインでgに渡すときに何が起こるか教えてもらえますか?それはstatic_castですか?参照を受け取る関数に渡すconstをキャストすると、どうなりますか?

int & g (int&x){x++ ; return x ; } 
int main() 
{ 

    const int a=5 ; 
    cout<<g((int&)a)<<endl; 
} 

上記のコードは以下のものと類似しているので、私は、何のコピーが行われていないことを確信している:事前に

class A 
{ 
public: 
    A() 
    { 
     cout << "calling DEFAULT constructor\n\n"; 
    } 
    A(A& Other) 
    { 
     cout << "Calling COPY constructor\n\n"; 
    } 
    ~A() 
    { 
     cout << "Calling DESTRUCTOR\n\n"; 
    } 
}; 

A& g(A& x) 
{ 
    cout << "Inside g(A& x) \n\n"; 
    return x; 
} 

void main() 
{ 
    const A a; 
    g(const_cast<A&>(a)); 
}*/ 

感謝:)

+3

['main'の戻り値の型は常に' int'です](http://stackoverflow.com/questions/4207134/what-is-the-proper-declaration-of-main/4207223#4207223)。 –

+0

@James:あなたは標準と言っていますか?私が非標準的に書いたものですか?私はあなたの答えを待っていて、ありがとうalot :) –

+0

ちょうど最後の質問は、 "a"を変数(constではなく)にすると、どのようなキャストが適用されますか?お返事いただいた人のおかげで:) –

答えて

8

static_castはconst性を除去することはできません。これはconst_castです。

constオブジェクトを変更するため、実行時にこのコード(最初の例)では未定義の動作が発生します。

+0

私は、const_castの代わりにstatic_castを紛失して書きました。お返事いただきありがとうございます。 –

+0

未定義の動作は実行時に限定されていますか?あるいは、コンパイラーが違反を検出し、コンパイル時などにコンピューターを再起動する可能性がありますか? – fredoverflow

+2

@Fred:私の理解では、式は評価されるときに未定義の振る舞いしか生じないということです。したがって、未定義の振る舞いは実行時に限定されると思います。なぜなら、式が評価される保証がないからです(例えば、別の翻訳単位に 'std :: exit()'を呼び出す静的初期化があるかもしれない。 –

0

intの場合、参照を渡すだけのコードはありません。キャストでコンパイルできます。

+0

私は知っていますが、コンパイラは暗黙のうちにどのようなキャストを行いますか? –

+1

intのビットは参照と同じではありませんので、確かにキャストを再解釈しません。 intは仮想関数を持つクラスではないため、intはintのスーパークラスではないため、これは確かに動的ではありません。定数を変更することはできないので、静的にすることはできません。だから、それが何かであれば、それは一定ですが、古いスタイルのキャストは新しいスタイルのものをやらなければならないということは何も言いません。 –

+2

実際には、Cスタイルのキャストはstatic、const、およびreinterpretキャストの観点から指定されているため、これらの3つの組み合わせを常に実行します(ただし、一部の動作がわずかに異なります。静的キャストを実行する前に基本クラスのアクセシビリティが確保されているため、Cスタイルのキャストを使用してプライベートベースにキャストできますが、静的キャストは使用できません。 –

1

Cスタイルのキャストは悪質なことです。reinterpret_cast<>またはconst_cast<>が行うことはすべて行います。それは、Cが正当に悪名高いものであることを、チェーンソーの使い易いチェーンソーの力の1つです。

C++スタイルのキャストを使用すると、const_cast<>を実行する必要があることが示されます。それで、なぜそれを行うのがよいかを尋ねて、それを行うより良い方法を見つける必要があります。

関連する問題