构造函数转换

       将其它类型转换为当前类类型需要借助转换构造函数(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;
}