0

const データ メンバーに対する const_cast の動作をチェックするための小さな問題を書きました。

using namespace std;


     class myString{
         public:
                 myString(char * str)
                 {
                         p=str;
                 }
                 const char * getString(){
                         return p;
                 }
         private:
                 const char *p;
 } ;


int main()
{
        char *p=(char*)malloc(8);
        cin>>p;
        myString *m= new myString(p);
        char *s =const_cast<char*>(m->getString());
        s[6]='y';
        cout<<s<<endl;
        return 0;
}

このプログラムを実行した後、"yogendra" (8 文字の文字列) として出力します。そして、「yogendya」として出力されました。今は疑問です。const_cast<> を介して、データ メンバー自体の動作をオーバーライドできます。ここでは文字列が const char* であるため、キャスト後も変更できます。

4

3 に答える 3

5

あなたは何のためにあるのかを正確に説明しました - それはあなたが何かからネスconst_castを取り除き、それを変更することを可能にします. constその力を乱用しないかどうかはあなた次第です。:-)

(あなたの場合、これは当てはまりませんが、次const_castのように使用してクラッシュを引き起こす可能性があることに注意してください。

const char *c = "Hello";
char *s = const_cast<char*>(c);
s[0] = 'h';

コンパイラが文字列リテラルを読み取り専用メモリに配置できるため、クラッシュする可能性があります。)

于 2013-03-26T11:46:03.083 に答える
1

はい、const_cast<>この方法を使用できます。クラスで指されているオブジェクトconst char*は実際には type の const ではないため、未定義の動作にはなりませんchar*。ただし、注意してください。C++ 標準。§7.1. 5.1/4 は言う

ミュータブルと宣言されたクラス メンバー (7.1.1) を変更できることを除いて、その有効期間中 (3.8) に const オブジェクトを変更しようとすると、未定義の動作が発生します。

const_cast の安全な使用法は、つまり、const 参照から非 const オブジェクトに const をキャストすることです。非 const オブジェクトがあり、const 参照がある場合、これから const を安全にキャストできます。

于 2013-03-26T11:50:45.987 に答える
0

あなたが言うなら

char *s =const_cast<char*>(m->getString());

次に、基本的にポインターから「const」を削除し、scharへのポインターであると宣言します。これは書き込み可能な文字列です。だから次の行

s[6]='y';

完全に問題ありません。const を保持するにはs、const ポインターとして宣言する必要があります

const char *s = m->getString();

その場合、定数文字列を上書きすることはできません (エラー: 読み取り専用の場所の割り当て)。私はそれがあなたが望むものだと思いますか?はconst_cast単に追加/削除constし、場合によっては削除します。

于 2013-03-26T11:49:07.257 に答える