看代码
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class A
{
public:
A(int a)
{
this->p = a;
}
A operator+(const A& p)
{
A pp(this->p + p.p);
return pp;;
}
int p;
};
int main()
{
A a1(2);
A a2 = a1 + 1;
cout << a2.p << endl;
cout << a1.p << endl;
}
看看这行代码
A a2 = a1 + 1;
我们运算符重载 A operator+(const A& p) 中除了隐藏的 this参数,另外一个参数 是 类 A 类型的 ,上面的代码明显有错误,为什么不报错呢,这是因为单参数的构造函数具有类型转换的功能,编译器将 a1 + 1 转换成了 a1 + A( 1 ) ,然后再调用 operator+ 函数进行运算,最后再调用拷贝构造函数实现 a2 的初始化。
格式
operator 类型表达式 ( )
由于转换后的类型就是函数的返回类型,所以强制类型转换函数不需要定义返回类型,也不带输入参数(表示将 this 对象转换位其他类型 )
且强制类型转换的结果通常为右值
我们来看看下面这个代码
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class A
{
public:
A(int a)
{
this->p = a;
}
/*A operator+(const A& p)
{
A pp(this->p + p.p);
return pp;;
}*/
operator int()
{
return p;
}
int p;
};
int main()
{
A a1(2);
A a2 = a1 + 1;
cout << a2.p << endl;
cout << a1.p << endl;
}
如果把注释的部分去掉,代码会报错,因为程序不知道是调用我们之前讲的那个函数,还是 将 a1 转换成 int ( 即 p 的值 ),再调用构造函数
或者改成
A a2 = 1 + a1;
这样即使有A operator+(const A& p)函数也不会被调用