我对这段特定的代码有几个疑问。首先,我pChar
将永远是一个动态字符数组,当我未列出的方法需要时,该数组将被调整大小。我已经仔细阅读了参考手册和本网站,但似乎无法清楚了解&运算符的工作方式。我也不想使用替代方法,因为这是一项作业,并且不允许这样做。我已经待了几天,所以任何帮助将不胜感激。
*this
使用&运算符时到底指的是什么?我一直假设它指向左操作数。
如果不是这种情况,如何在&运算符方法中访问左侧的操作数?
如果这完全不正确,那么如何通过使用重载来达到期望的结果operator&
?
&运算符的方法:
PDS_String & PDS_String::operator & (const PDS_String & Str)const
{
PDS_String temp(*this);
strcat(temp.pChar, Str.pChar);
return temp;
}
主要:
void main ()
{
PDS_String String1;
PDS_String String2;
PDS_String String3;
String1 = "monkey";
String2 = "chicken";
String3 = String1 & String2;
// Desired outcome for String3 is "monkeychicken"
}
类:
class PDS_String
{
public:
PDS_String(); //Default
PDS_String(const PDS_String &); //Copy
~PDS_String(); //Destructor
char * operator & (const PDS_String &) const; // Concatenation
PDS_String & operator = (const char *); // Assignment
// I haven't listed all methods and operator overloads
private:
char * pChar;
long NumChars;
long NumSlots;
};
赋值运算符方法:
PDS_String & PDS_String::operator = (const char * Str)
{
if (pChar == Str)
return *this;
else
{
if (NumSlots < strlen(Str))
{
delete[] pChar;
pChar = new char[(strlen(Str) + 1)];
NumSlots = (strlen(Str));
}
else;
}
strcpy(pChar, Str);
NumChars = strlen(Str);
return *this;
}
非常感谢Matt McNabb。我更改了operator&方法以反映您的建议:
char * PDS_String::operator & (const PDS_String & Str)const
{
char * temp;
temp = new char[strlen(pChar)+strlen(Str.pChar)+1];
temp = pChar;
strcat(pChar, Str.pChar);
return temp;
}
*this
指左侧操作数。this
指向左侧操作数。
不适用
停止返回对本地对象的引用。temp
函数结束时,它不再存在,因此调用方有一个悬空的引用(导致未定义的行为)。
二进制运算符的正常语义是按值返回对象。因此,您可以更改为PDS_String PDS_String::operator & (const PDS_String & Str)const
,一切都会好起来的。
通常要做的是该operator+=
函数是一个会更改的成员函数,*this
然后您有了一个自由函数X operator+(X x1, X x2) { return x1 += x2; }
。您可以使用operator&
和进行相同的操作operator&=
。
您也无法防止有人试图连接一个长字符串并溢出,但是分配了很多内存pChar
,您将需要为此添加检查。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句