C++explicit的用法 | explicit在C++中的使用及示例 17

作者 : 慕源网 本文共2820个字,预计阅读时间需要8分钟 发布时间: 2022-04-20 共98人阅读

C++explicit的用法,在C++中,EXPLICIT是在构造函数之前使用的关键字,定义为通过指定关键字EXPLICIT使构造函数不执行任何隐式转换。当类包含单个参数构造函数时,这是为了避免一些隐式转换而定义的,编译器通常将其视为转换构造函数或隐式转换,这可能会导致一些不需要的输出,为了避免这样的结果,我们必须在构造函数名称之前使用显式关键字定义这样的构造函数。一般来说,显式构造函数是在我们不能使用隐式构造函数的地方声明的,并且这种显式构造函数总是有一个或多个参数。

C++explicit的用法 | explicit在C++中的使用及示例 17

强烈推荐

海量程序代码,编程资源,无论你是小白还是大神研究借鉴别人优秀的源码产品学习成熟的专业技术强势助力帮你提高技巧与技能。在此处获取,给你一个全面升级的机会。只有你更值钱,才能更赚钱

如果你是初级程序员可以研究别人的代码提高技术,如果你喜欢搞网盟或者外包,可以让你快速建站,还等什么赶快关注吧,我们会持续输出相关资源

海量源码程序,学习别人的产品设计思维与技术实践

EXPLICIT关键字在C++中的作用及实例

在C++中,我们知道构造函数主要用于初始化或创建类的对象,这些对象默认情况下由编译器提供,我们可以使用此类构造函数进行类型转换,如与类声明中的构造函数进行隐式或显式转换。这个explicit关键字是可选的,它总是只接受一个参数,这样的构造函数可以在类型转换中使用。

如果隐式转换是不可控制的,那么我们需要在类声明中为构造函数指定带有关键字explicit声明的构造函数,但我们应该注意一件事:我们不能将此explicit关键字用于默认构造函数。

让我们考虑下面的例子,为什么以及在哪里使用C++中的explicit关键字:

例#1

代码:

#include <iostream>
using namespace std;
class Edu{
char var_c;
public:
Edu() {}
Edu(char c): var_c(c) {};
void print() {std::cout << "The value is "<< var_c <<endl;}
};
void disp(Edu u)
{
u.print();
}
int main()
{
Edu ins('E');
Edu ins1 = 'D';
cout<<"Below value is obtained when constructor is called normally :" << endl;
disp(ins);
cout<<"\n" <<endl;
cout<<"Below value is obtained when compiler implicitly is called to convert it to char type from Edu type is : " << endl;
disp(ins1);
return 0;
}

输出:

C++explicit的用法 | explicit在C++中的使用及示例 17

在上述程序中,我们可以看到,首先我们声明了一个类“EDU”,其中我们声明了一个字符类型变量var_C,我们创建了一个具有零个参数的默认构造函数和另一个具有类名称的构造函数,该构造函数具有单个参数和char类型的变量C,我们正在打印传递给此函数的值,我们必须记住,我们必须只传递char类型的值,但我们可以在我们首先创建的main()函数中看到类EDU对象“ins”,其中我们将“e”字母表传递给disp()函数,该函数具有一个“EDU”类型的参数,因此它将在正常调用构造函数时打印该值,但当我们创建类EDU的另一个对象“ins1”时,其中disp()函数传递的是类类型“EDU”参数,因此当我们现在调用disP()函数并尝试分配“d”时将char类型的字母表转换为“edu”类型的ins1对象,因此编译器将隐式地将“edu”类型变量转换为char类型变量,并给出带有char值的输出,如上面的屏幕截图所示,这有时是不正确的,因此为了避免这种隐式调用,我们必须将“explicit”关键字添加到具有单个参数的构造函数中,例如”explicit edu(char C):var_C(C) { } ; ”因此,当我们更改上面的代码时,我们得到如下截图所示的错误。

C++explicit的用法 | explicit在C++中的使用及示例 17

这里是输出。我们可以看到,从char类型到edu类型转换是非标量的,这不是合法的调用,因此在这种情况下或者在有可能进行隐式构造函数转换的情况下,使用explicit关键字是一种很好的做法。在上面的代码中,我们为“edu”构造函数编写了关键字“explicit”,该构造函数只有一个char类型的参数。

现在让我们看一个有两个参数的例子。我们将看到显式是否与双参数构造函数一起工作。

例#2

代码:

#include <iostream>
using namespace std;
class Edu
{
private:
int i;
int j;
public:
Edu(int a = 0, int b = 0) : i(a), j(b) {}
bool operator== (Edu e) {
return (i == e.i && j == e.j)? false : true;
}
};
int main()
{
Edu ins(3, 4);
cout << "It will print matched if the given values match else not same which uses implicit call to convert int to Edu type:" <<endl;
cout<< "\n" <<endl;
if (ins == 3)
cout << "matched";
else
cout << "No match";
return 0;
}

输出:

C++explicit的用法 | explicit在C++中的使用及示例 17

在上面的程序中,我们可以看到这也是与上面相同的代码,但我们在构造函数中使用了两个参数。当只有一个参数构造函数时,应用或使用Explicit通常是最佳实践,因为在main函数中调用两个或多个参数构造函数时,可能会导致混淆。因此,在上面的示例中,它的工作方式是,编译器隐式调用构造函数,而它不是获取输出的合法或正确形式。因此,为了避免这种可能产生输出的程序的不良执行,从逻辑上讲,转换类型是不正确的,因此我们对构造函数使用Explicit关键字。在上面的代码中,我们还可以在声明类中的构造函数之前使用Explicit关键字重写代码,例如“explicit edu(int a=0,int B=0):I(a),J(B){}”,因此输出将如下面的屏幕截图所示。

C++explicit的用法 | explicit在C++中的使用及示例 17

结论

在本文中,我们可以得出结论,在C++中,explicit 关键字通常用于在类声明中用于创建类对象的构造函数。在本文中,我们看到显式关键字仅用于构造函数,当我们想避免编译器进行的隐式调用时,编译器通常将构造函数作为转换构造函数,这是不正确或不合法的。最好的做法是始终使用EXPLICIT关键字,在这种情况下,它会给出一个错误,即类型为非标量类型。我们在上面的文章中看到了一些例子。

推荐文章

这是一篇关于C++explicit的用法的指南。在这里,我们通过例子分别讨论了EXPLICIT关键字在C++中的引入和工作方式。您还可以查看以下文章以了解更多信息


慕源网 » C++explicit的用法 | explicit在C++中的使用及示例 17

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录