写C++代码的时候,经常需要进行强制类型转换,比如:
int a =1;
float b = (float)a;
但是只限于基本数据类型,如下做法会报错:
class Complex{
}
int a = 1;
Complex n = (Complex)a;
可以给class定义转换构造函数;
转换构造函数特点:只有一个参数的构造函数,参数类型可以是基本数据类型,也可以是复杂class。
Complex c1(26.4); //创建具名对象
Complex c2 = 240.3; //以拷贝的方式初始化对象
Complex(15.9); //创建匿名对象
c1 = Complex(46.9); //创建一个匿名对象并将它赋值给 c1
示例如下:
#include <iostream>
using namespace std;
class Complex{
private:
double real;
double unreal;
public:
Complex():real(0),unreal(0){}
Complex(double real):real(real){
cout<<"conver contrust function"<<endl;
}
Complex(double real,double unreal):real(real),unreal(unreal){}
Complex operator + (const Complex & b){
Complex ans;
ans.real = this->real+b.real;
ans.unreal = this->unreal+b.unreal;
return ans;
}
Complex operator - (const Complex & b){
Complex ans;
ans.real = this->real-b.real;
ans.unreal = this->unreal-b.unreal;
return ans;
}
void display(){
cout<<real<<"+"<<unreal<<"i"<<endl;
}
};
int main() {
int w=3;
Complex a = w;
Complex b = a+8;
Complex c = (Complex)9;
Complex d(9,10);
Complex e = d+3;
a.display();
e.display();
return 0;
}
explicit关键字抑制构造函数定义隐式转换
功能:如果我们不想让类发现隐式类型转换,就可以使用该关键字来阻止
语法:explicit放在构造函数的前面。如果构造函数定义在类外,那么类外定义构造函数时不能再使用explicit关键字
注意:explicit构造函数只能用于直接初始化,而不能用于拷贝拷贝形式的初始化过程