C++ explicit关键字讲解

C++ explicit关键字讲解

一、explicit关键字的定义

explicit 关键字被设计用来防止由编译器隐式执行的自动类型转换。当我们在类中声明构造函数时使用了关键字 explicit,编译器在初始化时不会自动转换参数类型,需要我们在构造函数中显式的进行转换。该关键字只能用于一个参数的构造函数,当构造函数需要多个参数时,不需要使用这个关键字,因为编译器无法进行多个类型的隐式转换。

例如,假设我们有以下类定义:

class Test{
public:
    Test(int value): num(value) {}
private:
    int num;
};

如果我们在创建这个类的对象时,使用了一个其他类型的值,比如一个字符串类型,会发生以下隐式类型转换:

Test t = "hello";

在上述代码中,虽然我们的构造函数声明中只有一个整型参数,但是编译器会自动将字符串转换为整数类型,然后传递给构造函数进行初始化。这种行为可能会导致我们在编码时出现错误。如果我们想保证类型的安全,应该使用 explicit 关键字将构造函数定义为显式转换构造函数,禁止编译器进行自动类型转换操作。

二、示例说明

接下来我们通过两个示例来说明explicit的使用方法和效果。

示例一

在这个示例中,我们创建了一个名为 Person 的类,其中有名为 Person(const std::string& name) 的构造函数。我们在这个构造函数前加上 explicit 关键字,从而禁止了编译器的隐式类型转换。

#include <iostream>
#include <string>

class Person {
public:
    explicit Person(const std::string& name) :m_Name(name) {}

    std::string getName() const {
        return m_Name;
    }

private:
    std::string m_Name;
};

void printPerson(const Person& person) {
    std::cout << person.getName() << std::endl;
}

int main() {
    // 正确做法:显式的转换类型
    Person person1 = Person(std::string("Mike"));
    printPerson(person1);

    // 错误做法:隐式的转换类型
    Person person2 = "John";
    printPerson(person2); // 编译报错

    return 0;
}

在上述代码中,我们定义了一个名为 Person 的类,这个类有一个名为 getName() 的函数,返回实例的名称。我们在 Person 的构造函数前加上了 explicit 关键字,从而禁止了编译器的隐式类型转换。在主函数中,我们显式地创建了一个 Person 的实例,然后调用 printPerson() 函数输出其名称。然后我们尝试使用隐式类型转换创建了另一个实例,从而使其编译失败。

示例二

在这个示例中,我们创建了一个名为 Book 的类,其中有一个名为 Book(float price) 的构造函数。然后我们定义了一个名为 printPrice() 的函数,用于输出书的价格。在主函数中,我们使用 explicit 关键字将之前的构造函数定义为显式构造函数,从而禁止了编译器的隐式类型转换。

#include <iostream>

class Book {
public:
    explicit Book(float price) :m_Price(price) {}

    float getPrice() const {
        return m_Price;
    }

private:
    float m_Price;
};

void printPrice(const Book& book) {
    std::cout << book.getPrice() << std::endl;
}

int main() {
    Book book1(10.0);
    printPrice(book1);

    Book book2 = Book(15.0);
    printPrice(book2);

    // 错误做法:隐式的转换类型
    //Book book3 = 20.0f;
    //printPrice(book3); // 编译报错

    // 正确做法:显式的转换类型
    Book book4 = Book(20.0f);
    printPrice(book4);

    return 0;
}

