ぼく用あれこれまとめ
const_cast演算子
最終更新:
bokuyo
-
view
const_cast演算子
- ぼくの勉強が足りないだけかもしれないページ。
const_castって?
void anemone(int* x){ return; } int main() { int renton; const int* eureka(&renton); anemone(eureka); //コンパイルエラー anemone(const_cast<int*>(eureka)); //これでおっけー。 return 0; }
- const型修飾子や、volatile型修飾子が付いてる場合に外すことができるcast。
- int型のconstポインタから、float型のポインタに、とかはできないよ。
- reinterpret_cast演算子を一緒に使えばできるよ。するかしないかは、キミ次第☆
ちなみにint* const型はそもそもconst_castする意味ないよ。
const int*
- 何度でも指すことができる。
- 指してる場所の値を間接的に変更することはできない。
- つまり"読み取り専用ポインタ"。
int* const
- 初期化時に1度だけ指すことができる。
- 指してる場所の値を間接的に変更することができる。
- つまりint*型の定数とみなせる。
これをふまえたうえで、const_castについて考えてみる。
やっぱ考えるの面倒だから結論いうと、使う意味ないよね。
やっぱ考えるの面倒だから結論いうと、使う意味ないよね。
void anemone(int* x){ return; } int main() { int renton; int* const eureka = &renton; anemone(eureka); //これは普通にコンパイル通る。 return 0; }
- const_castを使う必要がない。
- なぜなら、この「int* const eurekaポインタ」自体が間接的に値を変更することができるから。
- このページの最初に載せたソースの「const int* eurekaポインタ」は間接的に値を変更する能力を持ってなかった。
- それなのに、anemone()関数内では、「int* xポインタ」は間接的に値を変更する能力を持ってる。だからcastする必要があった。
- 「const int* eureka」だと「*eureka = 156」はしてはいけないこと、なのに、anemone()内では、「*x = 156」が可能になる。
- 「int* const eureka」だと「*eureka = 156」はしておっけーだから、別にconst_castする必要もない。
- だから、「float*********************************************************** const型」のようなの使ってる間はconst_castに出くわさない。
- そもそも、const型修飾子を付けてるのをどうしても外さないといけないときなんてそうそうないから、使うときはよく考えてね。
- あと、volatile型修飾子を使う場面に出くわしたことがないから、volatileをconst_castする日まで、volatileについては置いとくね。
- だって思いつかないんだもの。
一時的なmutable型修飾子な動き。
class Anemone { int mutable renton; void unco()const { ++renton; } };
- mutableをつけるとconstメンバ関数内で値を変更できたよね。
- それをconst_cast演算子でもやっちゃおう的な。
class Anemone { public: void eureka() { return; } }; int main() { Anemone const anemone; //constなオブジェクトはconstメンバ関数以外呼びだせないから anemone.eureka(); //←これはコンパイルエラー return 0; }
そもそも、constメンバ関数って?
- constメンバ関数内では、オブジェクトの内容を変更しないことを保証している。
- またconstオブジェクトが呼び出せるメソッドはconstメンバ関数のみ。
- constメンバ関数内では、class型のthisポインタではなく、const class型のthisポインタが渡される。
- Anemone thisではなく、const Anemone thisがconstメンバ関数内で使われる。
だから、メンバ関数内のconst thisポインタをconst_castしてあげればいいの。
class Anemone { int renton; public: int getRenton()const { const_cast<Anemone*>(this)->renton = 156; return renton; } };
- これでメンバ変数にアクセスできるようになったよ。mutableなしに。
- ただこれはあまりにも、危険だよね。constメンバ関数だなんて言っておいてメンバ変数変更可能とかわけわからん。
- 動作も不安定らしいので使わないように。(詳しいことは知りません。C++の仕様で未確定なんでしょうかね…?)
.