目录
一、类型转换
二、转换函数
一、类型转换
C++⽀持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数
class Test
{
public:Test(int n1 = 0):num1(n1){}void print(){cout << num1 << endl;}
private:int num1;
};
int main()
{Test t1(100);t1.print();//C++⽀持内置类型隐式类型转换为类类型对象Test t2 = 100;t2.print();return 0;
}
结果:
程序将使用构造函数【Test ( int n1 )】 来创建一个临时的【Test】对象,,并将【100】作为初始值。随后在使用默认的拷贝构造函数将内容拷贝到【t2】中。这一过程称为隐式类型转换
一个参数就要有一个参数的构造函数, 二个参数就要有二个参数的构造函数
示例:
class Test
{
public:Test(int n1 = 0, int n2 = 0):num1(n1),num2(n2){}void print(){cout << num1 << " " << num2 << endl;}
private:int num1;int num2;
};
int main()
{Test t1(100, 200);t1.print();//C++⽀持内置类型隐式类型转换为类类型对象Test t2 = { 100,200 };t2.print();return 0;
}
将构造函数用于类型转换似乎是一项不错的特性,但是这种特性并非总是合乎需要,因此这总有可能导致意外发生
C++新增了一个关键字【explicit】,用于关闭将构造函数用于类型转换
示例:
class Test
{
public://explicit用于关闭将构造函数用于类型转换explicit Test(int n1 = 0):num1(n1){}
private:int num1;
};
Test t = 100;
会报错 :
如果使用了【explicit】限定了构造函数,规定它不可以用于隐式转换,但是它可以用于显示转换
示例:
class Test
{
public://explicit用于关闭将构造函数用于类型转换explicit Test(int n1 = 0):num1(n1){}void print(){cout << num1 << endl;}
private:int num1;
};
int main()
{//explicit限定了构造函数,规定它不可以用于隐式转换,但是它可以用于显示转换 Test t = (Test)100;t.print();return 0;
}
结果:
二、转换函数
既然内置类型可以转换为自定义类型,那么自定义类型可以转换为内置类型吗?
自定义类型是可以转换为内置类型,但是不是使用构造函数。要进行自定义类型转换为内置类型,必须要使用特殊的C++运算符函数——转换函数
示例:
class Test
{
public:Test(int n1 = 0):num1(n1){}//转换函数operator int() const{return num1;}
private:int num1;
};
int main()
{Test t1 = 100;int num = t1;cout << num << endl;return 0;
}
结果:
转换函数的特点
- 转换函数必须是类方法
- 转换函数不能指定返回值
- 转换函数不能有参数
转换函数的形式
operator typename ( );
【typename】指出了要转换的类型,因此不需要指定返回值类型。转换函数是类方法意味着:它需要通过类对象来调用,从而告知函数要转换的值。因此函数不需要参数