自定义类之间的类型转换是通过构建构造函数的多态来进行的
在对象刚刚定义时, 即使你使用的是赋值操作符=
, 也是会调用构造函数, 而不是重载的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(整数类型)
从子类到父类是显示的类型转换,因为数据类型从大到小的转换
原文链接: https://www.cnblogs.com/uestc-du/p/17065289.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/313672
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!