类的自动类型转换和强制类型转换

  例子:

#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,如果转换函数前使用了explicitC++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;虽然转换函数不声明返回类型,但应该返回所需要类型值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值