C++ “显式”阻止自动类型转换?
可能重复: 我不明白以下几点。如果我有:C++ “显式”阻止自动类型转换?,c++,C++,可能重复: 我不明白以下几点。如果我有: class Stack{ explicit Stack(int size); } 如果没有关键字explicit,我将被允许执行以下操作: Stack s; s = 40; 如果没有提供明确的说明,为什么允许我执行上述操作??是因为这是堆栈分配没有构造函数,C++允许任何变量分配给变量,除非使用显式?< /P> < P>这行< /P> s = 40; 相当于 s.operator = (40); 它尝试匹配默认运算符=常量堆栈&。如果堆
class Stack{
explicit Stack(int size);
}
如果没有关键字explicit,我将被允许执行以下操作:
Stack s;
s = 40;
如果没有提供明确的说明,为什么允许我执行上述操作??是因为这是堆栈分配没有构造函数,C++允许任何变量分配给变量,除非使用显式?< /P> < P>这行< /P>
s = 40;
相当于
s.operator = (40);
它尝试匹配默认运算符=常量堆栈&。如果堆栈构造函数不显式,则尝试并成功执行以下转换:
s.operator = (Stack(40));
如果构造函数是显式的,则不会尝试此转换,重载解析将失败。嘿,这非常简单。
显式关键字仅阻止编译器自动将任何数据类型转换为用户定义的数据类型。。它通常与具有单个参数的构造函数一起使用。
所以在这种情况下,u是jus,它阻止编译器进行显式转换
#include iostream
using namespace std;
class A
{
private:
int x;
public:
A(int a):x(a)
{}
}
int main()
{
A b=10; // this syntax can work and it will automatically add this 10 inside the
// constructor
return 0;
}
but here
class A
{
private:
int x;
public:
explicit A(int a):x(a)
{}
}
int main()
{
A b=10; // this syntax will not work here and a syntax error
return 0;
}
使用您的搜索:我不是问显式是什么意思,我是问为什么s可能被分配到40…s.operator=Stack40;有什么问题?这不合法吗?我们只是想阻止分配数字40?@user997112:s.operator=Stack40是合法的,但它是对构造函数的显式调用。关键是,如果构造函数被认为是显式的,那么这个版本就不会被尝试。