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

标签 c++ operator-overloading this

关于这段特定的代码,我有几个问题。我应该首先提到 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/

相关文章:

javascript - 如何访问http请求响应中的 'this'?

c++ - 二叉搜索树

c++ - 计算工具栏图标宽度

c++ - 从 C++ 中的泛型函数返回可选

c++ - 使用重载运算符不明确

c++ - 赋值运算符(字符串)右侧的类型是什么?

c++ - 逗号分隔变量定义中的先序关系

c++ - 在模板外重载模板类的输出流运算符

javascript - 在 JavaScript 中更改函数 "this"值

javascript - 在 Javascript 中将对象原型(prototype)函数绑定(bind)到对象