自定义类型转换
自定义类之间的类型转换是通过构建构造函数的多态来进行的
在对象刚刚定义时, 即使你使用的是赋值操作符=
, 也是会调用构造函数, 而不是重载的operator=
运算符.
1.用类型转换构造函数进行类型转换实现其它类型到本类类型的转化。
转换构造函数格式
class 目标类
{
目标类(const 源类 & 源类对象引用)
{
根据需求完成从源类型到目标类型的转换
}
}
特点:
转换构造函数,本质是一个构造函数。是只有一个参数的构造函数。如有多个参数,只能称为构造函数,而不是转换函数。
同时为了能够调用源类中的对象,需要设置这一构造函数为源类的友元
explicit是防止隐式类型转换的关键字
- 指定构造函数或转换函数 (C++11起)为显式, 即它不能用于隐式转换和复制初始化.
- 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(整数类型)
从子类到父类是显示的类型转换,因为数据类型从大到小的转换
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探