有一些代码如下:
class A{
private :
int a, b;
public :
A(int x):a(x),b(a*a){}
int getA(){
return a;
}
int getB(){
return b;
}
};
int main(){
A a=13;
printf("%d %d\n", a.getA(), a.getB() );
return 0;
}
行A a=13
,我无法理解它如何调用构造函数以及为什么?
我认为没有任何关于强制转换的定义,也不会编译,但它运行良好,并调用构造函数。
答案 0 :(得分:6)
这称为隐式声明。当您编写A a=13;
时,您的编译器足够聪明,可以识别出您的真正意思是A a(13);
,因为您已经声明了一个以int作为参数的构造函数。如果您不希望发生这种情况,请在构造函数之前加上explicit
关键字,然后除非您编写A a(13);
而不是A a=13;
,否则会出现编译错误。
答案 1 :(得分:5)
采用单个参数的非显式构造函数可用作转换构造函数,以隐式将参数类型转换为类类型。
因此构造函数用于将13
转换为A
类型。
如果需要,可以通过使构造函数显式来阻止隐式转换:
explicit A(int x):a(x),b(a*a){}
仍然可以用于显式转换:
A a1(13); // OK: explicit conversion
A a2 = A(13); // OK: explicit conversion
A a3 = 13; // Error: implicit conversion not allowed via explicit constructor
答案 2 :(得分:2)
您似乎并未意识到转换构造函数。 转换构造函数是一个构造函数,它只接受一个参数并构造该类的对象。它的工作方式类似于从某种类型到类的转换,因此名称为转换构造函数。
隐式转换,我相信这会使您感到困惑,当编译器看到两种不同的类型并尝试通过查找可能的转换来使它们兼容时,就会发生这种情况。
正如您所看到的,隐式转换会导致相当多的混淆(一个int也可以是A??)。因此,您应该注意班级中的转换构造函数,并在必要时使用explicit
关键字。
explicit A(int i);
当您将转化构造函数指定为explicit
时,这会告诉编译器不对此类型执行任何隐式转换。发生这种情况时,您只能使用static_cast<int>(a);
等演员表进行转换。
感谢您的阅读。