C++中的explicit关键字介绍

news/2024/5/9 17:22:00

C++中的关键字explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。类构造函数默认情况下声明为隐式的即implicit。

 隐式转换即是可以由单个实参来调用的构造函数定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。

         explicit关键字只能用于类内部的构造函数声明上,而不能用在类外部的函数定义(函数实现)上,它的作用是不能进行隐式转换;explicit关键字作用于单个参数的构造函数,如果构造函数有多个参数,但是从第二个参数开始,如果各参数均有默认赋值,也可以应用explicit关键字。

         当构造函数只有一个参数时,会进行自动隐式转换,当构造函数参数个数超过或等于两个时自动取消隐式转换,当只有一个必须输入的参数,其余的为有默认值的参数时使用explicit也起作用。

         一般只将有单个参数的构造函数声明为explicit,而拷贝构造函数不要声明为explicit。

         explicit关键字只能对用户自己定义的对象起作用,不对默认构造函数起作用。此关键只能够修饰构造函数。无参数的构造函数和多参数的构造函数总是显示调用,这种情况在构造函数前加explicit无意义。

         当不希望进行自动类型转换时用explicit,标准库的许多构造函数都是explicit的。

以下是参考网上的一个测试代码:

explicit.hpp:

#ifndef FBC_MESSY_TEST_EXPLICIT_HPP
#define FBC_MESSY_TEST_EXPLICIT_HPP// reference Bjarne Stroustrup sample
class String{
public:explicit String(int n) {};String(const char *p) {};
};void test_explicit();#endif // FBC_MESSY_TEST_EXPLICIT_HPP
explicit.cpp:

#include <explicit.hpp>static void test1()
{String s1 = 'a'; // 错误:不能做隐式char->String转换String s2(10); // 可以:调用explicit String(int n);String s3 = String(10); // 可以:调用explicit String(int n);再调用默认的复制构造函数String s4 = "Brian"; // 可以:隐式转换调用String(const char *p);再调用默认的复制构造函数String s5("Fawlty"); // 可以:正常调用String(const char *p);
}static void f(String)
{}static String g()
{f(10); // 错误:不能做隐式int->String转换f("Arthur"); // 可以:隐式转换,等价于f(String("Arthur"));return 10; // 同上
}void test_explicit()
{test1();g();
}
执行情况如下:

GitHub:https://github.com/fengbingchun/Messy_Test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/29378.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【Ubuntu】VirtualBox+ubuntu中显示摄像头

1、下载插件 https://www.virtualbox.org/wiki/Downloads 2、修改下载的插件的后缀 将后缀名改为vbox-extpack 如下载的插件为Oracle_VM_VirtualBox_Extension_Pack-5.2.14.txt,改为Oracle_VM_VirtualBox_Extension_Pack-5.2.14.vbox-extpack 3、安装插件 点击virtualBo…

delphi 判断鼠标 左右_外设评测HyperX Pulsefire Haste游戏鼠标分享

HyperX家的外设产品我使用较多的是游戏耳机和键盘&#xff0c;鼠标给我的印象还停留在两年前的首款逆火鼠标上&#xff0c;倒不是说HyperX的鼠标不好&#xff0c;主要是我不喜欢太大、太重&#xff0c;以及扁平外型鼠标&#xff0c;以至于HyperX近年发布的几款鼠标都没能结缘。…

tomcat启动后 项目运行缓慢,要几十到几百秒不等 怎么样./startup.sh 运行加快

修改 linux系统中 /usr/local/jdk1.8.0_11/jre/lib/security/java.security 借力 好文章。我们新的Linux系统&#xff0c;部署了多个 Tomca&#xff0c;同时重启后t, 每次都阻塞差不多260秒左右。修改之后总的启动时间下降到6-8秒左右。另外&#xff0c;不确定为什么&#xff0…

mysql 5.7 编译_Mysql5.7版本编译安装及配置

配置yum安装方式1、配置本地yum源1 vim /etc/yum.repos.d/rhel-source.repo2 [rhel-source]3 nameRed Hat Enterprise Linux $releasever - $basearch -Source4 baseurlfile:///mnt5 enabled16 gpgcheck02、清除yum缓存yum clean all3、更新yum源yum update allyum安装 …

C++中istream的使用

在项目中会经常用到读取一些配置数据&#xff0c;这些数据根据实际需要有可能会调整&#xff0c;如果将这些数据直接嵌入进代码中会非常不便&#xff0c;需要经常调整代码。将这些数据写入配置文件中然后在读入&#xff0c;如果需要调整&#xff0c;只需修改配置文件&#xff0…

C++中操作符重载的使用

当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义。重载的运算符是具有特殊名字的函数&#xff1a;它们的名字由关键字operator和其后要定义的运算符共同组成。和其它函数一样&#xff0c;重载的运算符也包含返回类型、参数列表以及函数体。重载运算…

按下回车键指向下一个位置的一个函数

functiontofocus(itemname) // 按回车置下一个位置 2{ 3vara 4aeval( " document.vouch. "itemname) 5a.focus() 6} 7 在控件中使用onkeypress" javascrip:if(window.event.keyCode13){tofocus(nextformname)}提取下一个控件名

mysql 5.7编译安装重启_mysql5.7源码编译安装

安装mysql前的准备&#xff1a;一、安装依赖的库&#xff1a;yum install gcc-c ncurses-devel perl-Data-Dumper python-devel openssl openssl-devel二、 安装cmake(因为mysql5.7的编译由cmake来实现)安装cmake&#xff1a;cd cmake-2.8.8/预编译和安装&#xff1a;./bootst…