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

闪亮的10

我对这段特定的代码有几个疑问。首先,我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。我更改了operator&方法以反映您的建议:

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;
}
MM
  1. *this指左侧操作数。this指向左侧操作数。

  2. 不适用

  3. 停止返回对本地对象的引用。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,您将需要为此添加检查。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

类模板中的运算符重载和友谊

来自分类Dev

全局和元素函数中的运算符重载

来自分类Dev

在C语言(也是C ++)中,“&”运算符如何同时用作地址运算符和按位运算符?由于C不支持运算符重载

来自分类Dev

Java中的按位和运算符

来自分类Dev

.NET Framework方法中的按位和运算符

来自分类Dev

C中的按位运算符和移位问题

来自分类Dev

运算符=模板类中的重载

来自分类Dev

按位运算符和for循环

来自分类Dev

运算符<<在构造函数中的重载

来自分类Dev

了解非重载按位运算符的转换顺序,算术转换和整数提升

来自分类Dev

hashCode中按位运算符>>>

来自分类Dev

Gremlin中的按位运算符

来自分类Dev

PHP中的按位运算符

来自分类Dev

在Dart中重载++和+ =运算符

来自分类Dev

C ++中重载的==和!=运算符

来自分类Dev

运算符-类重载

来自分类Dev

类的=运算符重载

来自分类Dev

运算符-类的重载

来自分类Dev

运算符重载函数

来自分类Dev

按位运算符和位操作

来自分类Dev

重载类函数运算符,两次是setter和getter

来自分类Dev

相同的运算符和类的两个重载函数

来自分类Dev

重载了数据成员,构造函数和运算符的抽象基类

来自分类Dev

重载类函数运算符,两次是setter和getter

来自分类Dev

按位'&'运算符

来自分类Dev

按位或运算符

来自分类Dev

类析构函数导致重载+运算符的问题

来自分类Dev

重载++和+运算符

来自分类Dev

C ++:运算符重载:类内和类外。与预递增运算符的歧义