21xrx.com
2024-12-22 22:38:02 Sunday
登录
文章检索 我的文章 写文章
C++赋值运算符重载
2023-07-07 03:19:07 深夜i     --     --
C++ 赋值运算符 重载

C++作为一门面向对象的编程语言,具备运算符重载功能。其中,赋值运算符也可以被重载,以满足不同的需求。

赋值运算符是用于将一个变量的内容赋值给另一个变量的运算符,通常表示为“=”。在C++中,赋值运算符可以重载成类的一个成员函数。它的语法格式如下:

class MyClass {

public:

  int a;

  MyClass& operator= (const MyClass & other); // 赋值运算符重载

};

MyClass& MyClass::operator= (const MyClass & other) {

  a = other.a;

  return *this;

}

这个繁琐的代码展示了如何重载赋值运算符。这段代码将一个MyClass对象的值赋值给另一个MyClass对象。它相当于实现了以下重载功能:

MyClass obj1;

MyClass obj2;

obj2 = obj1; // 赋值表达式

重载的赋值运算符函数返回的是一个MyClass对象的引用,其作用是将被修改的对象实例自身作为一个引用返回,以便于连续赋值表达式的使用。

赋值运算符重载可以使用对象的指针来修改对象中的成员变量,以实现深拷贝。例如:

#include

#include

using namespace std;

class String {

public:

  String(char *str) { // 构造函数

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

   strcpy(m_data, str);

  }

  ~String() { // 析构函数

   delete[] m_data;

  }

  String(const String& other) { // 拷贝构造函数

   m_data = new char[strlen(other.m_data)+1];

   strcpy(m_data, other.m_data);

  }

  String& operator=(const String& other) { // 重载赋值运算符

   if (this != &other) {

     delete[] m_data;

     m_data = new char[strlen(other.m_data)+1];

     strcpy(m_data, other.m_data);

   }

   return *this;

  }

  void print() {

   cout << m_data << endl;

  }

private:

  char *m_data;

};

int main() {

  String str1("Hello ");

  String str2("World");

  str2 = str1;

  str1.print();

  str2.print();

  return 0;

}

在上面的代码中,赋值运算符被重载为一个成员函数,用于实现深拷贝。然后,两个对象都会打印出“Hello”这个字符串。这里我们可以看到,赋值运算符是如何用来重载函数的。

赋值运算符重载还可以以友元函数的形式出现。C++中的友元函数允许其他类或全局函数访问私有数据成员及保护数据成员。可以像下面这样定义一个友元函数:

class MyClass {

public:

  int a;

  friend MyClass& operator= (MyClass& one, const MyClass& other) {

   one.a = other.a;

   return one;

  }

};

在上面的代码中,我们使用了“friend”关键字来声明一个友元函数。这个函数中,第一个参数是被赋值的对象,第二个参数是待赋值的对象。这里,由于友元函数可以访问类的私有成员变量,因此可以将一个对象的值赋值给另一个对象。

总之,赋值运算符重载是C++面向对象编程中重要的一环。通过重载赋值运算符,可以很方便地实现类的深拷贝,并且可以满足不同场景下的需求。

  
  

评论区

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