3、转换构造函数出厂:
我们前面学习过构造函数,构造函数它可以定义不同类型的参数;但是我们今天这里所说的转换构造函数的定义时这样的:
有且仅有一个参数
参数是基本类型
参数是其它类型
接着我们对上面的普通数据类型转换类类型的代码进行分析:
#include <iostream>
#include <string>
class Test{
public:
Test()
{
}
Test(int i)
{
}
};
int main()
{
Test t;
t =6; //从 C 语言角度,这里将 5 强制类型转换到 Test 类型,只不过编译器 在这里做了隐式类型转换
return 0;
}
分析:
上面的Test(int i )就是一个转换构造函数,所以我们上面的这句隐式转换语句:
t =6
这里其实发生了我们刚才说的利用了转换构造函数,把6转换成Test(6),而这样写就会产生一临时对象,所以就可以进行赋值了;但是在现在的技术发展中,肯定是不希望出现这种要人去防止这隐式转换,所以在c++中有了新技术来防止出现隐式转换:
工程中通过explicit关键字杜绝编译器的转换尝试
转换构造函数被explicit修饰只能进行显示转换(也就是强制类型转换)
代码实践一:
#include <iostream>
#include <string>
class Test{
public:
Test()
{
}
explicit Test(int i)
{
}
};
int main()
{
Test t;
t =6;
return 0;
}
输出结果:
root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:21:8: error: no match for ‘operator=’ (operand types are ‘Test’ and ‘int’)
t =6;
^
test.cpp:21:8: note: candidate is:
test.cpp:4:7: note: Test& Test::operator=(const Test&)
class Test{
^
test.cpp:4:7: note: no known conversion for argument 1 from ‘int’ to ‘const Test&’
注解:这里显示不能这样转换
代码实践二(进行显示转换):
#include <iostream>
#include <string>
class Test{
public:
Test()
{
}
explicit Test(int i)
{
}
};
int main()
{
Test t;
t =static_cast<Test>(6);
return 0;
}
输出结果(编译通过):
root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp#
4、小结:
转换构造函数只有一个参数
转换构造函数的参数类型是其它类型
转换构造函数在类型转换时被调用
隐式类型转换是工程中bug的重要来源
explicit关键字用于杜绝隐式类型转换
二、类型转换函数:
1、类类型转换普通类型:
在我们上面通过代码测试发现不行,那么是真的不行吗,事实是可以进行转换的,不过要用到我们现在c++里面的类型转换函数(它用于将类对象转换为其它类型),类型转换的语法如下:
operator Type()
{
Type ret;
return ret;
}
代码实践:
#include <iostream>
#include <string>
class Test{
public:
Test()
{
}
operator int()
{
}
};
int main()
{
Test t;
int i =t;
return 0;
}
输出结果(编译没有报错):
root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp#
注:
与转换构造函数具有同等的地位
使得编译器有能力将对象转化为其它类型
编译器能够隐式的使用类型转换函数