加法运算符重载为从成员函数执行过程

今天学习了运算符重载函数,测试了复数类加减运算符的重载,不明白运算符重载函数的执行过程,重点探究一下:

首先贴出源代码

// 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这个类初始化,因此会再次调用构造函数。理解结束!!不知道对否,欢迎指正!!

时间: 2024-10-11 23:49:44

加法运算符重载为从成员函数执行过程的相关文章

编写高质量代码——运算符重载,是成员函数还是友元函数

一.运算符重载的四项基本原则: ▍不可臆造运算符. ▍运算符原有操作数的个数.优先级和结合性不能改变. ▍操作数中至少一个是自定义类型. ▍保持运算符的自然含义. ============================== 二.运算符重载的两种形式: ▍成员函数形式(隐含一个参数 this 指针): 1)双目运算符:参数一个 2)单目运算符:不能显示的声明参数 ▍友元函数形式(不存在隐含的参数 this 指针) 1)双目运算符:两个参数 2)单目运算符:一个参数 ===============

运算符重载(作为成员函数)

运算符重载---基本概念 C++程序设计 郭炜 刘家瑛 1 #include<iostream> 2 using namespace std; 3 class Complex{ 4 private: 5 double real; 6 double imaginary; 7 public: 8 Complex(double a=0.0,double b=0.0) : real(a),imaginary(b) {}//初始化 9 ~Complex(){} 10 Complex operator+(

思考: 对于一个要重载的运算符而言,什么样的运算符应该用类成员函数重载,什么情况应该用友元函数重载??

还是用一个例子来说明吧 1 #define unsigned int UINT32 2 3 class RMB 4 { 5 public: 6 RMB(UINT32 d, UINT32 c); 7 friend RMB operator +(RMB&, RMB&); 8 friend RMB& operator ++(RMB&); 9 void display() 10 { 11 cout<<(yuan + jf / 100.0)<<endl; 12

运算符重载(作为普通函数)

运算符重载---基本概念 C++程序设计 郭炜 刘家瑛 1 #include<iostream> 2 using namespace std; 3 class Complex{ 4 public: 5 double real; 6 double imaginary; 7 Complex(double a=0.0,double b=0.0) : real(a),imaginary(b) {}//初始化 8 ~Complex(){} 9 void print(); 10 }; 11 Complex

函数可重入问题reentrant functions(函数执行过程中可以被中断,允许多个副本)

最近经常听到这个名词,以前也听到过,不过接触更多的是“线程安全问题”,而且本人也一直理解的是两个名字的含义是一样的.今天仔细总结一下这个名词相关的概念. 引用博文:可重入函数和不可重入函数 (http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html) 主要用于多任务环境中, 一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误

Generator生成器函数执行过程的理解

一个最基本的Generator函数格式如下,函数体内部要使用yield修饰符则必须在函数名前加上*号 let y = 0; function *testYield(x){ console.log('before yield') y = yield x + 1; console.log('after yield') return y; } 结合此函数的调用代码如下,调用testYield(1) 并赋值给变量g时, 函数体内的任何语句并没有执行,只是生成了一个迭代器赋值给变量g let g = te

关于函数执行过程的一点思考

刚刚有一个同学问我下面的代码出现了什么问题? 大家可以一起看看,这是初学者非常容易犯的错误. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="" method=&q

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载、覆盖与隐藏、类型转换运算符、*运算符重载、-&gt;运算符重载

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载.覆盖与隐藏.类型转换运算符.*运算符重载.->运算符重载 一.成员函数的重载.覆盖与隐藏 对于类层次的同名成员函数来说,有三种关系:重载.覆盖和隐藏,理清3种关系,有助于写出高质量的代码. 1.成员函数的重载 重载的概念相对简单,只有在同一类定义中的同名成员函数才存在重载关系,主要特点时函数的参数类型和数目有所不同:但不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致

第十一章 运算符重载

第十一章 运算符重载 1.  运算符重载 2.  在成员函数中实现自加 3.  重载前置自加运算符 返回类型 [email protected](参数表){} @代表要重载的运算符 对象运算符重载不同于变量运算符重载 void operator++(){++n;} ++i;//等价于i.operator++();若i是变量 则++i就是调用operator++() //n=++i;错误原因:右值为一个无符号的返回型 //1+2;等价于operator+(1+2),此时 4.  创建临时对象 见程