侵权投诉
订阅
纠错
加入自媒体

C++之类型转换函数

2020-08-29 16:49
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#

注:

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

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

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

<上一页  1  2  3  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

    电子工程 猎头职位 更多
    扫码关注公众号
    OFweek电子工程网
    获取更多精彩内容
    文章纠错
    x
    *文字标题:
    *纠错内容:
    联系邮箱:
    *验 证 码:

    粤公网安备 44030502002758号