在上述代码中,我们定义了一个名为 Book 的类,这个类有一个名为 getPrice() 的函数,返回实例的价格。我们在 Book 的构造函数前加上了 explicit 关键字,从而禁止了编译器的隐式类型转换。在主函数中,我们先分别使用两种方式创建了两个 Book 实例,然后尝试使用隐式类型转换创建了第三个实例,从而使其编译失败。随后我们又使用了显式类型转换创建了第四个实例,从而成功输出了书的价格。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ explicit关键字讲解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • androidstudio中文乱码各种情况的解决办法

    Android Studio中文乱码各种情况的解决办法 问题描述 在使用Android Studio过程中,很多用户可能会遇到中文乱码的问题。这些乱码情况包括但不限于: 项目名称、文件名中文乱码 控制台输出、Logcat中文乱码 编辑器中文乱码 Gradle构建时中文乱码 针对这些情况,本文将介绍多种解决方案,帮助用户快速解决中文乱码问题。 解决方案 方案一…

    其他 2023年3月29日
    00
  • PyGame实现初始化导入所有模块方法详解

    PyGame是一款专门用于开发2D游戏的Python库,使用PyGame可以轻松地创建游戏窗口、处理图像、音频等多种功能。在使用PyGame开发游戏时,我们需要对PyGame进行初始化和导入所有需要的模块。下面是PyGame实现初始化导入所有模块方法的详细攻略。 初始化 PyGame中的初始化是必要的,它为开发者提供了一些必要的游戏环境设置。PyGame提供…

    other 2023年6月20日
    00
  • 初识onselectstart

    当然,我很乐意为您提供有关“初识onselectstart”的完整攻略。以下是详细的步骤和两个示例: 1 初识onselectstart onselectstart是一个HTML事件属性,用于在用户开始选择文本时触发。它可以用于防止用户选择文本或在选择文本时执行其他操作。 2 onselectstart的使用 以下是使用onselectstart的方法: &…

    other 2023年5月6日
    00
  • js如何将字符串数字转换成long

    JS如何将字符串数字转换成long 在 JavaScript 中,由于其中的数值类型都是基于64位的浮点数实现的,因此 JavaScript 中没有长整型。然而,在一些情况下,我们可能需要处理比 JavaScript 的 Number 类型更大的整数,例如处理大数字计算、密码学应用等。在这些情况下,我们需要使用 BigInt 类型。但有时候我们也会遇到需要将…

    其他 2023年3月28日
    00
  • 网络基础-数据包

    网络基础-数据包攻略 什么是数据包? 数据包,也称为网络包或数据帧,是计算机网络中传输数据的一种基本单元。数据包是由数据流封装而成,包含了目标地址、源地址、控制信息和实际数据等信息。 数据包的组成结构 数据包主要由两部分组成:首部和有效载荷。 首部包含了控制信息和地址信息,用于指示数据传输的方向、方式、优先级等信息。 有效载荷则是指实际传输的数据部分,包含了…

    other 2023年6月27日
    00
  • java子类继承父类实例-披萨的选择实现代码

    Java中,子类可以继承父类的实例,也就是说,在子类中可以对父类的实例进行操作或者调用其方法。 以下是披萨选择实现代码的完整攻略: 第一步:创建父类披萨类 首先,我们需要创建一个父类“Pizza”,其中包含两个属性:大小和价格,并在其中定义一个方法“getDescription”返回披萨的描述。代码如下: public class Pizza { Strin…

    other 2023年6月27日
    00
  • Git客户端TortoiseGit(Windows系统)的使用方法

    Git客户端TortoiseGit(Windows系统)的使用方法 简介 TortoiseGit是一个Windows操作系统上的Git客户端工具。它提供了方便易用的Git图形化界面,为Git的使用带来了便利。 安装 前往TortoiseGit官网下载最新版本的安装包。 运行安装程序,按照提示进行安装即可。 配置 在使用TortoiseGit前,需要进行一些配…

    other 2023年6月25日
    00
  • hbuilderx全局搜索

    HBuilderX全局搜索 HBuilderX是DCloud公司推出的一款跨平台的多端开发IDE,不仅能够支持Web、App等前端开发,还支持Flutter、Vue等多种语言。作为一款强大的前端开发工具,搜索功能是其不可或缺的一个部分。 在HBuilderX中,全局搜索是一个非常实用且重要的功能。当代码量较大且层级复杂时,我们通常需要进行全局搜索以快速找到指…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部