如何用const实参初始化非const成员变量?

How to initialize non-const member variables with const actual parameter?

当我用参数的给定数据类型初始化构造函数时,我发现“const char* values cannot be assigned to char* entities”的解释出错了。

class TString
{
private:
    char* m_pData;
    int  m_nLength;
public:
    TString();
    TString(const  char* pStr);
    ······
}
TString::TString(const  char* pStr) {
    this->m_pData = pStr;
}

我应该怎么做才能解决这个问题?如果可能的话,给我一个正确的例子。 在此先感谢并为我的无知道歉。

Const char * 通常是预定义的静态编译字符串,不能更改,因为它们被锁定在源代码中,或者它们来自一些不可变的源。这部分是为什么将它们标记为 const 以防止人们试图更改它们的原因。

这个问题最简单的解决办法就是把const char * 复制到堆上,然后它就不再是常量了。

例如:

#include <string.h> // for strdup
...
TString::TString(const  char* pStr) {
    m_pData = strdup(pStr); // this will malloc and copy the string accepting const char * as input.
}

您需要考虑一件事,m_pData 现在在堆上,因此在析构函数中,您需要释放此数据,否则会发生内存泄漏。

TString::~TString(){
  free(m_pData);
}

您还需要在 TString() 构造函数中也设置 m_pData=NULL。

这将适用于字符串,但如果它是二进制数据,即没有终止符,则使用 malloc 分配数据并使用 memcpy,例如:

m_pData=(char *)malloc(m_nlength*sizeof(char));
memcpy(m_pData,pStr,m_nlength);

或类似的。