Marray(char MyString [])
Marray(const char MyString [])
这两条线有什么区别?我正在阅读const char*
和char*
之间的区别。与char[]
和const char []
相同吗?
我很困惑,因为在这两种情况下,当我重载operator []时,可以更改字符串文字。 const char*
是指向不可变字符/字符串的可变指针。 - 所以我期待与const char []
相同,但字符串是可变的......
更多代码:
构造
Marray::Marray(const char MyString []){
length = 0;
while(MyString[length]!=NULL){
length ++;
}
text= new char [length+1];
int i;
for (i=0; i<length; i++)
*(text+i)=MyString[i];
text[length]=NULL;
}
char & Marray::operator[] (int i) const { return text[i];}
int main () {
Marray n("String");
n[3]='d';
n.getMarray();
system("pause");
return 0;
}
这就是我跑完后得到的:
Strdng
因此,即使存在const char[]
,字符串也会更改。
答案 0 :(得分:3)
我正在阅读
const char*
和char*
之间的区别。它与char[]
和const char []
一样吗?
对于大多数实际目的,答案是肯定的。虽然通常char const*
和char const[]
是两种不同的类型,但是根据上下文可以成为另一种类型。在这个特定的上下文(函数参数的声明)中,它们的意思相同。
所以我期待与
const char []
相同,但字符串是可变的
不,由于const
限定符(demo),传入函数的C字符串保持不变。尝试修改const char MyString[]
内的Array
会产生编译时错误:
错误:分配只读位置'* s'
答案 1 :(得分:2)
首先,根据8.5.3 [dcl.fct] paragaph 5,函数参数类型被调整为指针类型:
...在确定每个参数的类型之后,任何类型为“T的数组”或“返回函数T”的参数都被调整为“指向T的指针”或“指向函数返回T的指针”。 / p>
也就是说,问题变成“传递T*
和T const*
之间有什么区别?”显而易见的答案是,对象的const
指向。
答案 2 :(得分:1)
const
的构造函数仅承诺不更改它接收的参数。也就是说,它承诺以下代码将写入String
:
char mystring[] = "String";
Marray n(mystring);
std::cout << mystring;
但是,您的类希望提供更改其内容的服务,即使传递了不可变字符串 - 因此必须复制字符串进入另一个存储,这是可变的。
如果您想获得描述的效果,可以创建一个不可变对象:
char mystring[] = "String";
const Marray n(mystring);
n[3]='d'; // compilation error
更新:如评论中的hvd所述,为了使编译器发出错误,您需要修复operator[]
的声明:
char& Marray::operator[] (int i) { return text[i];} // non-const version
const char& Marray::operator[] (int i) const { return text[i];} // const version
或(更好)
char& Marray::operator[] (int i) { return text[i];} // non-const version
char Marray::operator[] (int i) const { return text[i];} // const version
(请参阅例如this answer以找出您需要同一运营商的2个版本的原因)。