构造函数转换
将其它类型转换为当前类类型需要借助转换构造函数(Conversion constructor)。转换构造函数也是一种构造函数,它遵循构造函数的一般规则。
1、先声明一个类;
2、在类中定义一个只有一个参数的构造函数,参数是待转换类型的数据,在函数体中指定转换的方法。
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
class complex
{
public:
complex() :real(.0), imag(.0) {} //默认构造函数
complex(double _real, double _imag) : real(_real), imag(_imag){} //构造函数
complex(double _real) : real(_real), imag(0.0) //转换构造函数
{
std::cout << "Conversion constructor" << std::endl;
}
friend std::ostream& operator<<(std::ostream& os, complex& value);
double real;
double imag;
};
std::ostream & operator<<(std::ostream& os, complex& value)
{
std::cout << value.real << " + " << value.imag << "i" << std::endl;
return os;
}
int main()
{
complex f(10.0, 15.0);
std::cout << "f Normal constructor: " << f << std::endl;
complex b;
b = 10;
std::cout << "b Conversion constructor: " << b << std::endl;
complex c(10);
std::cout << "c Conversion constructor: " << c << std::endl;
return -1;
}
//输出
f Normal constuctor: 10 + 15i
Conversion constructor
b Conversion constructor: 10 + 0i
Conversion constructor
c Conversion constructor: 10 + 0i
谈构造函数
构造函数的本意是在创建对象的时候初始化对象,编译器会根据传递的实参来匹配不同的(重载的)构造函数。
- 默认构造函数。编译器自动生成的构造函数。 complex 类为例,原型为:complex(); //没有参数
- 普通构造函数。用户自定义的构造函数。 complex 类为例,原型为:complex(double real, double imag); //两个参数
- 拷贝构造函数。以拷贝的方式初始化对象时调用。以complex 类为例,原型为:complex(const Complex &c);
- 转换构造函数。将其它类型转换为当前类类型时调用。以ccomplex 为例,原型为:complex(double real);
operator 类的转换函数
类的转换函数应当满足以下的几个条件:
- 转换函数必须是类的方法
- 转换函数无指定返回类型
- 转换函数无参数
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
class obj {};
class my_class
{
public:
operator obj()//定义了一个将类转化为obj的转换函数
{
std::cout << "convert to obj!!" << std::endl;
return obj();
}
friend std::ostream& operator<<(std::ostream& os, my_class& value);
};
std::ostream& operator<<(std::ostream& os, my_class& value)
{
std::cout << __FUNCTION__ << std::endl;
return os;
}
int main()
{
my_class a;
obj i_a = a;//第一次显式的转换
std::cout << a << std::endl;//第二次隐式的转换
return -1;
}
//输出
convert to obj!!
operator <<
二义性
同时提供多个符合条件的转换函数
class my_class
{
public:
operator int()//定义了一个将类转化为int的转换函数
{
std::cout << "convert to int!!" << std::endl;
return int();
}
operator double() //定义一个将类转化为double的转换函数
{
std::cout << "convert to double!!" << std::endl;
}
};
int main()
{
my_class a;
int i_a = a;//第一次显式的转换
std::cout << a << std::endl;//第二次隐式的转换 报错
return -1;
}
在VS上得到如下的报错信息
有多个运算符 "<<" 与这些操作数匹配
解决方法
比如显式的指定要输出的是哪种类型,不让让编译器自己去选择
cout << (double)a << endl;
或指定其中一个转换函数只能显式的转换,而不能隐式的转换
explicit operator double()
{
cout << "convert_to_double" << endl;
return 1.1;
}