转换构造函数实现类型转换
当不同类型的数据一起运算时,编译器会进行自动类型转换,将参加类型转换的操作数转换成同一类型再运算
- 系统的内置类型,编译器知道如何在这种类型之间转换
- 用户自定义类型之间,用户自定义类型和编译器内置类型之间如何进行转换,编译器无法处理,需要程序提供
不一致类型之间转化:
一共三种情形:
(1)从基本类型到用户自定义类型
int s=600;
//代表秒数
Time t=s;
//代码执行需要首先把s变成Time类型的对象(1,0,0)再赋给Time类的对象t
(2)从类类型到基本类型
Time t=(1,0,0);
int s=int t;
//要求将时间变量t转化成秒数在赋给整形变量t
(3)从某个用户自定义类型到另一个用户自定义类型
Point p(1,2);
Complex c;
c=p;
//要求把Point对象转化为Complex对象再赋给Complex独享c
类型转换方式:隐式类型转换和显示类型转换
(1)隐式:
Time t=s;
(2)显式:
int s=(int) t;
转换方法:
转换构造函数能够实现从基本类型向自定义类型的转换
Time t=s;
类型转换函数能够把源类型转换成另一种目标类型
int s=(int)t;
目标类型可以是自定义类型也可以是系统预定义类型
转换构造函数
含有一个参数的构造函数,且该参数是不同于该类的一个数据类型
自动调用:
1.如果声明类对象的初始化表同转换构造函数的参数表相匹配,该函数就会被调用
2.当在需要该类的地方使用了别的数据类型,编译器就会自动调用转换构造函数进行转换
转换构造函数要点:
1.类名和类同名
2.含有一个不同于自身类型的参数
3.由于是构造函数也不需要返回类型,函数体中也不需要写return语句
// prgTransConstructor.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
class Time
{
private:
int hour, minute, second;
public:
inline Time();
inline Time(int h, int m, int s);
Time(int s);
friend ostream& operator<< (ostream& out, Time t);
};
inline Time::Time():hour(0), minute(0), second(0)
{ }
inline Time::Time(int h, int m, int s) :hour(h), minute(m), second(s)
{ }
Time::Time(int s)
{
hour=s / 3600;
minute = s % 3600 / 60;
second = s % 60;
}
//---转换构造函数的定义----
/*
inline Time::Time(int n)
{
hour = n / 3600;
second = n % 60;
minute = n % 3600 / 60;
}
*/
ostream& operator<<(ostream& out, Time t)
{
out <<"Time:"<< t.hour << ':' << t.minute << ':' << t.second << endl;
return out;
}
int main()
{
Time t1(9, 30, 30), t2;
cout << t1 << t2;
cout << "----测试转换构造函数----" << endl;
int s = 3600;
t2 =Time(s);//需要程序提供类型转换函数
cout << t2;
return 0;
}
类型转换函数实现类型转换
通过类型转换函数可以将类类型自动转化为内置类型或其他类型或类型转换函数必须定义为类的成员函数
类型转换函数格式:
operator 类型名() const
{
…
return(结果类型表达式)
}
注意:
1.函数头没有类型声明
2.函数没有参数,对象自己就是函数要处理的数据
3.函数体中含有return语句
4.const就对对象自身的保护