这一块知识点在学习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;
}
总结:
对于转换构造函数和类型转换函数,重点还是分清楚什么时候需要将类类型转换为预定义类型,什么时候将预定义类型转换为类类型,分清楚后再去定义相关函数。同时上述两种转换都可以用以下格式: 类型名(类类型或预定义类型)