c++ - 在 C++ 中重载方法时,是否可以考虑等号运算符并将返回值分配给另一个类实例?
问题描述
是否可以在一个类中拥有一个修改自己的类实例的方法,但是通过重载它也可以修改另一个类实例,甚至创建一个新实例,例如使用等号?还是我需要以特殊方式重载运算符?
像这样的东西:
class MyClass{
public:
MyClass() {};
MyClass(int x): number(x) {};
void increaseNumber(){
number++;
}
MyClass increaseNumber() const{
MyClass tempObj(this->number);
tempObj.number++
return tempObj;
}
private:
int number = 0;
}
int main(){
MyClass a(10);
a.increaseNumber(); // -> a.number == 11
MyClass b = a.increaseNumber() // -> b.number == 12 ???
}
解决方案
首先,我希望我正确理解了您的问题,如果您不是这个意思,请纠正我。只要更改签名,就可以完成重载。在您的代码中,签名由 const 关键字更改,也返回类型。我可以给你一个在同一个类中重载等号两次的例子,如下所示:
第一个实现用作默认副本,您将 rhs 复制到 lhs,而第二个实现移动数据而不复制。
class Factor {
int _n = 0;
int _d = 1;
public:
Factor & operator = (const Factor &);
Factor & operator = (Factor &&) noexcept;
Factor & Factor::operator = ( const Factor & rhs ) {
message("op =");
if( this != &rhs ) {
_n = rhs.numerator();
_d = rhs.denominator();
}
return *this;
}
Factor & Factor::operator = ( Factor && rhs ) noexcept {
message("op move =");
if ( this != &rhs ) {
_n = std::move(rhs._n);
_d = std::move(rhs._d);
rhs.reset();
}
return *this;
}
推荐阅读
- xml - 如何在 XML 输出中嵌入 CSV 文件
- amazon-web-services - 从 Lambda 函数访问 Congito 授权的 AppSync API
- c# - 使用 C# 使用 Oracle ORDS RESTful api
- javascript - 工具提示中的 Highcharts 表格样式不起作用
- php - 从 MySql 数据库中的 JSON 列获取数据
- django - 如何在我的 django 模板中每秒更新照片?
- c# - 远程服务器返回错误:(400) 错误请求。仅在其他服务器上出错
- sql - 如果数据库不存在,则截断命令在 SQL SERVER 2016 中给出错误,但在 SQL Server 的较低版本中工作正常..请建议
- excel - 如果使用电话号码,谷歌通过 VBA 搜索没有结果
- python - TensorFlow 到 ONNX 的转换