我目前正在尝试学习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)
是的,您必须创建一个指向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)
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |