重载运算符—进阶系列(基于题目)(this指针)(默认构造函数)

170 阅读3分钟

写在前面

最基础的部分在上篇里写过了

一些会用到的知识

this指针

. 用来指向不同的对象
. 对象调用成员函数的同时,系统会把对象的地址传给成员函数的this指针,该过程自动隐含,不需要人为在形参中加入this指针,也不需要将对象地址传给this
. 被调用的成员函数体内,所有对成员的访问,都会转化为this—>成员的方式
. 但this指针不是对象的一部分,不影响sizeof(对象)的结果
. 在一些需要的场景显式调用this指针,*this就是this指针所指向的对象

默认构造函数

. 定义:没有参数的构造函数或者参数均带有默认值的构造函数
. 一个对象对应的构造函数有且唯一,默认构造函数在类中最多一个
. 若类中没有显式定义构造函数,编译系统会自动生成一个缺省的构造函数(属于无参构造函数)
. 若类中显示定义了构造函数,系统就不会自动生成缺省的构造函数 (注意这里是定义了构造函数,而非默认构造函数,也就是只要显式定义了构造函数就不会自动生成了)
. 缺省构造函数属于默认构造函数,有两种,一种函数体为空
. 不存在没有构造函数的对象

友元函数重载后置--,前置--

个人感觉后置更难一点,先写后置了

友元函数重载后置--

#include <iostream>

using namespace std;

class Point
{
	int x;
public:
        Point(){}//Point p需要默认构造函数,不然会报错的
	Point(int m);
	friend Point operator--(Point &s,int n);//返回类型为Point(这里需要有返回值,因为要先使用,需要先把初值返回使用)
	void showprint();
};
Point::Point(int m)
{
	this->x=m;//其实这里直接写x=m;就可以
}
Point operator--(Point &s,int n)
{
	Point p;//定义一个对象p
	p=s;//把s的值传给p
	--s.x;//对s的私有成员x进行自减
	return p;//返回p是因为要先使用
}
void Point::showprint()
{
	cout<<x<<endl;//这里返回的是运算之后的i的值
}
int main()
{
	int i;
	cin>>i;
    Point point(i);//定义对象point传实参i
    cout<<"先使用"<<endl;
    (operator--(point,0)).showprint();
    cout<<"后自减"<<endl;
	point.showprint();
	return 0;

}


以上代码中的int n是可以没有的,这里的出现是为了区分前置和后置。 ————在后置的形参中加一个int,当前置后置同时存在的时候,运算符都是--,系统无法区分调用的是前置还是后置,当调用后置的时候,在operator--(point)形参那里加一个0,用于区分。

友元函数重载前置--

#include <iostream>

using namespace std;

class point
{
    int n;
public:
    point(int);
    friend void operator--(point&p);
    void print();
};
point::point(int x)
{
    n=x;
}
void operator--(point&p)
{
    --p.n;
}
void point::print()
{
    cout<<n<<endl;
}
int main()
{
    int a;
    cin>>a;
    point A(a);
    --A;
    A.print();
    return 0;
}

成员函数重载后置--,前置--

成员函数重载前置

#include <iostream>

using namespace std;

class Point
{
	int x;
public:
	Point(int);
     Point operator--();        //成员函数重载单目运算符没有形参,所以()中是空的
	void print();
};
Point::Point(int a)
{
	x=a;
}
Point Point::operator--()
{
    --x;               //也可以写成--this—>x;
    return *this;
}
 void Point::print()
{
	cout<<x<<endl;
}
int main()
{
   int i;
   cin>>i;
   Point p(i);
   --p;
   p.print();
   return 0;
}

成员函数重置后置--

#include <iostream>

using namespace std;

class Point
{
    int n;
public:
    Point(){}
    Point(int);
    Point operator--(int p);
    void print();

};
Point::Point(int x)
{
    n=x;
}
Point Point::operator--(int p)
{
    Point temp;
    temp=*this;
    --n;
    return temp;        //返回初值先使用
}
void Point::print()
{
    cout<<n<<endl;     //输出运算后的值
}
int main()
{
   int a;
   cin>>a;
   Point A(a);
   (A.operator--(0)).print();
   A.print();
   return 0;
}

自增自减运算

虽然这个很简单,但有时候可能自己不清醒,顺便写一下
以题为例

#include<iostream>

using namespace std;

int main()
{
    int  x,y,z;
    x=3;
    y=++x+3;//先让x+1,再加3,然后赋值给y,先自增再使用
    cout<<x<<","<<y<<endl;
    z=(x++)+5;//先使用再自增,z=4+5然后x再自增
    cout<<x<<","<<z<<endl;
    return 0;
}//在输出中,y和z是运算结果,x是x在这个过程中x发生的变化