关于这段特定的代码,我有几个问题。我应该首先提到 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。我已更改运算符和方法以反射(reflect)您的建议:
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) { 返回 x1 += x2; }
。您可以使用 operator&
和 operator&=
做同样的事情。
你也无法防止有人试图连接一个长字符串并溢出,无论分配给 pChar
多少内存,你都需要为此添加检查。
关于c++ - 在类函数中重载按位 And(&) 运算符和 "*this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22432189/