运算符重载之连续加

#include <iostream>
using namespace std;

class Cp
{
private:
    static int b,
        c;
    int a;
public:
    explicit Cp(int i = 0) : a(i)
    {
        cout << "调用 " << ++b << "次构造\n";
    }
    Cp operator+ (const Cp& p) const
    {
        cout << ++c << " 次调用 " << "+重载\n";
        Cp pTemp = (Cp) (p.a + a);
        return pTemp;
    }
    friend Cp operator+ (int i, const Cp& p);
    friend void operator<< (ostream& out, const Cp& p);
};
int Cp::b = 0;
int Cp::c = 0;

Cp operator+ (int i, const Cp& p)
{
    Cp pTemp = Cp(p.a + i);
    return pTemp;
}
void operator<< (ostream& out, const Cp& p)
{
    out << p.a;
}

int main()
{
    Cp p1(1);
    cout << p1 + (Cp)2 + (Cp)3 + (Cp)5 + p1;
    cout << endl;
    cout << p1 + (Cp)4;
    cout << endl;
    cout << 4 + p1 + (Cp)4 + p1;

    system("pause");
     return 0;
} 

运行结果如下:


现在单步调试,看看是如何调用这些构造和重载的;

第一次构造:留意下this->a的值,为1;这是创建对象时调用


第二次构造:this->a的值:5;这是强制类型转换时调用

第三次构造:this->a的值:3;这是强制类型转换时调用

 

第四次构造:this->a的值:2;这是强制类型转换时调用

第一次重载:留意下传进来的参数p.a的值:2

第五次构造:this->a的值:3;这是强制类型转换时调用;3就是p1 + Cp(2)的值

第二次重载:p.a的值:3

第六次构造:this->a的值:6;这是强制类型转换时调用;6就是p1 + Cp(2)  + Cp(3)的值;

第三次重载:p.a的值:5

第七次构造:this->a的值:11;这是强制类型转换时调用;11就是p1 + Cp(2)  + Cp(3) + Cp(5)的值;

第四次重载:p.a的值:1

第八次构造:this->a的值:12;这是强制类型转换时调用;11就是p1 + Cp(2)  + Cp(3) + Cp(5) + p1的值;

然后输出了结果,

从上面发现的规则:

1、先对 + 的所有非Cp类型操作数进行类型转换,顺序是从右向左;

2、进行加法运算的顺序是从左向右;

3、每进行一次加法运算都return一个临时对象,后面再进行加法时,是用这个临时对象作为左操作数;

可以在Cp类声明中加上

Cp(const Cp& p)
	{
		cout << "第 " << ++d << " 次copy构造\n";
		a = p.a;
	}static int d;//在类外初始化int Cp::d = 0;

就可以得到下面的结果:

原文地址:https://www.cnblogs.com/IvanKeller/p/10848333.html

时间: 2024-10-29 13:09:25

运算符重载之连续加的相关文章

C++运算符重载(一)——加减

一.运算符重载为成员函数 #include <iostream> using namespace std; class Complex { public: double real; double imag; Complex(double r = 0.0,double i = 0.0); Complex operator+(const Complex&); Complex operator-(const Complex&); void printcomplex(); }; Com

【c++笔记十】运算符重载

2015年2月1日 阴雨 周日 今天难得休息,闲来无事就往岳麓山走了一遭,作为一个有情怀的程序猿就应该培养B格,不对,培养情操.拍了点雾凇,可以去我QQ空间看看. 今天笔记里要说的内容是:运算符重载.就像函数重载,运算符也可以重载.到底是什么样的重载呢?请听下回分解.哦不对,请看下面分解. --------------------------------------分割线------------------------------------------ 一.什么是运算符的重载? 我们先一起来看

运算符重载三种形式(成员函数,友元函数,普通函数)详解

首先,介绍三种重载方式: 1 //作为成员函数重载(常见) 2 class Person{ 3 Private: 4 string name; 5 int age; 6 public: 7 Person(const char* name, int age):name(name),age(age){} 8 bool operator<(const Person& b); 9 10 }; 11 bool Person::operator<(const Person& b) 12 {

Kotlin中复合赋值(+=,-=,……)运算符重载

本篇建立在已经了解了kotlin中运算符重载的理念以及如何实现的基础上. 来我们首先写一个简单的类,然后重载运算符+,+=,-,-=这个几个运算符.代码如下: data class Point(var x: Int, var y: Int) { operator fun plus(point: Point): Point { return Point(this.x + point.x, this.y + point.y) } operator fun plusAssign(point: Poin

C++运算符重载的妙用

运算符重载(Operator overloading)是C++重要特性之中的一个,本文通过列举标准库中的运算符重载实例,展示运算符重载在C++里的妙用.详细包含重载operator<<,operator>>支持cin,cout输入输出.重载operator[],实现下标运算.重载operator+=实现元素追加:重载operator()实现函数调用.假设你对C++的运算符重载掌握的游刃有余.那就无需继续往下看了. 运算符重载带来的优点就是--让代码变得简洁.以下将展示几个标准库因使

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结. 一.何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以运算符重载在笔试面试中有可能成为c++的高频考点.运算符重载就是重新定义运算符的意义,如常用的+,-,×,÷都是可以重载的.运算符重载使用的是关键字operator,表现形式是:                                                            

C++:运算符重载函数之&quot;++&quot;、&quot;--&quot;、&quot;[ ]&quot;的应用

5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++(X &ob) //友元函数重载,其中ob为类X的对象的引用 对于后缀方式++ob,可以用运算符函数重载为: ob.operator++(int) //成员函数重载 或 operator++(X &ob,int) //友元函数重载,其中ob为类X的对象的引用 调用时,参数int一般被传递给值0

C++哪些运算符重载可以重载?

运算符重载是C++极为重要的语言特性之一,本文将用代码实例回答--C++哪些运算符可以重载?如何重载?实现运算符重载时需要注意哪些? 哪些运算符可以重载,哪些不可重载? C++98,C++0x,C++11对"哪些运算符重载可以重载"有一致的规定,具体如下: 其中,很少使用的是","(逗号运算符). 标准同样规定了不可重载的运算符: 其中,"::"是作用域运算符, "?:"是条件运算符. 两个较少使用的运算符是 .* 和 -&g

C++复数运算符重载(+与&lt;&lt;)

Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算与输出操作.(1)参加运算的两个运算量可以都是类对象,也可以其中有一个是实数,顺序任意.例如,c1+c2,d+c1,c1+d均合法(设d为实数,c1,c2为复数).(2)输出的算数,在复数两端加上括号,实部和虚部均保留两位小数,如(8.23+2.00i).(7.45-3.40i).(-3.25+4.13i)等.编写程序,分别求两个复数之和.整数和复数之和,并且输出. 请在下面的程序段基础上完