【问题标题】:C++, can I overload assignment operator of a point of a class?C ++,我可以重载类点的赋值运算符吗?
【发布时间】:2019-04-16 01:08:24
【问题描述】:

可以重载A类的赋值运算符,但不确定是否允许重载A类指针类型的赋值运算符。 这是否合法的问题......?如果是,怎么做?

例如,只要下面有指针引用,我就想做 ref_count++。

class A{
   public:
         A(){}
         ~A(){}
         int ref_count{0};
}

main()
{
        A* a1 = new A();   //line 1
        A* a2 = a1;       //line 2
 }

执行第一行后,A.ref_count 为 1 执行第 2 行后,A.ref_count 为 2

【问题讨论】:

  • 你的main()中的两行中没有operator=()涉及
  • 你在做的是copy initialization,而不是赋值。
  • 不,你不能重载指针赋值。赋值运算符必须是成员函数,当你赋值给一个指针时它不会被调用。
  • 幸运的是,您不需要自己为指针实现引用计数,在 C++ 中它们拼写为 std::shared_ptr<A>
  • 如果您想添加更多自定义代码而不仅仅是引用计数,您可以编写自己的包装类并重载operator*operator-> 以供访问

标签: c++ pointers operator-overloading


【解决方案1】:

看起来您不需要引用计数指针。首先让我们检查一下为什么您的解决方案不起作用:

  1. 这里:A* a1 = new A(); 你正在做指针赋值,不是类赋值。您不能重载此操作。
  2. Class A 的定义中,您实现了引用计数。这不是一个好的解决方案,如果你想要一个也需要引用计数的新类(Class B)怎么办?你必须重新实现它。这不好或可重复使用。

那么,我们能做些什么呢?好吧,这取决于你为什么不想引用计数。看起来你不想自我管理内存。 Fortunatley,c++ 已经为此提供了一个构造。它是std::shared_ptr。你可以这样使用它:

{
  std::shared_ptr<A> a1 = std::make_shared<A>(); // Reference count is set at 1
  {
    std::shared_ptr<A> a2 = a1; // Reference count is incremented to 2
  } // Reference count is decremented to 1
} // Reference count is decremented to 0 and the memory is released.

【讨论】:

    【解决方案2】:

    我相信你的意思是指针赋值。简短的回答:,你不能。

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 1970-01-01
      • 2021-05-08
      • 2016-08-09
      • 1970-01-01
      • 2017-10-07
      • 2013-03-30
      • 2016-08-30
      • 1970-01-01
      相关资源
      最近更新 更多