21xrx.com
2024-11-05 22:01:33 Tuesday
登录
文章检索 我的文章 写文章
C++中的等于号重载
2023-07-12 09:47:11 深夜i     --     --
C++ Overloading Equals Operator

在C++中,等于号(=)是一个重要的运算符,它用于给变量赋值。但是,在某些情况下,我们可能需要在自定义的类中重载等于号运算符,以便更方便地给对象赋值。

等于号运算符可以通过成员函数重载或非成员函数重载来实现。在成员函数重载中,等于号被定义为类的一个成员函数,它的左操作数为被赋值的对象,右操作数为赋值的值;在非成员函数重载中,等于号被定义为一个全局函数,其参数为两个对象,其返回类型为被赋值的对象类型的引用。

无论采用哪种方式,等于号的重载可以使我们有更多的控制权,使得赋值操作更灵活。我们可以在重载的等于号中实现任何我们想要的操作,例如,删除已有的数据、提供给用户更多的信息或限制赋值的范围。

重载等于号的示例代码如下所示:


class MyString {

public:

  MyString();

  MyString(char* str);

  MyString(const MyString& str);

  ~MyString();

  MyString& operator=(const MyString& str);

  friend MyString& operator=(MyString& str1, const MyString& str2);

private:

  char* m_str;

};

MyString::MyString() : m_str(nullptr) {}

MyString::MyString(char* str) : m_str(nullptr) {

  if (str != nullptr) {

    m_str = new char[strlen(str) + 1];

    strcpy(m_str, str);

  }

}

MyString::MyString(const MyString& str) : m_str(nullptr) {

  if (str.m_str != nullptr) {

    m_str = new char[strlen(str.m_str) + 1];

    strcpy(m_str, str.m_str);

  }

}

MyString::~MyString() {

  if (m_str != nullptr) {

    delete[] m_str;

    m_str = nullptr;

  }

}

MyString& MyString::operator=(const MyString& str) {

  if (this != &str) {

    MyString temp(str);

    char* pTemp = temp.m_str;

    temp.m_str = m_str;

    m_str = pTemp;

  }

  return *this;

}

MyString& operator=(MyString& str1, const MyString& str2) {

  if (&str1 == &str2) {

    return str1;

  }

  if (str1.m_str != nullptr) {

    delete[] str1.m_str;

    str1.m_str = nullptr;

  }

  str1.m_str = new char[strlen(str2.m_str) + 1];

  strcpy(str1.m_str, str2.m_str);

  return str1;

}

以上示例代码中,我们重载了MyString类中的等于号运算符。其中,成员函数重载在第15行开始,非成员函数重载在第23行开始。我们在重载的等于号中实现了指针复制、释放内存及异常判断等操作。

总结而言,重载等于号可以为类的赋值操作增加更多的灵活性和控制权,可以使代码更易读、易懂和易于维护。因此,在自定义类中,重载等于号是一个常见的要求,需要开发人员仔细考虑。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复