1.对于系统的预定义基本类型数据,C++提供了两种类型转换方式:隐式类型转换和显式类型转换。

 int a=,sum;
double b=5.55;
sum=a+b;//-------(1)
std::cout<<"隐式转换:a+b="<<sum<<std::endl; sum=(int)(a+b);//-------(2)
sum=int(a+b);//-------(3)
std::cout<<"显式转换:a+b="<<sum<<std::endl

上述代码中的(1)就是含有隐式类型转换的表达式,在进行"a+b"时,编译系统先将a的值5转换为双精度double,然后和b相加得到10.55,在向整形变量sum赋值时,将10.55转换为整形数10,赋值为变量sum。这种转换是C++编译系统自动完成,不需要用户去干预。

上例中的(2)和(3)中则涉及到了显式类型转换,它们都是把a+b所得结果的值,强制转化为整形数。其中(2)式是C语言中用到的形式:(类型名)表达式,而(3)式是C++中的采用的形式:类型名(表达式)。

2.对于用户自定义的类类型,C++中提供了2种方法实现它们和其他数据类型之间的转换:

(1)通过转换构造函数进行类型转换;

(2)通过类型转换函数进行类型转换。

转换构造函数就是构造函数的一种,它拥有类型转换的作用。两个复数(sum=complex1+complex2)相加重载操作符“+”即可,对于 sum=complex1+5.5 可以定义一个关于复数加双精度的运算符重载函数,也可以定义一个转换构造函数来实现。

 #include <iostream>

 class Complex //复数类
{
private://私有
double real;//实数
double imag;//虚数
public:
Complex(double real,double imag)
{
this->real=real;
this->imag=imag;
}
Complex(double d=0.0)//转换构造函数
{
real=d;//实数取double类型的值
imag=;//虚数取0
}
Complex operator+(Complex com1);//或friend Complex operator+(Complex com1,Complex com2);
void showComplex();
}; Complex Complex::operator+(Complex com1)
{
return Complex(real+com1.real,imag+com1.imag);
} void Complex::showComplex()
{
std::cout<<real;
if(imag>)
std::cout<<"+";
if(imag!=)
std::cout<<imag<<"i"<<std::endl;
} int main()
{ Complex com(,),sum;
sum = com + 5.5;//5.5调用Complex(5.5)生成临时对象,它的复数是5.5+0i
sum.showComplex();//输出运算结果
return ;
}

结果:15.5 + 10i

上述代码在执行5.5时,调用转换构造函数,将double类型的5.5转换为无名的Complex类的临时对象(5.5+0i),然后执行两个Complex类(复数类)对象相加的运算符重载函数。所以说一般的转换构造函数的定义形式:

类名(待转换类型)

{

函数体;

}

转换构造函数不仅可以将预定义的数据类型转换为自定义类的对象,也可以将其他类的对象转换成转换构造函数所在的类的对象。(使用隐含的this指针)

转换构造函数可以把其他类型转化为自身类的对象,但是却不能把自身类的对象转换为其他类型。比如:不能将Complex类(复数类)的对象转换成double类型数据。

于是在C++中就用类型转换函数实现把自身类的对象转换为其他类型。定义类型转换函数一般形式:

operator 其他类型()

                                        {

                                       ...

                                       return 其他类型的数据;

                                        }

类型转换函数的函数名(operator 目标类型)前不能指定返回类型;

没有参数;

但在函数体最后一条语句一般为return语句,返回的是目标类型的数据。

现在我们对Complex类做类似改造:

 #include <iostream>

 class Complex //复数类
{
private://私有
double real;//实数
double imag;//虚数
public:
Complex(double real,double imag)
{
this->real=real;
this->imag=imag;
}
Complex(double d=0.0)//转换构造函数
{
real=d;//实数取double类型的值
imag=;//虚数取0
}
Complex operator+(Complex com1);//或friend Complex operator+(Complex com1,Complex com2);
void showComplex();
operator double();
}; Complex Complex::operator+(Complex com1)
{
return Complex(real+com1.real,imag+com1.imag);
} void Complex::showComplex()
{
std::cout<<real;
if(imag>)
std::cout<<"+";
if(imag!=)
std::cout<<imag<<"i"<<std::endl;
} Complex::operator double()
{
return real;
} int main()
{
Complex com(,);
double total1,total2;
total1 = double(com) + 5.5;//double(com)把复数(10+10i)转换为双精度数10.0
total2 = 5.5 + com; // 写成 total2 = com + 5.5 是错误的
std::cout<<"把Complex类显式对象转化为double类型与5.5相加为:"<< total1 << std::endl;
std::cout<<"把Complex类对象隐式转化为double类型与5.5相加为:"<< total2 << std::endl;
return ;
}

