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

Jue*_*haw 1 c++ visual-c++ c++11

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

如果我遵守了这个,编译器会发给我一个警告:

警告:不推荐将字符串常量转换为'char*'

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

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

vso*_*tco 6

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

试试这个很有趣(但请不要在生产代码中),住在这里:

#include <iostream>

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

相关:为什么字符串文字是常量?