首页 > 编程语言 >C++中的explicit关键字

C++中的explicit关键字

时间:2023-12-20 11:55:21浏览次数:44  
标签:类型转换 double explicit C++ 关键字 Complex 0.0 构造函数

一、简介

explicit关键字可以阻止隐式转换的发生。

举例:
C++中只带有一个参数的构造函数,或者或者除了第一个参数外其余参数都有缺省值的多参构造函数,承担了两个角色:

(1) 用于构建单参数的类对象。
(2)隐含的类型转换操作符。

一个类A的构造函数 A(int i) 就是既可以用来作为构造器,又可以实现隐式转换 A a=1;因为1可以通过构造函数 A(int i) 转换为一个类A的对象,这就提现了隐含类型转换操作。


二、例子

1. 不使用explicit

#include <iostream>
using namespace std;
  
class Complex {
private:
    double real;
    double imag;
  
public:
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i)
    {
        cout << "Complex(" << r << ", " << i << ")" << endl;
    }

    bool operator==(Complex rhs)
    {
        cout << "operator==() rhs.real=" << rhs.real << " rhs.imag=" << rhs.imag << endl;
        return (real == rhs.real && imag == rhs.imag) ? true : false;
    }
};

int main()
{
    // a Complex object
    Complex com1(3.3, 4.4);
  
    if (com1 == 5.5)
        cout << "Same" << endl;
    else
        cout << "Not Same" << endl;

    return 0;
}

/*
~/tmp/5.cpp_test/2.explicit$ g++ explicit_test.cpp -o pp
~/tmp/5.cpp_test/2.explicit$ ./pp
Complex(3.3, 4.4)
Complex(5.5, 0)
operator==() rhs.real=5.5 rhs.imag=0
Not Same
*/

可以看到在进行赋值时,Complex构造函数调用了一次,先把5.5隐式转换为Complex类对象,然后再调用operator==()进行比较。


2. 使用explicit

#include <iostream>
using namespace std;
  
class Complex {
private:
    double real;
    double imag;
  
public:
    explicit Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) //注明需要显式调用
    {
        cout << "Complex(" << r << ", " << i << ")" << endl;
    }

    bool operator==(Complex rhs)
    {
        cout << "operator==() rhs.real=" << rhs.real << " rhs.imag=" << rhs.imag << endl;
        return (real == rhs.real && imag == rhs.imag) ? true : false;
    }
};

int main()
{
    // a Complex object
    Complex com1(3.3, 4.4); //显式调用构造函数
    Complex com2 = 6;
  
    if (com1 == (Complex)5.5) //显式类类型转换
        cout << "Same" << endl;
    else
        cout << "Not Same" << endl;

    return 0;
}

/*
~/tmp/5.cpp_test/2.explicit$ ./pp
Complex(3.3, 4.4)
Complex(5.5, 0)
operator==() rhs.real=5.5 rhs.imag=0
Not Same
*/

加了 explicit 禁止了隐式类型转换,这种情况继续使用就会报错。可改为显式类型转换后继续使用。

 

标签:类型转换,double,explicit,C++,关键字,Complex,0.0,构造函数
From: https://www.cnblogs.com/hellokitty2/p/17916221.html

相关文章

  • C++聊天集群服务器解决客户端注销登录问题
    客户端如何处理注销登录问题?问题描述:​ 在客户端登录后进行注销选择,然后重新登录刚才注销的账号,直接卡死。注意这是概率发生,因为是主线程和子线程抢服务器发送的信息,只有子线程抢到才会发生卡死问题产生原因分析:​ 前置条件:主线程循环等待用户输入选择(第一张图是死循环,send......
  • 入门篇-其之十一-流程控制之break和continue关键字
    本文中使用到的工具是IntellijIDEA和JDK8,需要安装两款工具的请查看这两篇教程:点我查看安装JDK8/11/17教程、点我查看安装IntellijIDEA教程。一、循环的嵌套和前面学习if一样,循环也可以相互搭配嵌套,即一个循环内部还包含一个循环。在编写嵌套循环时,三种循环(for、while、do-w......
  • C++ Qt开发:QItemDelegate 自定义代理组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QStyledItemDelegate自定义代理组件的常用方法及灵活运用。在Qt中,QStyledItemDelegate类是用于......
  • C++11 多线程
    文章参考:C++教程|爱编程的大丙(subingwen.cn)C++11的原子量与内存序浅析-兔晓侠-博客园(cnblogs.com)从C++11起,C++为用户提供一套新的多线程类。线程相关操作头文件:thread#include<thread>一.std::thread1.初始化和析构默认构造函数:原型:thread()noexce......
  • 给网站引入各大搜索引擎的关键字提示,白给的接口薅他羊毛。
    拥有一个关键词提示属于是导航网站必要的了因为网站是个导航网站,有一个搜索框,用户搜索时需要像百度一样有个搜索提示关键词列表。之前只是用百度,现在给增加了好几个,想换那个就换那个了,直接上图片可以配置属于是想选哪个选哪个,谁提示不爽就不用它,我可以用着bing的搜索引擎却使用......
  • java,类、实例化、构造方法、this关键字、方法重载
    编写类的步骤:1、定义类名2、编写类的属性3、编写类的方法public 访问修饰符,表示在整个项目中都可以调用,也可以用其他词使用class关键字来定义类,如下,定义一个Cat类给了属性和方法,动态方法是没有static的publicclassCat{//属性Stringni_chen;Stringco......
  • C++(std::pair)
    在C++中,std::pair是一个标准库模板,用于将两个不同类型的值组合成一个单元,即一对(pair)。std::pair定义在头文件<utility>中。这个模板是为了提供一种简单的方式来存储和传递两个相关但不同类型的值。std::pair模板的定义如下:namespacestd{template<classT1,classT2>......
  • C++(深拷贝、潜拷贝)
    在C++中,深拷贝(deepcopy)和浅拷贝(shallowcopy)是涉及对象复制的两个概念,特别是当涉及到类或结构体时。下面我将解释这两个概念:1.浅拷贝(ShallowCopy):浅拷贝是指将一个对象的内容复制到另一个对象,但如果对象中包含指针,则只会复制指针的值,而不是指针所指向的数据。这意味着两个对象......
  • C++(STL标准库)
    C++标准模板库(StandardTemplateLibrary,STL)是C++标准库的一部分,提供了一组通用的模板类和函数,包括数据结构和算法,以便开发者能够更容易地实现各种功能。STL的设计目标是提供高性能、灵活和通用的工具,使得开发者能够专注于问题的解决,而不必为数据结构和算法的实现而费心。STL......
  • 刘方舟 VC++面向对象与可视化程序设计 黄维通
    注:由于题目不确定,整理知识点范围比较宽,适当选取1.内联函数     定义:定义在类体内的成员函数,即函数的函数体放在类体内     特点:在调用处用内联函数体的代码来替换,用于解决程序的运行效率问题。一定要在调用之前定义,并且内联函数无法递归调用。2.构造函数与析构......