const char []和char []之间的区别

时间:2014-12-23 14:39:36

标签: c++ arrays string const

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[],字符串也会更改。

3 个答案:

答案 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个版本的原因)。