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

本文深入探讨了C++中的类型转换机制,包括非类类型到类类型的转换构造函数及其使用,如何关闭隐式转换,以及如何进行显式强制转换。同时,文章详细介绍了类类型转换为非类类型的转换函数原型,提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、非类类型转换为类类型

1、转换构造函数

接受一个参数的构造函数称之为转换构造函数

2、转换构造函数的形式

1)、只有一个参数的构造函数;
2)、构造函数有多个参数,除了第一个参数外其他参数都有默认值,则该构造函数也是转换构造函数

MyClass(double b); //转换构造函数 形式1
MyClass(double b, int c = 1, float d = 3.6); //转换构造函数 形式2

3、隐式转换

MyClass(double b); //转换构造函数
MyClass obj;
obj = 16.3;

上述代码将使用构造函数创建一个临时的MyClass对象,并将16.3作为初始值,然后采用逐成员赋值方式将该临时对象的内容复制到obj中,这一过程称为隐式转换

4、关闭隐式转换

在构造函数前面加关键字explicit即可禁止隐式转换

explicit MyClass(double b); //关闭隐式转换

5、显式(强制)转换

关闭隐式转换后,仍可进行显式强制转换

explicit MyClass(double b); //关闭隐式转换
MyClass obj;
obj = 16.3; //不允许
obj = MyClass(16.3); //强制转换 形式1
obj = (MyClass)16.3; //强制转换 形式2

二、类类型转换为非类类型

1、转换函数原型

operator typeName();

转换函数说明:
1)、typeName为最终转换后的类型,可以是内置类型、类类型以及由 typedef 定义的类型别名,任何可作为函数返回类型的类型(void 除外)都能够被支持。一般而言,不允许转换为数组或函数类型,转换为指针类型或引用类型是可以的。
2)、转换函数必须是类方法;
3)、转换函数不能指定返回类型;
4)、转换函数不能有参数;
5)、 类型转换函数一般不会更改被转换的对象,所以通常被定义为 const 成员;
6)、类型转换函数可以被继承,可以是虚函数;
7)、 一个类虽然可以有多个类型转换函数(类似于函数重载),但是如果多个类型转换函数要转换的目标类型本身又可以相互转换(类型相近),那么有时候就会产生二义性。

2、使用

#include <iostream>
using namespace std;

class Test
{
private:
    float m_a;
    float m_b;

public:
    Test(float a, float b)
    {
        m_a = a;
        m_b = b;
    }

    operator int() const
    {
        return m_a;
    }
};

int main()
{
    Test t(1.2, 2.3);
    int a = t;
    cout << "a = " << a << endl;

    return 0;
}

运行结果:a = 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值