我可以在赋值运算符中调用构造函数吗?

时间:2015-05-31 22:13:39

标签: c++ assignment-operator

我可以在赋值运算符内调用对象的构造函数....

我有这个代码......

class ActiveArea
{
    public:
        ActiveArea(const ActiveArea& active_area) : m_name(active_area.GetName()),
    m_boundary(active_area.GetBoundary()),
    m_day_music(active_area.GetDayMusic()),
    m_night_music(active_area.GetNightMusic()),
    m_custom_script(active_area.GetCustomScript()),
    m_hp_regen(active_area.GetHPRegen()),
    m_mp_regen(active_area.GetMPRegen()),
    m_pvp_ability(active_area.GetPVPAbility()),
    m_is_ladianes_suffle(active_area.IsLadianesSuffle()),
    m_is_no_pvp(active_area.IsNoPVP()),
    m_is_no_stamina(active_area.IsNoStamina()),
    m_is_no_booth(active_area.IsNoBooth()),
    m_is_under_siege(active_area.IsUnderSiege()),
    m_is_no_minimap(active_area.IsNoMiniMap()),
    m_is_no_attack(active_area.IsNoAttack()),
    m_can_teleport_from(active_area.CanTeleportFrom()),
    m_can_teleport_to(active_area.CanTeleportTo()),
    m_can_login_to(active_area.CanLoginTo()),
    m_min_level_required(active_area.GetMinLevelRequired()),
    m_max_level_required(active_area.GetMaxLevelRequired())
{

};

ActiveArea &operator=(const ActiveArea &rhs)
{
    return ActiveArea(rhs);
}
private:
    const std::string m_name;
    const Boundary* m_boundary;
    const std::string m_day_music;
    const std::string m_night_music;
    const std::string m_custom_script;
    const int m_hp_regen;
    const int m_mp_regen;
    const std::string m_pvp_ability;
    const bool m_is_ladianes_suffle;
    const bool m_is_no_pvp;
    const bool m_is_no_stamina;
    const bool m_is_no_booth;
    const bool m_is_under_siege;
    const bool m_is_no_minimap;
    const bool m_is_no_attack;
    const bool m_can_teleport_from;
    const bool m_can_teleport_to;
    const bool m_can_login_to;
    const int m_min_level_required;
    const int m_max_level_required;
};

但是当我尝试使用这个编译我的程序时,我得到了一堆警告,说“返回本地变量的地址或临时”。

由于我将警告视为错误,我希望这项工作能够实现......

我基本上希望能够做到这一点......

ActiveArea area;
ActiveArea area2;
area = area2;

2 个答案:

答案 0 :(得分:1)

  

我可以在赋值运算符中调用对象的构造函数吗?

是的,在这方面没有任何限制。但是,您必须确保强制执行赋值运算符的语义。在您的情况下,此运算符

ActiveArea &operator=(const ActiveArea &rhs)
可以期望

修改它被调用的对象,使其状态等同于rhs的状态,并返回对该对象的引用。您的示例不满足这些条件中的任何一个,并且还返回对本地对象的引用。使用该引用将是未定义的行为。通常,您需要设置对象的状态,然后return *this

ActiveArea &operator=(const ActiveArea &rhs)
{
  // set the state of this object using rhs
  ...
  return *this;
}

使用构造函数的一个有效示例是使用副本和交换习惯用法中的复制构造函数

ActiveArea &operator=(const ActiveArea &rhs)
{
  ActiveArea tmp(rhs); // copy ctor call
  swap(tmp); // assume swap is a member function
  return *this;
}

请注意,通过将参数从引用更改为值

,可以隐式执行复制
ActiveArea &operator=(ActiveArea rhs)
{
  swap(rhs); // assume swap is a member function
  return *this;
}

最后,请注意您的特定类中包含const个数据成员。这意味着在这种情况下,赋值实际上没有任何意义,因为实际赋值会修改对象的状态,而您无法修改const数据成员。

答案 1 :(得分:0)

警告来自这一行:

    return ActiveArea(rhs);

在重载运算符内部。这一行的作用是创建一个临时实例,并返回它的地址。这正是警告所说的。