我可以在赋值运算符中调用构造函数吗?
Can I call a Constructor inside of an 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;
};
但是当我尝试使用它编译我的程序时,我收到了一堆警告,说 "Returning address of local variable or temporary"。
因为我将警告视为错误,所以我想让它正常工作...
我基本上希望能够做到这一点...
ActiveArea area;
ActiveArea area2;
area = area2;
警告来自这一行:
return ActiveArea(rhs);
在您的重载运算符中。此行所做的是创建一个临时实例,并 return 它的地址。这正是警告所说的。
Can I call a constructor of an object inside of an assignment operator?
是的,在这方面没有任何限制。但是,您必须确保强制执行赋值运算符的语义。在你的例子中,这个运算符
ActiveArea &operator=(const ActiveArea &rhs)
可能会修改调用它的对象,使其状态等同于 rhs
的状态,并 return 对该对象的引用。您的示例不满足这些条件中的任何一个,此外,return 是对本地对象的引用。使用该引用将是未定义的行为。通常,您会设置对象的状态,然后 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;
}
最后,请注意您的特定 class 充满了 const
数据成员。这意味着在这种情况下赋值实际上没有任何意义,因为真正的赋值会修改对象的状态并且您不能修改 const
数据成员。
我可以在赋值运算符中调用对象的构造函数吗....
我有这个代码....
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;
};
但是当我尝试使用它编译我的程序时,我收到了一堆警告,说 "Returning address of local variable or temporary"。
因为我将警告视为错误,所以我想让它正常工作...
我基本上希望能够做到这一点...
ActiveArea area;
ActiveArea area2;
area = area2;
警告来自这一行:
return ActiveArea(rhs);
在您的重载运算符中。此行所做的是创建一个临时实例,并 return 它的地址。这正是警告所说的。
Can I call a constructor of an object inside of an assignment operator?
是的,在这方面没有任何限制。但是,您必须确保强制执行赋值运算符的语义。在你的例子中,这个运算符
ActiveArea &operator=(const ActiveArea &rhs)
可能会修改调用它的对象,使其状态等同于 rhs
的状态,并 return 对该对象的引用。您的示例不满足这些条件中的任何一个,此外,return 是对本地对象的引用。使用该引用将是未定义的行为。通常,您会设置对象的状态,然后 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;
}
最后,请注意您的特定 class 充满了 const
数据成员。这意味着在这种情况下赋值实际上没有任何意义,因为真正的赋值会修改对象的状态并且您不能修改 const
数据成员。