自定义类型转换

自定义类之间的类型转换是通过构建构造函数的多态来进行的

 在对象刚刚定义时, 即使你使用的是赋值操作符=, 也是会调用构造函数, 而不是重载的operator=运算符.

1.用类型转换构造函数进行类型转换实现其它类型本类类型的转化。
转换构造函数格式
class 目标类
{
  目标类(const 源类 & 源类对象引用)
  {
    根据需求完成从源类型到目标类型的转换
  }
}
特点:
转换构造函数,本质是一个构造函数。是只有一个参数的构造函数。如有多个参数,只能称为构造函数,而不是转换函数。

同时为了能够调用源类中的对象,需要设置这一构造函数为源类的友元

 

explicit是防止隐式类型转换的关键字 

 
  1. 指定构造函数或转换函数 (C++11起)为显式, 即它不能用于隐式转换复制初始化.
  2. explicit 指定符可以与常量表达式一同使用. 函数若且唯若该常量表达式求值为 true 才为显式. (C++20起)

因为构造函数被explicit修饰后, 就不能再被隐式调用了。也就是displayPoint(1)这种操作不能直接进行,需要Point3D p3a = static_cast<Point3D> (p2); 或者displayPoint(Point(1))这样的强制类型转换

2.用类型转换操作符函数进行转换
类型转化函数格式
class 源类{
  operator 转化目标类(void)
  {
    根据需求完成从源类型到目标类型的转换
  }
}

 

这样可以不用使用友元

 小结
1,只有一个参数的类构造函数,可将参数类型转化为类类型。例如,将int 类型的变量赋给obj类型的对象。在构造函数中声明为explicit可以防止隐式转换,只允许显式转换
2,称为转换函数的特殊类成员运算符函数,用于将类对象转换为其他类型。转换函数为类成员函数。没有返回,没有参数。形如: operatortypename(); typename是对象将被换成的类型。将类对象赋给typname变量时或将其强制转换为typename类型是,自动被调用。
3,应用于构造及初始化,赋值,传参,返回等场合。

 

注意:

隐式转换的规则就是根据数据类型从小到大的转换:byte→short→int→long(整数类型)

从子类到父类是显示的类型转换,因为数据类型从大到小的转换

posted @   纸包鱼  阅读(105)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示