21xrx.com
2024-12-22 23:48:46 Sunday
登录
文章检索 我的文章 写文章
C++类的赋值运算符实现
2023-06-28 19:16:14 深夜i     --     --
C++ 赋值运算符 实现

C++语言中,赋值运算符(=)是一个最基础的运算符,但是对于类对象的赋值运算符需要进行特殊的实现。在默认情况下,C++会自动为类对象生成一个默认的赋值运算符,它会将一个对象的内容直接复制到另一个对象中,这可能会导致一些严重的问题,如空间泄漏、对象的自我赋值等。

因此,C++类的设计者通常要为其类提供一个定制的、适合其内部细节的赋值运算符。这个定制的赋值运算符可以让类对象在被赋值时,能够正确地处理自身内存的分配、复制和释放问题。

下面是一个简单的C++类,它包含一个整型指针和一个整型变量:

class MyInt

{

public:

  MyInt(int n)

  {

    p = new int(n);

    val = n;

  }

  ~MyInt()

    delete p;

  // 赋值运算符实现

  MyInt& operator=(const MyInt& other)

  {

    // 避免自我赋值

    if (this != &other)

    {

      // 先释放原指针所指向的内存

      delete p;

      // 深度拷贝指针和变量值

      p = new int(*(other.p));

      val = other.val;

    }

    return *this;

  }

private:

  int* p;

  int val;

};

在这个例子中,我们要注意几个问题:

1. 要避免类的自我赋值情况(即将一个对象赋值给自身),这会导致指针在析构时出现 double free 错误。

2. 赋值运算符的返回类型为 MyInt&,这样可以使连续赋值成为可能,如下所示:

MyInt a(1), b(2), c(3);

a = b = c;

3. 赋值运算符要进行深拷贝,复制指针所指向的内存。如果不深拷贝,就会出现多个对象共用一块内存的问题。

有了这些注意事项后,我们就可以在类型中自定义赋值运算符,以保证类对象在赋值时拥有正确的表现。

  
  

评论区

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