c++重载double

//program 13.7.1.cpp 重载double
#include <iostream>
using namespace std;
class Complex/*复数类*/
{
double real,imag;
public:
Complex(double r=0,double i=0):real(r),imag(i) { };//constructor
/*将double重载为类Complex的成员函数:*/
operator double () { return real; } //重载强制类型转换运算符 double
};
int main()
{
Complex c(1.2,3.4);
cout << "(double)c ="<<(double)c/*调用了operator double()函数:等价于“c.( operator double())”*/
<< endl; //输出 1.2
/*注意强制类型转换一般不改变被转换的对象的值,只是用它来只读地 访问提取/转换某些(成员变量)值*/
/*此时的c还是最开始的那个c*/
double n = 2 + c; //等价于 double n=2(+c.operator double()
/*n是double类型的数;double 会先让表达式左右部分的操作的值的类型一致,LHS的double,那RHS的各值也应该变成double(恰好,Complex类的对象c可以调用operator double()函数进行转换并得到double类型的值,和2相加*/
cout <<"n="<<n<<endl; //输出 3.2
double n1;
n1 = 2+(double)c;
cout <<"n1="<< n1<<endl;//输出 3.2
double n2;
n2 = double (2 + c);//即时用括号将整形2和Complex类型c相加,由于double成员函数的作用,使得RHS的值为double类型.
cout <<"n2="<< n2<<endl;
int n3;
n3 = double(2 + c);/*即便是用int变量作为左值来接受double(2+c),还是会优先触发对象c中的operator double函数(即<=>c.operator double()+2<=>(double)c+2;
其中,operator double()是一个成员函数的整体名*/
cout << "n3=" << n3 << endl;
int n4;
n4 = n2;/*浮点数复制给整形数丢失小数部分.*/
cout << "n4=" << n4 << endl;
}
/*
*
重载强制类型转换运算符时,(函数头/函数声明)不要指定返回值类型,
因为返回值类型是确定的,就是那个运算符代表的类型,在这里就是double。
重载后的效果是“(double)c",就等价于“c.operator double()”。
有了对double运算符的重载,本该出现double类型的变量或常量的地方,
如果出现了一个Complex类型的对象,那么该对象上的operator double成员函数就会被调用,
然后取其返回值(Complex类对象的real成员)使用。
编译器认为本行中“c”这个位置如果出现的是一个double类型的变量或常量的话,这条语句就能够解释得通(LHS和RHS类型一致,都为double了,允许相加),
而Complex类正好重载了double运算符,
因而本行就等价于:double n = 2 + c.operator double();*/
posted @   xuchaoxin1375  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2023-09-22 css_transform_skew()中的角度问题_动画演示角度变化
2023-09-22 PT@古典概型@等概率模型@P1
2023-09-22 PT@Bernoulli概型@古典概型之伯努利概型
2022-09-22 windows10_北京时间设置UTC+08:00)
2021-09-22 python/javaScript_数制进制转换base conversion problem
点击右上角即可分享
微信分享提示