首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C++ Practical-2 day3 运算符重载之强制转换

  • 25-02-19 07:41
  • 2389
  • 7710
blog.csdn.net

系列文章目录

点击直达——文章总目录


文章目录

  • 系列文章目录
  • C++ Practical-2 day3 运算符重载之强制转换
    • Overview
    • 1.运算符重载之强制转换
      • 1.1.类型转换运算符
        • 1.1.1.语法
        • 1.1.2.示例
      • 1.2.转换构造函数
        • 1.2.1.语法
        • 1.2.2.示例
      • 1.3.注意事项
    • 关于作者


C++ Practical-2 day3 运算符重载之强制转换

Overview

  • C++不练习coding,就相当于空中楼阁,基础不扎实
  • 光吃不干,等于没吃

1.运算符重载之强制转换

在C++中,运算符重载允许你定义或修改大多数运算符的行为,以适应你自己的类。对于强制类型转换,C++提供了两种方式:类型转换运算符和转换构造函数。

1.1.类型转换运算符

类型转换运算符允许你定义一个运算符,使得你的类的对象可以自动转换为特定的类型。这通常是通过重载 operator 关键字实现的。

1.1.1.语法
operator TypeName() const {
    // 转换逻辑
}
  • 1
  • 2
  • 3
1.1.2.示例

假设你有一个类 Distance,你想让它可以自动转换为 double 类型,表示距离的数值。

class Distance {
private:
    double meters;

public:
    Distance(double m) : meters(m) {}

    // 重载类型转换运算符为double
    operator double() const {
        return meters;
    }
};

int main() {
    Distance d(10.5);
    double length = d;  // 自动调用operator double()
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

1.2.转换构造函数

转换构造函数是一种特殊的构造函数,它允许对象在需要时自动转换为另一种类型。它通常用于类之间的隐式转换。

1.2.1.语法
class_name(Type type);
  • 1
1.2.2.示例

继续使用上面的 Distance 类,我们可以定义一个转换构造函数,允许从 double 类型隐式转换为 Distance 对象。

class Distance {
private:
    double meters;

public:
    Distance(double m) : meters(m) {
    }

    // 方法一:转换构造函数
    // Distance(const double &m) : meters(m) {
    // }

    // 方法二:重载类型转换运算符为double
    operator double() const {
        return meters;
    }
    // 方法一,方法二会冲突,注释其中一个即可
};

int main() {
    Distance d(10.5);
    double   length = d;    // 自动调用operator double()
    Distance d2     = 20.0; // 自动调用转换构造函数
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

问题解释

当您尝试使用 Distance d2 = 20.0; 时,编译器发现两个构造函数都可以用来从 double 类型的参数构造 Distance 对象:

  1. Distance(double m):直接接受 double 参数。
  2. Distance(const double &m):接受 double 的引用。
    由于这两个构造函数在功能上是相同的,编译器无法决定使用哪一个,因此报错。

解决方案

您应该只保留一个构造函数,通常,转换构造函数应该接受一个引用参数,以避免不必要的复制,但在这个特定情况下,由于您已经有了一个接受 double 参数的构造函数,转换构造函数是多余的。

1.3.注意事项

  1. 隐式转换:类型转换运算符默认是隐式的,这意味着它们可以在没有显式转换的情况下被调用。如果你不希望这样,可以在运算符前面加上 explicit 关键字,使其变为显式转换。
  2. 使用场景:类型转换运算符应该谨慎使用,因为它们可能会导致代码难以理解和维护。通常,只有当你的类确实需要与内置类型无缝交互时,才使用类型转换运算符。
  3. 性能:类型转换可能会影响性能,特别是在频繁调用的情况下。

通过这些方法,你可以为你的类定义合适的类型转换行为,使其更加灵活和强大。


关于作者

  • 微信公众号:WeSiGJ
  • GitHub:https://github.com/wesigj/cplusplusboys
  • CSDN:https://blog.csdn.net/wesigj
  • 微博:
  • -版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
WeSiGJ
微信公众号
共同分享,共同交流, 共同学习!
注:本文转载自blog.csdn.net的WeSiGJ的文章"https://blog.csdn.net/wesigj/article/details/142603038"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top