0
Sample_Program-1

#include<iostream>
using namespace std ;

int main(){
const int i = 9;
 int *j = const_cast<int*>(&i); //Ok 
 int *j = const_cast<int*>(i);  //Error
}

Sample_Program-2

#include<iostream>
using namespace std ;

int main(){
const int i = 9;
 int j = const_cast<int&>(i);//Ok
 int j = const_cast<int>(i);//Error
}

私はちょうどいくつかのC ++の概念を学んでいて、上記の2つの概念に出会いました。上記の2つのサンプルプログラムでエラーとしてマークされた概念を誰か説明してもらえますか?

4

3 に答える 3

1

1) (const int*) を (int*) にキャストしています。したがって、 const 修飾子のため、そのアドレスに配置されている値を変更することはできません (メモリ内のアドレスへのポインターポイント)。(int*) にキャストすると、コンパイラはそのアドレスでデータの変更を許可します。

2) (const int) を int (int*) へのポインターにキャストしようとしています。(int) と (int*) は異なる型です。これは const_cast に文字列を float にキャストするよう依頼するのと同じです。const_cast 演算子は、変数の型を変更できません。そのようなものを作成するには、static_cast または reinterpret_cast に目を向ける必要があります。

3) const int を int への参照にキャストし、値を int に割り当てます (値を新しい変数にコピーしただけです)。この場合、j を変更しても i は変更されないため、これはおそらくあなたが望むものではありません。j の代わりに int への参照を作成してから、i の値を変更できます。

4) あなたがここで何をしようとしているのか理解できません。const_cast の考え方は、オブジェクトの const 保護を取り除くことです。したがって、この操作はポインターと参照に対してのみ可能です。const int を int にコピーするためのキャストは必要ありません。ただし、ポインターまたは参照を取得して保護を解除するまで、i の値を変更することはできません。

結論. const を削除することは、プログラミングの悪いスタイルです。関数が const int* 引数を持つライブラリを作成したとします。あなたのライブラリのユーザーは、自分の int が変更されないことを確信していますが、あなたがそれを変更したため、彼は必要なデータを失いました。

于 2012-12-26T14:35:06.273 に答える
0

あなたが書くとき

int *j = const_cast<int*>(i); 

「i」をポインターに変換しようとしています。 const_castデータ型の変更に使用するためのものではありません。

多分あなたが意味した

int *j = const_cast<int*>(&i); 
于 2012-12-26T14:11:12.910 に答える
0

最初のステートメントの説明は次のとおりです。

[非 const int ポインターへのキャスト] ( ['i' (const) へのポインターを取得] );

   const_cast<int*>   (        &i            );

2 番目のステートメントの説明は次のとおりです。

[非 const int ポインターへのキャスト] ( ['i' の値を取得] );

   const_cast<int*>    (     i       );

エラーは、整数値がポインター値ではないため、const_cast がそのキャストを実行できないためです。ポインターをポインターに、または参照を参照にのみマップできます。

3 番目のステートメントの説明は次のとおりです。

[非 const int 参照へのキャスト] ( ['i' (const) への参照を暗黙的に取得] );

    const_cast< int& >    (   i  );

2 番目のステートメントの説明は次のとおりです。

[非 const int 値にキャスト] ( ['i' (const) の値を取得] );

   const_cast< int >      (     i   );

エラーは、 const_cast を使用して値の間でキャストすることはできず、ポインターまたは参照の間でのみキャストするためです。値については、キャストではなく「変換」について話します。次のように:

int i_nc = i; // OK: 値がコピーされるため、const-cast は必要ありません。変換とは、ある型のオブジェクトの値を別の型のオブジェクトにコピーする方法です。キャスト演算子は、その目的には意味がありません。

于 2012-12-26T19:15:02.720 に答える