为什么参数中的默认char *必须是const?

时间:2015-04-09 01:54:47

标签: c++ c++11 visual-c++

class MyString {
private:
    char *m_pchString;
    int m_nLength;
public:
    MyString(char* pchString="0") {      //problem on this parameter
        m_nLength = strlen(pchString)+1;
        m_pchString = new char[m_nLength];
        strncpy(m_pchString, pchString, m_nLength);
        m_pchString[m_nLength-1] = 0;
    }
    ~MyString() {
        delete[] m_pchString;
        m_pchString = 0;
    }
    char* GetString() {return m_pchString;}
    int GetLength() {return m_nLength;}
};

如果我遵守此规则,编译器会向我发出警告:

  

警告:已弃用从字符串常量转换为'char *'

除非我将参数从char *pchString = "0"修改为const char *pchString = "0"

为什么参数中的默认char *必须是const?

3 个答案:

答案 0 :(得分:6)

因为像"some string"这样的字符串文字是不可变的,并且尝试修改它(如果通过非const引用传递,您可以尝试修改它们)会导致未定义的行为。这就是标准C ++弃用此转换的原因。

试试这个很有趣(但请不要在生产代码中),实时here

#include <iostream>

int main() 
{
    char* str = "test";
    str[0] = 'w';
    std::cout << str; // oops
}

相关:Why are string literals const?

答案 1 :(得分:0)

当您使用字符串文字时,例如"0",它将被放入程序的只读部分。对此类数据进行任何更改都会导致未定义的行为。通过尝试将类型char*的变量初始化为sting文字,您可以修改只读数据的可能性。这就是编译器抱怨的内容。

它类似于:

const int num;
int* ptr = &num;  // Wrong

答案 2 :(得分:-3)

与使用字符串类相比,char *被认为是过时的做法。