在类函数中重载Bitwise和(&)运算符和“* this”

时间:2014-03-16 02:12:31

标签: c++ operator-overloading this

我对这段特殊代码有几个疑问。我应该首先提到pChar将始终是一个动态字符数组,在需要时我没有列出的方法调整大小。我已经仔细检查了我的参考手册和这个网站,但似乎无法清楚地了解& amp;操作员完全工作。我也不想使用替代方案,因为这是一项任务,我不被允许。我已经好几天了,所以任何帮助都会受到赞赏。

  1. *this在使用&时指向的确切内容运营商?   我一直认为它指向左操作数。

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

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

  4. &操作者:

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

1 个答案:

答案 0 :(得分:1)

  1. *this指左手操作数。 this指向左侧操作数。

  2. N / A

  3. 停止返回对本地对象的引用。函数结束时temp不再存在,因此调用者有一个悬空引用(导致未定义的行为)。

  4. 二元运算符的正常语义是按值返回一个对象。所以你可以改为PDS_String PDS_String::operator & (const PDS_String & Str)const,一切都会好的。

    通常做的是operator+=函数是一个更改*this的成员函数,然后你有一个自由函数X operator+(X x1, X x2) { return x1 += x2; }。您可以使用operator&operator&=执行相同的操作。

    对于试图连接长字符串并溢出但是有多少内存分配给pChar的人,你也没有任何保护,你需要添加对它的检查。