- 1. 简单加法函数实现类对象加法
- 2.改进简单加法函数实现类对象加法
- 3. 运算符的重载
- 运算符的重载总结
示例:
class Complex
{
private:
int Real;
int Image;
public:
Complex() :Real{ 0 }, Image{ 0 }
{
cout << "Create Complex" << this << endl;
}
Complex(int r, int i) :Real{ r }, Image{ i }
{
cout << "Create Complex(int int)" << this << endl;
}
Complex(const Complex& com) :Real(com.Real), Image(com.Image)
{
cout << "Copy Create Complex(const Complex&)" << this << endl;
}
~Complex()
{
cout << "Destroy Complex" << this << endl;
}
void Print() const
{
cout << "Real= " << Real << " Image= " << Image << endl;
}
Complex Add(Complex com)
{
int r = this->Real + com.Real;
int i = this->Image + com.Image;
Complex tmp(r, i);
return tmp;
}
};
int main()
{
Complex ca(1, 2);
Complex cb(3, 4);
Complex cc;
ca.Print();
cb.Print();
cc.Print();
cc = ca.Add(cb);
cc.Print();
return 0;
}
运行结果:
结果分析:
程序运行时,先进入主函数,执行Complex ca(1, 2);和Complex ca(3, 4);调用带参数的构造函数,执行Complex cc;调用缺省的构造函数,然后依次打印出值;但是在执行cc = ca.Add(cb);时,首先调用拷贝构造函数,然后在调用带参构造函数,然后再调用拷贝构造函数将其产生的值给cc,在这块会产生一个将亡值,因此,在这中间会调用三次析构函数,最后将值打印出来;最后三次调用析构函数是对Complex ca(1, 2);Complex cb(3, 4);和Complex cc;进行析构。
将类中的Add函数进行修改,在我们执行这个函数时,可以少调用一次系统中的内存,这样也简化了程序的复杂度,如将Add改为:
Complex Add(const Complex &com) const
{
int r = this->Real + com.Real;
int i = this->Image + com.Image;
return Complex(r, i);
}
运行结果:
上述程序执行后,执行cc = ca.Add(cb);产生如下结果
从这两个结果可以看出,改进后的Add函数在栈桢中申请内存的次数减少了,这就大大优化了程序。
在C++中,构造operator+去实现上面示例中类对象的加法,这也就是运算符的重载。
示例:
class Complex
{
private:
int Real;
int Image;
public:
Complex() :Real{ 0 }, Image{ 0 }
{
cout << "Create Complex" << this << endl;
}
Complex(int r, int i) :Real{ r }, Image{ i }
{
cout << "Create Complex(int int)" << this << endl;
}
Complex(const Complex& com) :Real(com.Real), Image(com.Image)
{
cout << "Copy Create Complex(const Complex&)" << this << endl;
}
~Complex()
{
cout << "Destroy Complex" << this << endl;
}
void Print() const
{
cout << "Real= " << Real << " Image= " << Image << endl;
}
Complex operator+(const Complex& com) const
{
int r = this->Real + com.Real;
int i = this->Image + com.Image;
return Complex(r, i);
}
};
int main()
{
Complex ca(1, 2);
Complex cb(3, 4);
Complex cc;
ca.Print();
cb.Print();
cc.Print();
cc = ca + cb;//类中有运算符重载,主函数中两个类对象进行加法时,直接可以相加
cc.Print();
cc = ca.operator+(cb);//注意
cc.Print();
return 0;
}
主要改的代码为:
运行的结果:
运算符的重载实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该重载的运算符时调用此函数,这个函数叫做运算符重载函数,通常为类的成员函数。
定义运算符重载函数的一般格式:
类名 operator 重载的运算符(参数表){…}
如:Complex operator+(const Complex& com)
其中Complex为类名,重载运算符是+,const Complex& com为参数表。
operator是关键字,它与重载的运算符一起构成函数名,因函数名的特殊性,C++编译器可以将这类函数识别出来。
运算符的重载函数的函数名必须为关键字operator 加一个合法的运算符,在调用该函数时,将右操作数作为函数的实参。



