写在前面
最基础的部分在上篇里写过了
一些会用到的知识
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发生的变化