1

私は現在C++を学ぼうとしています。学習するとき、私は言語と記憶がどのように機能するかを理解するために奇妙なことを試みるのが好きです。今、私は構築時に設定された文字の配列を持つクラスを作成しようとしています。私のクラスの唯一のメソッドは、引数のポインターを介して配列を取得できるようにすることです。クラスは正常に作成され、正常に機能しますが、配列の値を変更しないようにすることで、クラスの安全性を高めたいと考えています。

これは私がこれまでに持っているものです:

#import <stdio.h>

class MyClass {
    public:
        char const * myArray;
        MyClass(char inputChar[]){
            myArray = inputChar;
        }

        void get(const char * retVal[]){
            *retVal = myArray;
        }
};

int main(){
    char myString[] = {'H','E','L','L','O'};
    MyClass somethingNew = MyClass(myString);
    const char * other = new char[4];
    somethingNew.get(&other);
    std::cout << other[0];
    return 0;
}

間接参照演算子を使用して配列の値をまったく変更できないことに気づきました。

myArray[0] = 'h';

これは良いことですが、myArray[0]が指すポインタを変更できないという意味ではありません。

*(&myArray) = new char('h');

これを防ぐ方法はありますか?

- - 解像度 - -

#import <stdio.h>

typedef const char * const constptr;

class MyClass {
    public:
        constptr * myArray;
        MyClass(constptr inputChar) {
            myArray = &inputChar;
        }

        void get(constptr * retVal){
            retVal = myArray;
        }
};

int main(){
    char myString[] = "Hello";
    MyClass somethingNew(myString);
    constptr other = new char[4];
    somethingNew.get(&other);
    std::cout << other[0];
    return 0;
}

これは、次のいずれも実行できないことを意味します。

*myArray[0] = 'h';
*myArray = new char[4];
*&*myArray = new char('h');

しかし、私はこれを行うことができます:

myArray = &inputChar;
4

2 に答える 2

5

はい、次のようにconstオブジェクトへのconstポインタを作成する必要があります。

char const * const myArray;

constご存知のように、最初のものは、ポインタが指すものを変更することを防ぎます。2つ目constは、ポインタに他の何かを再割り当てすることを防ぎます。

ほぼ同じであるconst参照の使用を検討することもできます。

編集:

Benjamin Lindleyが指摘しているように、ポインターは現在一定であるため、次のように、コンストラクター本体ではなく、初期化リストでポインターに値を割り当てる必要があります。

   MyClass(char inputChar[])
   : myArray(inputChar) {
    }
于 2012-11-30T18:48:52.857 に答える
1

const次のようなポインタを作成する必要があります。

char const * const myArray;

これは、constcharへのconstポインタです。

于 2012-11-30T18:49:26.050 に答える