C++中Operator类型强制转换成员函数解析
类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的目标类型。转换函数又称类型强制转换成员函数,它是类中的一个非静态成员函数。它的定义格式如下:
class <类型说明符1>
{
public:
operator <类型说明符2>();
…
}
这个转换函数定义了由<类型说明符1>到<类型说明符2>之间的映射关系。可见,转换函数是用来将一种类型的数据转换成为另一种类型。
1.operator用于类型转换函数:
类型转换函数的特征:
1) 型转换函数定义在源类中;
2) 须由 operator 修饰,函数名称是目标类型名或目标类名;
3) 函数没有参数,没有返回值,但是有return 语句,在return语句中返回目标类型数据或调用目标类的构造函数。
类型转换函数主要有两类:
1) 对象向基本数据类型转换:
#include<iostream>
#include<string>
using namespace std;
class D{
public:
D(double d):d_(d) {}
operator int() const{
std::cout<<"(int)d called!"<<std::endl;
return static_cast<int>(d_);
}
private:
double d_;
};
int add(int a,int b){
return a+b;
}
int main(){
D d1=1.1;
D d2=2.2;
std::cout<<add(d1,d2)<<std::endl;
system("pause");
return 0;
}
结果:
可见在add(d1,d2)函数调用时隐性地调用了operator int() const 函数。
2)对象向不同类的对象的转换:
#include<iostream>
class X;
class A
{
public:
A(int num=0):dat(num) {}
A(const X& rhs):dat(rhs) {}
operator int() {return dat;}
private:
int dat;
};
class X
{
public:
X(int num=0):dat(num) {}
operator int() {return dat;}
operator A(){
A temp=dat;
return temp;
}
private:
int dat;
};
int main()
{
X stuff=37;
A more=0;
int hold;
hold=stuff;
std::cout<<hold<<std::endl;
more=stuff;
std::cout<<more<<std::endl;
return 0;
}
上面这个程序中X类通过“operator A()”类型转换来实现将X类型对象转换成A类型。
2.operator 用于操作符重载:
操作符重载的概念:
将现有操作符与一个成员函数相关联,并将该操作符与其成员对象(操作数)一起使用。
注意事项:
1) 重载不能改变操作符的基本功能,以及该操作符的优先级顺序。
2) 重载不应改变操作符的本来含义。
3) 只能对已有的操作符进行重载,而不能重载新符号。
4) 操作符重载只对类可用。
5) 以下运算符不能被重载:
. 原点操作符(成员访问符)
* 指向成员的指针
:: 作用域解析符
? : 问号条件运算符
sizeof 操作数的字节数
操作符函数的一般格式:
return_type operator op(argument list);
return_type:返回类型(要得到什么)
op:要重载的操作符
argument list:参数列表(操作数有哪些)