今天学习了运算符重载函数,测试了复数类加减运算符的重载,不明白运算符重载函数的执行过程,重点探究一下:
首先贴出源代码
// example_1_2_cl_dt_fushujiajian.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; class complex { public: complex(double r=0.0,double i=0.0){real=r;imag=i;cout<<"构造函数被调用..."<<"real="<<r<<" imag="<<i<<endl;}; complex operator+(complex c2); complex operator-(complex c3); void display(); private: double real; double imag; }; complex complex::operator +(complex c2)//函数实现的时候没有写complex:: 是类的实现函数形式还是不清楚呀!! { cout<<"复数+被调用..."<<endl; cout<<"("<<real<<","<<imag<<")"<<endl; cout<<"c2=("<<c2.real<<","<<c2.imag<<")"<<endl; return complex(real+c2.real,imag+c2.imag); cout<<"复数+调用结束..."<<endl; } complex complex::operator-(complex c3)//函数实现的时候写成了complex::complex operator -的形式,还是类的实现函数形式不清楚呀!! { cout<<"复数-被调用..."<<endl; cout<<"("<<real<<","<<imag<<")"<<endl; cout<<"c3=("<<c3.real<<","<<c3.imag<<")"<<endl; //complex c4; //c4=c3; //cout<<"新对象的值("<<real<<","<<imag<<")"<<endl; return complex(real-c3.real,imag-c3.imag); cout<<"复数-调用结束..."<<endl; } void complex::display() { cout<<"("<<real<<","<<imag<<")"<<endl; cout<<"显示函数被调用..."<<endl; } int _tmain(int argc, _TCHAR* argv[]) { complex c1(5,4),c2(2,10),c3; cout<<"c1=";c1.display();//此处出错没写c1. 这就是类使用的太少,不会用呀!! cout<<"c2=";c2.display();//此处出错没写c1. 这就是类使用的太少,不会用呀!! c3=c1-c2; cout<<"c3=c1-c2="; c3.display(); c3=c1+c2; cout<<"c3=c1+c2="; c3.display(); system("pause"); return 0; }
运行结果:
不理解的部分:
c3=c1-c2;
这行代码是如何执行的过程怎样??c1和c2 是如何被调用的?
分析后得知:
c3=c1-c2;
可以理解为“c3”表示返回值,类型就是c3本身的类型,"c1-"整体可以理解为调用c1这个对象内部的”complex operator-(complex c3);“函数,
”c1-c2“整体理解为以“c2”做为”complex operator-(complex c3)“这个函数的参数并且执行”complex operator-(complex c3)“这个函数的内容;
”c3=c1-c2“理解为把这个函数的返回值赋值给c3.这个赋值过程就相当于给c3这个类初始化,因此会再次调用构造函数。理解结束!!不知道对否,欢迎指正!!