6.5 类型转换

 

6.5 类型转换

类型转换是将一种数据类型的值转换为另一种数据类型的值。类型转换分为自动隐式转换和强制转换两种类型。

6.5.1 类型的自动隐式转换

C++ 语言编译系统提供了内部数据类型的自动隐式转换规则:

1. 算术运算中的转换

在算术运算中,低类型可以自动转换为高类型。例如:

double a;
a = 3.9 * 4;

在这个例子中,整型数 4 自动转换为浮点数,与浮点数 3.9 相乘,结果为浮点数,并赋值给 a

2. 赋值表达式中的转换

在赋值表达式中,右边表达式的值自动转换为左边变量的类型。例如:

long var;
var = 10;

整型数 10 自动转换为长整型,并赋值给 var

3. 函数调用时的转换

在函数调用时,实参值会自动转换为形参的类型。例如:

double f1(double d);
double f;
f = f1(10);

函数 f1 需要一个 double 型参数,而实参是整型数 10,系统会自动将 10 转换为 double 型并传递给 f1

4. 函数返回值的转换

当函数有返回值时,系统会自动将返回表达式的类型转换为函数的返回类型。例如:

double f1(float d) {
    float m;
    m = d * 2;
    return m;
}

在这个例子中,mfloat 型,但函数返回类型是 double,因此 m 会自动转换为 double 并返回。

示例代码

#include <iostream>
using namespace std;

int main() {
    double a;
    a = 3.9 * 4;
    cout << "a = " << a << endl;

    long var;
    var = 10;
    cout << "var = " << var << endl;

    double f1(double d);
    double f;
    f = f1(10);
    cout << "f = " << f << endl;

    return 0;
}

double f1(double d) {
    return d;
}

6.5.2 构造函数具有类型转换功能

当类定义中提供了单个参数的构造函数时,该类可以将某种数据类型的值转换为该类的对象。

示例

#include <iostream>
using namespace std;

class A {
public:
    A() : m(0) {}
    A(double i) : m(i) {}
    void print() {
        cout << m << endl;
    }
private:
    double m;
};

int main() {
    A a(5);
    a = 10;
    a.print();
    return 0;
}

在这个例子中,有一个单参数构造函数 A(double i),它可以将 double 型值转换为 A 类对象。因此,赋值语句 a = 10 能顺利通过编译并运行。

6.5.3 类型转换函数

类型转换函数是类中的非静态成员函数,用于将类的对象转换为其他类型的值。其定义格式如下:

class 类名 {
public:
    operator 目标类型();
};

示例

#include <iostream>
using namespace std;

class Rational {
public:
    Rational(int d, int n) : den(d), num(n) {}
    operator double() {
        return double(den) / double(num);
    }
private:
    int den, num;
};

int main() {
    Rational r(5, 8);
    double d = 4.7;
    d += r;
    cout << d << endl;
    return 0;
}

在这个例子中,类型转换函数 operator double()Rational 对象转换为 double 型,因此可以进行 d += r 操作。

类型转换函数注意事项

  1. 类型转换函数必须是非静态成员函数。
  2. 类型转换函数不能有返回值。
  3. 类型转换函数不带任何参数。
  4. 类型转换函数不能定义为友元函数。

通过这些示例,我们可以看到类型转换在 C++ 中的多种应用及其实现方法。了解并正确使用这些转换,可以提高程序的灵活性和可读性。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值