如何创建指向无法修改指向地址的数组的指针?

Kyl*_*yle 1 c++

我目前正在尝试学习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;
}
Run Code Online (Sandbox Code Playgroud)

我注意到我无法通过使用dereference运算符来更改数组的值:

myArray[0] = 'h';
Run Code Online (Sandbox Code Playgroud)

这很好,但这并不意味着我无法改变myArray [0]指向的指针:

*(&myArray) = new char('h');
Run Code Online (Sandbox Code Playgroud)

有什么方法可以防止这种情况发生吗?

- - 解析度 - -

#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;
}
Run Code Online (Sandbox Code Playgroud)

这意味着我无法执行以下任何操作:

*myArray[0] = 'h';
*myArray = new char[4];
*&*myArray = new char('h');
Run Code Online (Sandbox Code Playgroud)

但我可以这样做:

myArray = &inputChar;
Run Code Online (Sandbox Code Playgroud)

imr*_*eal 5

是的,您必须创建一个指向const对象的const指针,如下所示:

char const * const myArray;
Run Code Online (Sandbox Code Playgroud)

const如您所知,第一个让您无法修改指针指向的内容; 第二个const阻止你重新为指针重新分配其他东西.

您也可以考虑使用const引用,这几乎是一样的.

编辑:

正如Benjamin Lindley指出的那样,既然指针现在是常量,你需要在初始化列表中为它赋值,而不是构造函数体,如下所示:

   MyClass(char inputChar[])
   : myArray(inputChar) {
    }
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,他需要在构造函数的初始化列表中初始化指针.他不能像现在这样在身体上做到这一点. (3认同)