说明:

total2 = 5.5 + com;  com自动调用转换函数进行转换(如果5.5 改为5,并且还定义有operator long() 类型转换,将出现编译错误,因为int 既可以转换为long ,也可以转换为 double,编译器会报错)。

为什么  total2 = com  + 5.5; 不行呢?

这是会出现歧义:

是com 用转换函数变为double型,进行double定义的加法

还是 5.5 利用转换构造函数变为Complex临时变量,进行 Complex定义的加法,就不清楚了

所以进行显示的转换:

 total = (double)com + 5.5

3.最后对类型转换函数做几点补充:

(1)类型转换函数只能作为类的成员函数,不能定义为类的友元函数;

(2)类型转换函数中必须有return语句,即必须送回目标类型的数据作为函数返回值;

(3)一个类可以定义多个类型转换函数,C++编译器会根据函数名来自动调用相应的类型转换函数函数;

转载自:http://blog.csdn.net/chenyiming_1990/article/details/8862497

转载: C++ 转换构造函数 和 类型转换函数的更多相关文章

  1. [一道搜狗输入法的面试题]C++转换构造函数和类型转换函数

    今天面试遇到一道有关C++转换构造函数的题目,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,学习之路很长啊! 其实我们已 ...

  2. C++语言基础(22)-转换构造函数和类型转换函数

    一.转换构造函数 将其它类型转换为当前类类型需要借助转换构造函数(Conversion constructor).转换构造函数也是一种构造函数,它遵循构造函数的一般规则.转换构造函数只有一个参数. # ...

  3. c++转换构造函数和类型转换函数

    看stl源码时,有一段代码感觉很奇怪 iterator begin() { return (link_type)((*node).next); } iterator和link_type是两种不同类型, ...

  4. C++转换构造函数与类型转换构造函数

    转换构造函数: 转换构造函数的只有一个形参: Student(float s) { score = s; age = ; } 如果已经在上面定义了构造函数: Student(); //建立对象c1,由 ...

  5. C++转换构造函数和隐式转换函数

    今天是第一次听到C++还有个转换构造函数,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服!          其 ...

  6. c++构造函数隐式转换--转换构造函数

    其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.23转 ...

  7. C++解析(20):智能指针与类型转换函数

    0.目录 1.智能指针 2.转换构造函数 3.类型转换函数 4.小结 1.智能指针 内存泄漏(臭名昭著的Bug): 动态申请堆空间,用完后不归还 C++语言中没有垃圾回收机制 指针无法控制所指堆空间的 ...

  8. C++中的类型转换函数

    1,转换构造函数可以将普通的基础类型转换为当前的类类型,也有能力将其它类类 型的对象转换为当前的类类型: 2,问题: 1,类类型是否能够类型转换到普通类型? 1,可以的: 3,类型转换函数: 1,C+ ...

  9. C++转换构造函数和隐式转换函数 ~ 转载

    原文地址: C++转换构造函数和隐式转换函数 用转换构造函数可以将一个指定类型的数据转换为类的对象.但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成doubl ...

随机推荐

  1. PHP之验证码类

    <?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/6/20 * Time: 14:29 */ Class c ...

  2. AreYouBusy

    AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  3. Cow Bowling

    Cow Bowling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15585 Accepted: 10363 Descrip ...

  4. Power Network 分类: POJ 2015-07-29 13:55 3人阅读 评论(0) 收藏

    Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 24867 Accepted: 12958 Descr ...

  5. 选择轮廓(select_shape)

    选择轮廓(select_shape)     Halcon是一款运用广泛的图像识别和处理软件.在肤浅的接触中,它的轮廓选择算子(select_shape)给予我很深的印象.结果是往往几行代码就能够产生 ...

  6. 嵌入式学习_AD学习篇

    AD基础使用: 1.建立一个工作区 (.DsnWrk) workspace 2.建立一个PCB工程(.PrjPCB)  project 3.建立一个PCB原理图文件(理论上告诉你两个点连接起来) 建立 ...

  7. BFC——一个我们容易忽视掉的布局神器

      今天给大家说说BFC这个概念,在说概念前,先给大家看个例子: 首先,定义三个div块元素   效果: 我们发现,块级元素的排列顺序是从上往下,一块接着一块,在w3c中,是这样解释block-lev ...

  8. JavaScript语句

    JavaScript语句 1.JavaScript语句负责向浏览器发出指令,告诉浏览器应该做什么. 2.分号(;): 用于分隔JavaScript语句,通常在每条可执行的语句结尾添加分号,使用分号也可 ...

  9. Python3基础 if-else实例 判断输入的数字是否为8

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  10. 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

    package C; public class Bisai { public static void main(String[] args) { String a="xyz",b= ...