【C++】转换构造函数和类型转换函数

这一块知识点在学习C++时没有深入了解,在查看opencv基本数据结构定义的源码中看到了,记录一下该知识点。

转换构造函数:预定义类型转换成类类型

一般形式

class C {
public:
        double real;
        double imag;
        C() {}
        C(double i, double r) { real = i; imag = r; }
        C(double r) {
            real = r; imag = 0;
        }//转换构造函数
        C operator +(C &c1)
        {
            C tem;
            tem.real = c1.real + this->real;
            tem.imag = c1.imag + this->imag;
            return tem;
        }
        /*friend C operator +(C &c1, C&c2)
        {
            C tem;
            tem.real = c1.real + c2.real;
            tem.imag = c1.imag + c2.imag;
            return tem;
        }*/
};
int main()
{
    C c1(1.1, 2.2);
    C c2;
    C c3;
    //不同调用转换构造函数的方式
    c2= C(2.3) + c1;//C(2.3)调用转换构造函数
    c3 = 4;//调用转换构造函数
    // C trans(int a)
    // { return a}
    //  该方式也调用转换构造函数 int->C 

    //b = a + C(2.3);//出错,将+重载函数要为friend
    cout << c1.real << "+" << c1.imag << "i" << endl;
    return 0;
}

凡是需要将系统预定义的数据类型转换为类类型的都要用到转换构造函数。



其中要注意的是在C++的类中,用单个实参来调用的构造函数默认定义了从形参类型到该类类型的一个隐式转换。可以写一个类测试一下 如下。

class A
{
    public:
        int a;
        A(int a) :a(a) {}
        //explicit关键字的可以防止类构造函数的隐式自动转换.

};
int main()
{
    A test;
    test= 3;
    //执行test=3时跳转到A(int a) :a(a) {} ,将3->A类型
    cout << test.a << endl;
}

类型转换函数:类类型转换成其他类型(系统预定义类型)

格式:

operator 目标类型()
{
    return 目标类型的数据;
}

类型转换函数没有返回类型,但是要return 目标类型的数据,没有参数,只能定义为类的成员函数。

用法:

class A
    {
    public:
        int a;
        A() {}
        explicit A(int a) :a(a) {}
        operator int()
        {
            return a;
        }
};
int main()
{
    A test(3);
    //用法1
    int d = test;
    //用法2
    int c = 2 + int(test);

    cout << d << endl;//3
    cout << c << endl;//5
    return 0;
}

总结:
对于转换构造函数和类型转换函数,重点还是分清楚什么时候需要将类类型转换为预定义类型,什么时候将预定义类型转换为类类型,分清楚后再去定义相关函数。同时上述两种转换都可以用以下格式: 类型名(类类型或预定义类型)

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值