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?
答案 0 :(得分:6)
因为像"some string"
这样的字符串文字是不可变的,并且尝试修改它(如果通过非const引用传递,您可以尝试修改它们)会导致未定义的行为。这就是标准C ++弃用此转换的原因。
试试这个很有趣(但请不要在生产代码中),实时here:
#include <iostream>
int main()
{
char* str = "test";
str[0] = 'w';
std::cout << str; // oops
}
答案 1 :(得分:0)
当您使用字符串文字时,例如"0"
,它将被放入程序的只读部分。对此类数据进行任何更改都会导致未定义的行为。通过尝试将类型char*
的变量初始化为sting文字,您可以修改只读数据的可能性。这就是编译器抱怨的内容。
它类似于:
const int num;
int* ptr = # // Wrong
答案 2 :(得分:-3)
与使用字符串类相比,char *被认为是过时的做法。