重载类函数中的按位和 (&) 运算符和"*this"

Overloading Bitwise And(&) Operator and "*this" in Class Functions

本文关键字:运算符 类函数 this 重载      更新时间:2023-10-16

我对这段特定的代码有几个问题。我首先应该提到的是,pChar将始终是一个动态字符数组,当我没有列出的方法需要时,它会调整大小。我已经搜索了我的参考手册和这个网站,但似乎无法清楚地了解&操作员全面工作。我也不想使用替代方案,因为这是一项任务,不允许这样做。我已经做了好几天了,如果有任何帮助,我将不胜感激。

  1. CCD_ 2在使用&操作人员我一直假设它指向左操作数。

  2. 如果不是这样,我如何访问&运算符方法?

  3. 如果这一切都是完全不正确的,我如何使用过载的operator&来达到预期的结果?

用于&操作员:

PDS_String & PDS_String::operator & (const PDS_String & Str)const
{
     PDS_String temp(*this);
     strcat(temp.pChar, Str.pChar);
     return temp;
}

Main:

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;
    }

非常感谢马特·麦克纳布。我已经换了话务员&反映您建议的方法:

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. 停止返回对本地对象的引用。当函数结束时,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分配了多少内存,您都需要为此添加检查。