C++之类型转换函数

TXP嵌入式
关注

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#

注:

与转换构造函数具有同等的地位

使得编译器有能力将对象转化为其它类型

编译器能够隐式的使用类型转换函数

声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存