#include<iostream>
using namespace std;
class S
{
private:
double n;
public:
S(){}
S(double n1){n = n1; std::cout <<"转换构造函数被调用\n";}//exlicit阻止隐式转换
S(const S & s){std::cout <<"复制构造函数被调用\n";}
S & operator=(const S & s){cout<< "赋值构造函数被调用!\n";return *this;}
operator int()const {return int(n);}
~S(){std::cout << "析构函数被调用\n";}
};
intmain(int argc,char *argv[])
{
S s;
s = 23.4;//构造临时对象,再赋值(调用赋值构造函数)
S s1(23.4);
cout << s1.operator int() << endl;
return 0;
}
1. 从某种类型转换到类类型:通过只接受一个参数的构造函数
(1)隐式转换:
S = 23.4;程序使用S构造函数创建一个临时对象,再调用赋值函数将临时对象的成员值逐个赋给s对象。这就是隐式转换的过程。
函数原型化提供的参数匹配过程,允许转换构造函数来转化其他类型的值,比如 :int a = 3; S s; s = a;编译器首先将int转换成double类型,再使用S(double n)转换函数。而这样使用的前提是不存在二义性,才回进行第二步转换。如果还定义了S(long n),编译器将会认为存在二义性,拒绝这些语句,因为int类型的a可以转换成long类型,也可以转换成double类型。
还可以使用以下隐式转化:
a. 将S对象初始化为double值时
b. 将double值赋给S对象时
c. 将double值传递给S参数的函数时
d. 返回值被生命为S的函数试图返回double值时
e. 在上述任意一种情况下,使用可转换成double类型的内置类型时
(2)限制隐式转换用关键字explicit,如果转换函数前使用了explicit(C++11消除C++98中不用于转换函数的限制)声明,则只能用显式转换,如:explicit S(double n1){n = n1; std::cout << "转换构造函数被调用\n";}
S s; s = (S)23.4;
2. 从类类型转换成其他类型:用户定义的强制类型转换
注意:a. 转换函数必须是类方法
b.转换函数不能指定返回类型
c.转换函数不能有参数
如: operator int()const {return int(n);} int表明要转换成的类型,因此不用加返回值,必须通过类对象来调用,比如:S s1; cout << s1.operator int() << endl;虽然转换函数不声明返回类型,但应该返回所需要类型值。