Complex ( double d)
{
real =r;
image =0;
}
其作用是将double 类型的参数d转换成Complex类的对象。
转换构造函数:将一个其它类型的数据转换成一个类对象。只能有一个参数。
如:
c=c1+Complex(2.5);
============================
类型转换函数:
将一个类对象转换成另一个类型数据。只能是类的成员函数。
operator double()
{
return real;
}
比如:
c1=c2+d1
编译系统是怎么处理的了?先寻找有无对"+"的重载,当发现有operator+函数时,判断是否是友员函数还是类的成员函数,且对double参数的重载。没有的话,就再次寻找是否有operate double 类型转换函数来把c2转换成double.
没有的话,再次寻找有无转换构造函数,则会建立一个临时complex类对象,在调用operator+函数来实现类相加。
:c1=c2+Complex(d1).
=====================================
d=2.3+c3;:当发现没有operator+函数时,则寻找类型转换函数operator double,把类c3转换成double。
d=c2+2.3;
d= c1+c2; 当发现有operator+函数时,先把2个类相加,然后在寻找类型转换函数operator double,把类Complex(c3+c2)转换成double。
c3=c1+2.3;//当发现有operator+函数时,先去寻找转换构造函数Complex(doubel r){real=r},把c3=c1+Complex(2.3);
c3=2.3+c1;//同样先转换operator+(2.3,c1),发现有Complex(2.3),则operator(Complex(2.3),c1)
========================================
注:定义类型转换,可以减少 operator+ ... 运算符重载函数的数量。不用专门定义对应的:
friend Complex operator+(double, Complex &);
Complex operator+(double);
-------------------------------
#include<iostream>
using namespace std;
class Complex
{
public:
Complex(){real=0;image=0;}
Complex(double r){real =r;}
Complex(double r,double i):real(r),image(i){}
void display();
friend Complex operator+(Complex &,Complex &);
operator double()
{
return real;
}
private:
double real,image;
};
void Complex::display()
{
cout<<"real:"<<real<<" image:"<<image<<endl;
}
Complex operator+(Complex &c1,Complex &c2)
{
return Complex(c1.real+c2.real,c1.image+c2.image);
}
int main()
{
Complex c1(12.1,1),c2(1.1,2.3),c3;
c3=c1+c2;
c3.display();
double d;
d=2.3+c3;
cout<<"d:"<<d<<endl;
d= c1+c2;
cout<<"d:"<<d<<endl;
c3=c1+2.3;
c3.display();
return 0;
}
分享到:
相关推荐
包含默认构造函数 初始化构造函数 复制构造函数 转换构造函数
说明了派生类与基类之间的构造函数的调用顺序……
除非不可避免,如要调用malloc()函数时要用的void型指针转换成指定类型指针。 四、标准输入输出流 在C语言中,输入输出是使用语句scanf()和printf()来实现的,而C++中是使用类来实现的。 #include iostream.h ...
摘要:深入分析了拷贝构造函数和转换构造函数的作用和实现方法 ,并指出了程序设计中出现的问题和解决方法。
数据结构 C++ 详细注释 构造函数与析构函数 类型转换.rar
C++数据类型转换以及转换构造函数 标准数据类型之间的转换 在C++中,某些不同类型数据之间可以自动转换,例如 int i = 6; i = 7.5 + i; 编译系统对 7.5是作为double型数处理的,在求解表达式时,先将6转换成...
4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数(键盘输入函数) 55 4.5 格式输入与输出 55 4.5.1 printf 函数(格式输出函数) 56 4.5.2 scanf函数(格式输入函数) 58 顺序结构程序设计举例 60 45 分支...
C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。 c++规定:对于可能只需传一个参数的默认构造函数,都定义了一种隐式调用。 ...
4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数(键盘输入函数) 55 4.5 格式输入与输出 55 4.5.1 printf 函数(格式输出函数) 56 4.5.2 scanf函数(格式输入函数) 58 顺序结构程序设计举例 60 45 分支...
关键字explicit 修饰构造方法的关键字,加上了,就告诉编译器,不可以隐式初始化对象;不加就可以隐式初始化对象; 下面的代码是可以正常编译执行的,但是加了关键字explicit,编译就会错我,因为...拷贝构造函数如果
用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。在C++提供类型转换函数(type conversion function)...
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p作为初始化值 /...
按照C语言默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p作为初始化值 //…...
在这种情况下,智能构造函数迫使我们在运行时处理潜在的转换失败,或者滥用诸如fromJust功能来破坏智能构造函数提供的所有安全性。 尽管我们可以在编译时静态地知道转换将始终成功还是始终失败,但所有这一切都是...
启示者承诺的替代方案将错误优先回调转换为原生 ES6 Promise构造函数所使用的回调。用法 function asyncOp ( val , cb ) { setTimeout ( cb , 500 , null , { val : val } )}function doAsync ( val ) { return new ...
RepeatableTransitionDrawable支持在提供给其构造函数的两个可绘制对象之间重复转换。 注意:自定义Drawable实现的一个缺点是您不能通过 xml 使用它们。 初始化: Drawable[] drawables = new Drawable[] { ...
中文版C ++入门错误太多,受不了 :face_with_medical_mask: :face_with_medical_mask: :face_with_medical_mask: ... explicit :可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生声明为明确
类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换的内幕,虚拟函数与多...