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

这篇具有很好参考价值的文章主要介绍了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++后台高级服务器课程文章来源地址https://www.toymoban.com/news/detail-758286.html

到了这里,关于C++中使用构造函数进行类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《More Effective C++》《基础议题——2、尽量使用C++类型的风格转换》

    类型转换是一般程序员所不能忍受的,但是在紧要关头,类型转换是必须的。C风格的类型转换太过简单,粗暴,不能进行精确的类型转换;为了弥补C转换上功能的不足,C++提供了四种常用的类型转换来应付复杂的转换需求。 static_cast用于在编译时执行类型转换,主要用于相

    2024年01月18日
    浏览(41)
  • C++ 学习 ::【基础篇:16】:C++ 类的基本成员函数:拷贝构造函数(认识、特征、注意点及典型使用场景)及其基本写法与调用

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段: 基础篇、STL 篇、高阶数据结构与算法篇 ,相关重点内容如下: 基础篇 : 类与对象 (涉及C++的三大特性等); STL 篇 : 学习使用 C++ 提供的 STL 相关库 ; 高阶数据结构与算

    2024年02月08日
    浏览(47)
  • c++ 学习 之 构造函数的分类和调用类型 深入学习

    构造函数是在C++中用于创建和初始化对象的特殊函数。构造函数可以根据不同的特性和参数进行分类,以下是一些常见的构造函数分类和详细讲解它们的调用方式: 默认构造函数: 默认构造函数是一个特殊的构造函数,它没有参数,也可以没有具体的实现代码。如果没有显

    2024年02月10日
    浏览(41)
  • C++ operator关键字的使用(重载运算符、仿函数、类型转换操作符)

    C++ operator的使用(重载运算符、仿函数、类型转换操作符) C++11实用技术(一)auto与decltype的使用 C++11实用技术(二)std::function和bind绑定器 C++11实用技术(三)std::future、std::promise、std::packaged_task、async C++11 中,operator 是一个,用于重载运算符。通过重载运算符

    2024年02月14日
    浏览(47)
  • C++中的类型转换函数

    在C++编程中,我们经常需要在不同的数据类型之间进行转换。C++提供了一种特殊的成员函数,叫做类型转换函数,可以让我们自定义类型之间的转换规则。在本文中,我们将详细介绍类型转换函数的定义、使用和注意事项。 类型转换函数是C++中的一个特性,它允许将当前类的

    2024年02月19日
    浏览(33)
  • 【零基础学习C++】构造函数与析构函数

    个人主页:【😊个人主页】 系列专栏:【❤️系列专栏】 期末复习笔记,感兴趣的可以收藏 C++用以初始化对象的数据成员的函数 构造函数要注意的知识点: 构造函数是没有返回值类型的。 构造函数的函数名必须 与类名一致。 构造函数并不是由我们手动调用的, 构造函数

    2024年02月11日
    浏览(46)
  • 【C++航海王:追寻罗杰的编程之路】C++的类型转换

    目录 1 - C语言中的类型转换 2 - 为什么C++需要四种类型转换 3 - C++强制类型转换 3.1 - static_cast 3.2 - reinterpret_cast 3.3 - const_cast 3.4 - dynamic_cast 4 - RTTI 在C语言中,如果 赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需

    2024年04月13日
    浏览(36)
  • 【C++】dynamic_cast 进行类型转换步骤以及底层实现

    dynamic_cast 是 C++ 中的一种类型转换方式,它可以在运行时进行类型检查, 用于将一个指针或引用强制转换为另一个类型的指针或引用 。dynamic_cast 能够进行安全的向下转型,即将一个基类指针或引用转换为派生类指针或引用。如果转换成功,dynamic_cast 返回转换后的指针或引用

    2023年04月25日
    浏览(47)
  • c++ 学习之 构造函数的使用

    在上面的代码中,定义了一个名为person的类,并实现了默认构造函数、有参构造函数、拷贝构造函数以及析构函数。然后,使用不同的方式调用了拷贝构造函数,让我们逐步解释拷贝构造函数的作用和调用时机: 这里拷贝构造函数的作用是将已经存在的对象(p1)的属性值复

    2024年02月10日
    浏览(33)
  • 【Kotlin】类的继承 ② ( 使用 is 运算符进行类型检测 | 使用 as 运算符进行类型转换 | 智能类型转换 | Any 超类 )

    在 Kotlin 中 , 如果不确定一个 实例对象的类型 , 可以 使用 is 运算符进行判定 , 使用方法 上述用法可以判定 实例对象 是否是 判定类型 , 如果是 返回 true , 反之 返回 false ; 代码示例 : 在下面的代码中 , 调用 student is Person 判断 student 对象是否是 Person 类型 ; 执行结果 : 将 子类

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包