服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++图文并茂讲解类型转换函数

C++图文并茂讲解类型转换函数

2022-12-13 14:15清风自在 流水潺潺 C/C++

类型转换(type cast),是高级语言的一个基本语法。它被实现为一个特殊的运算符,以小括号内加上类型名来表示,接下来让我们一起来详细了解

一、类型转换函数(上)

1.再论类型转换

标准数据类型之间会进行隐式的类型安全转换

转换规则如下:

C++图文并茂讲解类型转换函数

下面来看一个有趣的隐式类型转换:

#include <iostream>
#include <string>
using namespace std;
int main()
{   
  short s = 'a';
  unsigned int ui = 1000;
  int i = -2000;
  double d = i;
  cout << "d = " << d << endl;
  cout << "ui = " << ui << endl;
  cout << "ui + i = " << ui + i << endl;
  if( (ui + i) > 0 )
  {
      cout << "Positive" << endl;
  }
  else
  {
      cout << "Negative" << endl;
  }
  cout << "sizeof(s + 'b') = " << sizeof(s + 'b') << endl;
  return 0;
}

输出结果如下:

C++图文并茂讲解类型转换函数

ui 为 unsigned int 类型,i 为 int 类型,将两者进行相加编译器会进行隐式的类型转换,全部变成unsigned int 类型,所以最后的运行结果是正数。

s 和 'b 编译器都被编译器转换成 int 类型,因为 int 类型的运算是最高效的。

2.问题

普通类型与类类型之间能否进行类型转换?类类型之间能否进行类型转换?

3.再论构造函数

构造函数可以定义不同类型的参数

参数满足下列条件时称为转换构造函数

  • 有且仅有一个参数
  • 参数是基本类型
  • 参数是其它类类型

4.另一个视角

旧式的 C 方式强制类型转换

C++图文并茂讲解类型转换函数

5.编译器的行为

编译器会尽力尝试让源码通过编译

C++图文并茂讲解类型转换函数

编译器尽力尝试的结果是隐式类型转换

隐式类型转换

会让程序以意想不到的方式进行工作

是工程中 bug 的重要来源

工程中通过 explicit 关键字杜绝编译器的转换尝试

转换构造函数被 explicit 修饰时只能进行显示转换

转换方式

C++图文并茂讲解类型转换函数

下面来看一个普通类型向类类型的转换:

#include <iostream>
#include <string>
using namespace std;
class Test
{
  int mValue;
public:
  Test()
  {
      mValue = 0;
  }
  explicit Test(int i)
  {
      mValue = i;
  }
  Test operator + (const Test& p)
  {
      Test ret(mValue + p.mValue);
      return ret;
  }
  int value()
  {
      return mValue;
  }
};
int main()
{   
  Test t;
  t = static_cast<Test>(5);    // t = Test(5);
  Test r;
  r = t + static_cast<Test>(10);   // r = t + Test(10);
  cout << r.value() << endl;
  return 0;
}

输出结果如下:

C++图文并茂讲解类型转换函数

6.小结(上)

  • 转换构造函数只有一个参数
  • 转换构造函数的参数类型是其它类型
  • 转换构造函数在类型转换时被调用
  • 隐式类型转换是工程中 bug 的重要来源
  • explicit关键字用于杜绝隐式类型转换

 

二、类型转换函数(下)

1.类型转换

类类型是否能够类型转换到普通类型?

C++ 类中可以定义类型转换函数

类型转换函数用于将类对象转换为其它类型

语法规则:

C++图文并茂讲解类型转换函数

下面来看一个类型转换函数:

#include <iostream>
#include <string>
using namespace std;
class Test
{
  int mValue;
public:
  Test(int i = 0)
  {
      mValue = i;
  }
  int value()
  {
      return mValue;
  }
  operator int ()
  {
      return mValue;
  }
};
int main()
{   
  Test t(100);
  int i = t;
  cout << "t.value() = " << t.value() << endl;
  cout << "i = " << i << endl;
  return 0;
}

