7

私はC++を学んでいて、このconst_cast演算子に出くわしました。次の例を考えてみましょう。

class Test
{  
  private:
    char name[100];
  public:
    Test(const char* n) { std::strncpy(name, n, 99); name[99]=0; }
    const char* getName() const { return name; }
}

これで、ユーザーは次のことができます

Test t("hi");
const_cast<char*>(t.getName())[0] = 'z'; //modifies private data...

これでいいですか?return const char *の目的はプライベートデータの変更を防ぐことだったので、プライベートデータを変更することを意味します。これを防ぐにはどうすればよいですか?(std :: stringを使用せずに)

4

2 に答える 2

8

いいえ、これは「大丈夫」ではありません。それは可能ですが。しかし、C++ はプログラマーに良い振る舞いを強制しません。主に、意図した用途を示す方法で物事を宣言することができます。プログラマーがその保護をだますことにした場合、彼は自分が何をしているのかを知る必要があります。

Bjarne Stroustrup : はい。それが新しいキャスト構文です。キャストは不可欠なサービスを提供します。新しい構文は、古い構文ではできなかったエラーをコンパイラがチェックできるようにするため、C スタイルのキャストよりも改善されています。しかし、新しい構文は意図的に醜いものにされました。キャストは依然として醜く、しばしば安全でない操作だからです。

于 2011-06-20T23:13:05.940 に答える
5

いいえ、それは問題ありませんが、それが の要点ですconst_cast。一般に、プログラマーがオーバーライドconstすると、多くの悪いことが起こる可能性があり、それを行うことはお勧めできません。const_castただし、誰かがそれを行うのを防ぐことができるかどうかはわかりませんconst.

于 2011-06-20T23:11:39.863 に答える