#include<iostream>
using namespace std;
class A
{
private:
int a;
public:
A();
A(int n);
A operator+(const A & obj);
A operator+(const int b);
friend A operator+(const int b, A obj);
void display();
} ;
A::A()
{
a=0;
}
A::A(int n)//构造函数
{
a=n;
}
A A::operator +(const A& obj)//重载+号用于 对象相加
{
return this->a+obj.a;
}
A A::operator+(const int b)//重载+号用于 对象与数相加
{
return A(a+b);
}
A operator+(const int b, A obj)
{
return obj+b;//友元函数调用第二个重载+的成员函数 相当于 obj.operator+(b);
}
void A::display()
{
cout<<a<<endl;
}
int main ()
{
A a1(1);
A a2(2);
A a3,a4,a5;
a1.display();
a2.display();
int m=1;
a3=a1+a2;//可以交换顺序,相当月a3=a1.operator+(a2);
a3.display();
a4=a1+m;//因为加了个友元函数所以也可以交换顺序了。
a4.display();
a5=m+a1;
a5.display();
}
2019binary-operators-overloading
对实例进行改写,以非成员函数的方式重载运算符 +:
2018binary-operators-overloading
当 2 个对象相加时是没有顺序要求的,但要重载 + 让其与一个数字相加则有顺序要求,可以通过加一个友元函数使另一个顺序的输入合法。
输出结果:
2017cpp-static-members
对类中静态变量的初始化始终令人迷惑不解。在这总结分享一下。
类中特殊成员变量的初始化问题:
2016cpp-static-members
细化 2 楼 的程序,发现析构的过程和构造过程完全相反。
例如,2 楼的代码中,构造 p 时先调用 CRect 的构造函数,在使用初始化列表初始化字段 mpt1 和 mpt2 时,又调用 Cpoint 的构造函数两次;
析构 p 时,先调用 CRect 的析构函数并输出,然后析构成员 mpt1 和 mpt2,且顺序是先调用 mpt2 的析构函数,再调用 mpt1 的析构函数。
代码改动如下:
运行结果:
结论:析构时先执行析构函数中的语句(此时成员还都在),再具体析构对象成员,且顺序和构造时(或申明顺序?)相反。
PS:目前尚不知是构造顺序还是申明顺序,因为我在实验时卡在嵌套在另一个类中的对象赋初值问题上了……
2015cpp-static-members
可以使用静态成员变量清楚了解构造与析构函数的调用情况。
运行结果: