c++の変数を削除するconstタイプ

3440 ワード

const_cast (expression)
const_cast変換子は、変数を除去するためのconstまたはvolatile限定子です.後者については、マルチスレッドの設計に関連しているため、よく分かりませんが、私はこの方面について何も知りません.だから私はconstの内容だけを話します.
 
const_でキャストによるconst制限の除去
 
const変数では、その値を変更することはできません.これはこの限定子の最も直接的な表現です.しかし、私たちはその制限に背いてその内容を修正したいと思っています.どうすればいいですか.
下のコードは明らかに目的に達していない:const int constant = 10;
int modifier = constant;
modifierの変更はconstantに影響しないため、const_cast変換子は、このような変換によって得られる2つの変数/オブジェクトに相関がないため、オブジェクトデータにも使用すべきではない.
ポインタや参照で変数を同じアドレスに指し示すだけが解決策ですが、残念ながら下のコードはC++でもコンパイルできません:const int constant = 21;
int* modifier = &constant
// Error: invalid conversion from 'const int*' to 'int*'
(上のコードはCでコンパイル可能で、最大1つのwarningが得られ、Cではconstantの中のデータに対してでたらめを始めることができます)
constantをconst以外の引用に渡すのも無理です.const int constant = 21;
int& modifier = constant;
// Error: invalid initialization of reference of type 'int&' from expression of type 'const int'

そしてconst_castはconstを消滅させ、プログラム世界の混乱を引き起こす.
下のコードは順調にコンパイルできました:const int constant = 21;
const int* const_p = &constant;
int* modifier = const_cast<int*>(const_p);
*modifier = 7;
従来の変換方式によるconst_の実現cast演算子
 
準変換演算子は従来の変換方式で実現できると述べた.const_Cast実装の理由は、C++がポインタの変換を任意に行い、タイプをチェックせず、任意のポインタ間で相互変換が可能であるためconst_castは、const int constant = 21;
const int* const_p = &constant;
int* modifier = (int*)(const_p);
の代わりに表示変換(int*)を直接使用できます.
あるいは、中間変数をスキップしてconst int constant = 21;
int* modifier = (int*)(&constant);
で文を合成することもできます.
代替const int constant = 21;
int* modifier = const_cast<int*>(&constant);
なぜconst限定を取り除くのか
 
前のコードから、constantを変更することはできませんが、modifierを再割り当てすることができます.
しかし、プログラムの世界は本当に混乱しているのだろうか.私たちは本当にmodifierでconstatnの値を修正しましたか?const変数のデータを修正するのは本当にC++がconstに行く目的ですか?
結果を印刷するとcout << "constant: "<< constant <<endl;
cout << "const_p: "<< *const_p <<endl;
cout << "modifier: "<< *modifier <<endl;
/**
constant: 21
const_p: 7
modifier: 7
**/

constantは元の値を保持します.
しかし、それらは確かに同じ住所を指しています.cout << "constant: "<< &constant <<endl;
cout << "const_p: "<< const_p <<endl;
cout << "modifier: "<< modifier <<endl;

/**
constant: 0x7fff5fbff72c
const_p: 0x7fff5fbff72c
modifier: 0x7fff5fbff72c
**/

これは本当に1件の奇怪な事で、しかしこれは良い事です:C++の中でconstで、constで、外部は千変万変して、私は変わらないことを説明します.さもないと本当にめちゃくちゃになるし、constも存在する意味がない.