我对这段特殊代码有几个疑问。我应该首先提到pChar
将始终是一个动态字符数组,在需要时我没有列出的方法调整大小。我已经仔细检查了我的参考手册和这个网站,但似乎无法清楚地了解& amp;操作员完全工作。我也不想使用替代方案,因为这是一项任务,我不被允许。我已经好几天了,所以任何帮助都会受到赞赏。
*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。我改变了操作员和反映你的建议的方法:
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;
}
答案 0 :(得分:1)
*this
指左手操作数。 this
指向左侧操作数。
N / A
停止返回对本地对象的引用。函数结束时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
的人,你也没有任何保护,你需要添加对它的检查。