当前位置: 首页 > article >正文

C++中使用构造函数进行类型转换

C++中使用构造函数进行类型转换

可给类提供重载的构造函数,即接受一个或多个参数的构造函数。这种构造函数常用于进行类型转换。请看下面的 Human 类,它包含一个将整数作为参数的重构构造函数:

class Human
{
    int age;
    public:
    Human(int humansAge): age(humansAge) {}
};

// Function that takes a Human as a parameter
void DoSomething(Human person)
{
    cout << "Human sent did something" << endl;
    return;
}

这个构造函数让您能够执行下面的转换:

Human kid(10); // convert integer in to a Human
DoSomething(kid);

这样的转换构造函数让您能够执行隐式转换:

Human anotherKid = 11; // int converted to Human
DoSomething(10); // 10 converted to Human!

函数 DoSothing(Human person)被声明为接受一个 Human(而不是 int)参数!前面的代码为何可行呢?这是因为编译器知道 Human 类包含一个将整数作为参数的构造函数, 进而替您执行了隐式转换:将您提供的整数作为参数发送给这个构造函数,从而创建一个 Human 对象。
为避免隐式转换,可在声明构造函数时使用关键字 explicit:

class Human
{
    int age;
    public:
    explicit Human(int humansAge): age(humansAge) {}
};

并非必须使用关键字 explicit,但在很多情况下,这都是一种良好的编程实践。以下示例程序演示了另一个版本的 Human 类,这个版本不允许隐式转换:

#include<iostream>
using namespace std;

class Human
{
    int age;
public:
    // explicit constructor blocks implicit conversions
    explicit Human(int humansAge) : age(humansAge) {}
};

void DoSomething(Human person)
{
    cout << "Human sent did something" << endl;
    return;
}

int main()
{
    Human kid(10);    // explicit converion is OK
    Human anotherKid = Human(11); // explicit, OK
    DoSomething(kid); // OK

    // Human anotherKid = 11; // failure: implicit conversion not OK
    // DoSomething(10); // implicit conversion 

    return 0;
}

输出:

Human sent did something

分析:
无输出的代码行与提供输出的代码行一样重要。这个 Human 类包含一个使用关键字 explicit 声明的构造函数,如第 8 行所示,而第 17~27 行的 main()以各种不同的方式实例化这个类。使用 int 来实例化 Human 类的代码行执行的是显式转换,都能通过编译。第 23 和 24 行涉及隐式转换,它们被注释掉了,但如果将第 8 行的关键字 explicit 删掉,这些代码行也能通过编译。这个实例表明,使用关键字
explicit 可禁止隐式转换。

提示:

运算符也存在隐式转换的问题,也可在运算符中使用关键字 explicit 来禁止隐式转换。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程


http://www.kler.cn/a/135415.html

相关文章:

  • JVM详解:JVM的系统架构
  • JS 实现SSE通讯和了解SSE通讯
  • Flutter Getx状态管理
  • 使用 Visual Studio Installer 彻底卸载 Visual Studio方法与下载
  • TensorRT基础知识
  • 【小程序】封装网络请求request模块
  • C++——模板
  • Java中异常的捕获与处理
  • 你听说过“消费多少返利多少的”模式吗?
  • 基于Vue+SpringBoot的医院门诊预约挂号系统 开源项目
  • 【C/PTA】函数专项练习(二)
  • C语言幂级数求近似值
  • JC/T 2339-2015 地暖用相变储能材料及构件检测
  • 游戏报错d3dcompiler_47.dll缺失怎么修复,总结多种修复方法
  • Linux文件目录以及文件类型
  • Iceberg学习笔记(1)—— 基础知识
  • Linux:zip包的压缩与解压
  • C#开发的OpenRA游戏之属性QuantizeFacingsFromSequence(7)
  • 测试用例的设计方法(全):正交实验设计方法|功能图分析方法|场景设计方发
  • 代码随想录 11.16 || 动态规划 LeetCode 583.两个字符串的删除操作、72.编辑距离
  • 网工内推 | 国企、港企网工,年底双薪,NA以上认证即可
  • CentOS 安装etcd集群 —— 筑梦之路
  • SpringCloud -Token传递之Feign
  • 【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)
  • 趣学python编程 (四、数据结构和算法介绍)
  • 【10套模拟】【7】