gpt4 book ai didi

c++ - 在类函数中重载按位 And(&) 运算符和 "*this"

转载 作者:行者123 更新时间:2023-11-28 07:01:17 27 4
gpt4 key购买 nike

关于这段特定的代码,我有几个问题。我应该首先提到 pChar 将始终是一个动态字符数组,在需要时通过我没有列出的方法调整大小。我已经搜索了我的引用手册和这个网站,但似乎无法清楚地了解 & 运算符的完整工作原理。我也不想使用替代方案,因为这是一项任务,不允许这样做。我已经在这里工作了好几天,所以我们将不胜感激。

  1. *this 在使用 & 运算符时究竟指向什么? 我一直假设它指向左操作数。

  2. 如果不是这种情况,我如何在 & 运算符方法中访问左操作数?

  3. 如果这一切都完全不正确,我如何使用重载的 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;
}

最佳答案

  1. *this 指的是左边的操作数。 this 指向左边的操作数。

  2. 不适用

  3. 停止返回对本地对象的引用。 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com