运算符重载的例子不清楚
Operator overloading example not clear
我正在学习操作符重载,我发现了这个例子:
#include <iostream>
using namespace std;
class MinMax
{
private:
int m_nMin; // The min value seen so far
int m_nMax; // The max value seen so far
public:
MinMax(int nMin, int nMax)
{
m_nMin = nMin;
m_nMax = nMax;
}
int GetMin() { return m_nMin; }
int GetMax() { return m_nMax; }
friend MinMax operator+(const MinMax &cM1, const MinMax &cM2);
friend MinMax operator+(const MinMax &cM, int nValue);
friend MinMax operator+(int nValue, const MinMax &cM);
};
MinMax operator+(const MinMax &cM1, const MinMax &cM2)
{
// Get the minimum value seen in cM1 and cM2
int nMin = cM1.m_nMin < cM2.m_nMin ? cM1.m_nMin : cM2.m_nMin;
// Get the maximum value seen in cM1 and cM2
int nMax = cM1.m_nMax > cM2.m_nMax ? cM1.m_nMax : cM2.m_nMax;
return MinMax(nMin, nMax);
}
MinMax operator+(const MinMax &cM, int nValue)
{
// Get the minimum value seen in cM and nValue
int nMin = cM.m_nMin < nValue ? cM.m_nMin : nValue;
// Get the maximum value seen in cM and nValue
int nMax = cM.m_nMax > nValue ? cM.m_nMax : nValue;
return MinMax(nMin, nMax);
}
MinMax operator+(int nValue, const MinMax &cM)
{
// call operator+(MinMax, nValue)
return (cM + nValue);
}
int main()
{
MinMax cM1(10, 15);
MinMax cM2(8, 11);
MinMax cM3(3, 12);
MinMax cMFinal = cM1 + cM2 + 5 + 8 + cM3 + 16;
cout << "Result: (" << cMFinal.GetMin() << ", " <<
cMFinal.GetMax() << ")" << endl;
return 0;
}
我不明白MinMax cMFinal = cM1 + cM2 + 5 + 8 + cM3 + 16;
这行是怎么工作的。
计算后,它变成了MinMax cMFinal = MinMax(3, 16)
。接下来会发生什么?当我没有定义重载赋值操作符时,编译器如何将一个对象赋值给另一个对象?
假设您有两个MinMax
对象,a
和b
。然后当你有像
MinMax c = a + b;
然后编译器将其翻译成下面的
MinMax c = operator+(a, b);
换句话说,它就像一个普通的函数调用。
如果执行多个操作,如
MinMax d = a + b + c;
那么编译器将在内部生成临时变量并使用,如
MinMax compilerGeneratedTemporary = operator+(a, b);
MinMax d = operator+(compilerGeneratedTemporary, c);
如果您想知道的是初始化,那么它正在调用MinMax
复制构造函数。当你同时声明和初始化一个对象变量时,它不是赋值,它只是重用赋值操作符。
operator+
函数返回一个MinMax
对象,该对象传递给类的复制构造函数。
如果一个类没有复制构造函数,编译器会自动为你生成一个(有一些例外,参见下面链接的参考)。
相关文章:
- 取消引用运算符不能重载
- 关于隐式声明的复制构造函数的引用在逻辑上不清楚
- C++复制 c'tor 现在确实会采取行动。 不清楚为什么
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 运算符[]和运算符int()的不明确重载
- 矢量编程:不清楚矢量的初始化
- 为什么在析构函数中引发异常时不调用重载删除
- 为什么我不能重载运算符<< 与 ostream 和 map( 或 unordered_map)?
- 调用虚函数的逻辑不清楚(或者是方法隐藏?
- cudaMemcpy 在从设备读取到主机时返回 cudaErrorInvalidArgument,不清楚原因
- ADL 找不到重载函数
- 实现附加对象:不清楚的文档示例
- Rcpp/C++/R:比较日期时间矢量与日期时间时出错(错误:"运算符>"的不明确重载)
- 运算符 == 不要求重载为隐含的"真"?
- 类运算符的不明确重载>>
- 智能指针移动语义我不清楚
- 使用 C++11 选项编译 C++98 代码时由于 Boost 标头而导致的不明确重载
- 错误:"运算符>>"不匹配 重载 istream 运算符
- 不清楚如何在从抽象基类派生的类中实现运算符重载
- 运算符重载的例子不清楚