C++图文并茂讲解类型转换函数

int i = t; 等价于int i = t.operator int ();

类型转换函数

  • 与转换构造函数具有同等的地位
  • 使得编译器有能力将对象转化为其它类型
  • 编译器能够隐式的使用类型转换函数

2.编译器的行为

编译器会尽力尝试让源码通过编译

C++图文并茂讲解类型转换函数

3.注意事项

  • 无法抑制隐式的类型转换函数调用
  • 类型转换函数可能与转换构造函数冲突
  • 工程中以 Type toType() 的公有成员代替类型转换函数

下面看类类型之间的转换:

#include <iostream>
#include <string>
using namespace std;
class Test;
class Value
{
public:
  Value()
  {
  }
  explicit Value(Test& t)
  {
  }
};
class Test
{
  int mValue;
public:
  Test(int i = 0)
  {
      mValue = i;
  }
  int value()
  {
      return mValue;
  }
  Value toValue()
  {
      Value ret;
      cout << "operator Value()" << endl;
      return ret;
  }
};
int main()
{   
  Test t(100);
  Value v = t.toValue();
  return 0;
}

输出结果如下:

C++图文并茂讲解类型转换函数

注意类型转换函数可能与转换构造函数冲突,所以 explicit Value(Test& t) { } 加了一个 explicit,如果不加,编译器可能会报错。

4.小结(下)

  • C++ 类中可以定义类型转换函数
  • 类型转换函数用于将类对象转换为其它类型
  • 类型转换函数与转换构造函数具有同等的地位
  • 工程中以 Type toType() 的公有成员代替类型转换函数

到此这篇关于C++图文并茂讲解类型转换函数的文章就介绍到这了,更多相关C++类型转换函数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43129713/article/details/124551084

延伸 · 阅读

精彩推荐
  • C/C++C/C++中的名字空间与作用域示例详解

    C/C++中的名字空间与作用域示例详解

    这篇文章主要给大家介绍了关于C/C++中名字空间与作用域的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c/c++具有一定的参考学习价值...

    青儿哥哥5152021-06-01
  • C/C++C语言编程简单却重要的数据结构顺序表全面讲解

    C语言编程简单却重要的数据结构顺序表全面讲解

    这篇文章主要为大家介绍了C语言编程中非常简单却又非常重要的数据结构顺序表的全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助...

    高邮吴少5042022-02-13
  • C/C++有关C++中类类型转换操作符总结(必看篇)

    有关C++中类类型转换操作符总结(必看篇)

    下面小编就为大家带来一篇有关C++中类类型转换操作符总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看...

    jingxian8452021-04-27
  • C/C++C语言实现BMP格式图片转化为灰度

    C语言实现BMP格式图片转化为灰度

    这篇文章主要为大家详细介绍了C语言实现BMP格式图片转化为灰度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    爬行的菜鸟8072022-02-15
  • C/C++Cocos2d-x UI开发之CCControlSwitch控件类使用实例

    Cocos2d-x UI开发之CCControlSwitch控件类使用实例

    这篇文章主要介绍了Cocos2d-x UI开发之CCControlSwitch控件类使用实例,本文代码中含大量注释讲解了CCControlSwitch控件类的使用,需要的朋友可以参考下...

    皂荚花7202021-02-01
  • C/C++详解C语言结构体的定义和使用

    详解C语言结构体的定义和使用

    这篇文章主要为大家介绍了C语言结构体的定义和使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...

    女孩脸红了11732022-07-31
  • C/C++C++实现超市商品管理系统最新版

    C++实现超市商品管理系统最新版

    这篇文章主要为大家详细介绍了C++实现超市商品管理系统最新版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    名名名名7762021-11-16
  • C/C++C语言构建连连看游戏(矩阵方式)

    C语言构建连连看游戏(矩阵方式)

    这篇文章主要为大家详细介绍了C语言构建连连看游戏,采用矩阵方式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一...

    晴松-9242021-12-31