【问题标题】:What operators to implement with int members使用 int 成员实现哪些运算符
【发布时间】:2014-05-05 09:46:53
【问题描述】:

我有一个类,它有几个 int 和一个 const int 成员,并定义了一个构造函数。

class SomeContainer
{
    public:
        SomeContainer():
            member1(0),
            member2(staticMethod())
        {}
    private:
         static int staticMethod();
         int member1;
         const int member2;
}

我需要创建一个赋值运算符,因为我在另一个类 MainClass 和代码中使用了这个类

MainClass* p1;
MainClass* p2
{
    //...
    *p1 = *p2 // fails since SomeContainer doesn't have copy assignment operator
}

这段代码应该够用还是我遗漏了什么?

{
    SomeContainer(const SomeContainer& other): // copy ctor
        member1(other.member1),
        member2(other.member2)
    {}


    SomeContainer& operator=(const SomeContainer& other)  // assignment operator
    {
      member1 = other.member1;
    }
}

move ctor 和 move assignment 怎么样?我是否也需要实施这些?

【问题讨论】:

  • p1 = p2; 与类的复制赋值运算符无关。这些是指针。
  • 大概你的意思是*p1 = *p2
  • @0x499602D2:如果他想要复制,他就会这样做,因为const 成员意味着不存在默认的赋值语义。
  • @LightnessRacesinOrbit 是的,我的意思是 *p1 = *p2。谢谢

标签: c++ copy-constructor assignment-operator


【解决方案1】:

首先,如果p1p2 是指针,那么你可以分配它们。

如果移动构造函数不存在,则将使用复制构造函数。

我仍然很难理解允许对具有恒定非静态部分的事物进行赋值的逻辑含义是什么。

【讨论】:

  • 可能const 成员是该实例的某种唯一ID。对于具有值语义的类型,这应该不受赋值运算符的影响,这是完全正确的。
  • @LightnessRacesinOrbit:对我来说,价值语义意味着身份不起作用,唯一的 id 在这种情况下没有多大意义。
  • 好吧,我会同意你的猜测。
  • 在此上下文中,const 成员是从操作系统获得的时钟频率。不过那部分不是我写的
  • @randomThought:那为什么它不是简单的静态成员而不是 const 实例成员?
【解决方案2】:

你写的就够了。

当不存在移动构造函数时,将使用复制构造函数,而这里的移动语义实际上没有任何意义。

【讨论】:

    【解决方案3】:

    如果您真的需要分配,只需从该成员中删除 const

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多