C++primer11

重载限制

  1. 重载后的运算符必须只有有一个操作数是用户定义的类型
  2. 使用运算符是不能违反运算符原来的句法规则
  3. 不能创建新元素安抚
  4. 不能重载下面的运算符
    • sizeof :sizeof运算符
    • .:成员运算符
    • *:成员指针运算符
    • :: :作用域解析运算符
    • ? : 条件运算符
    • typeid : 一个RTTI运算符
    • const_cast :强制类型转换运算符
    • dynamic_cast :强制类型转换运算符
    • reinterpret_cast :强制类型转换运算符
    • static_cast ::强制类型转换运算符

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

只接受一个参数(接受多个参数,但其他参数都有初始化,只有一个参数没有初始化)的构造函数定义了从参数类型到类型的转换,如果使用关键字explicit限定了这种构造函数,则他只能用于显示转换,否则也可以用于隐式转换。

class Stone{
    private:
        enum{per_stn = 14};
        int stone;
        double pounds;
    public:
        Stone(doule lbs);
        Stone(int stn,double lbs);
        Stone();
        ~Stone();
}

在类Stone中,下面的构造函数用于将double类型的值转换为Stone类型

Stone(doule lbs);

也就是说,可以编写下面的代码

Stone temp;
temp = 12.4; 

而构造函数Stone(int stn,double lbs);有两个参数,不能用来转换。
但是,如果给第二个参数提供默认值Stone(int stn,double lbs = 0);,它便可用于转化int

C++新增加了关键字explicit,用于关闭上述自动转化特性。也就是说,可以这样声明构造函数:

explicit Stone(doule lbs);

这将关闭上述示例中介绍的隐式转换,但任然允许显示转换,即显示强制类型转换:

Stone temp;
temp = 12.4; //不可行
temp = Stone(12.4); //OK
temp = (Stone) 12.4;//OK 

装换函数

上面的例子显示将数字转化为Stone类类型,C++提供特殊的运算符函数——转化函数,来实现相反的转化。

要转换为typename类型,需要使用这种形式的转换函数:

operator typename();

注意事项:

  • 转换函数必须是类方法;
  • 转换函数不能指定返回类型;
  • 转换函数不能有参数;

例如,转换为double类型的函数原型如下:

operator double();

转换函数的定义:

Stone:: operator double(){
    return pounds;
} 

typename(这里为double)指出了要转换成的类型,因此不需要指定返回类型,转换函数是类方法,意味着:它需要通过类对象来调用,从而告知函数要转换的值。因此,函数不需要参数。

转换函数是用户自定义的强制类型转换,可以向使用强制类型转换那样使用它们。例如,如果定义了从Stonedouble的转换函数,就可以使用下面的转换:

Stone temp(23.34);
double host = double(temp);//OK
double my = (double)temp;//OK

也可以让编译器来决定如何做:

Stone temp(23,3);
double host = temp;//OK  隐式使用转换函数

在类中,如果声明了多个转换函数(2个及2个以上),使用隐式转换时,编译器会产生二义性,所以必须使用显示(强制)转换;当如果只有声明一个转换函数时,可以使用隐式转换,且不存在二义性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值