如果我有一个带有这样的构造函数的类:
class A {
public:
A(int e) {
// Use the `e` value
}
};
如果我打这样的电话:
int main() {
A obj = 'c';
}
会发生什么转换?将首先进行对类型A
的转换,然后如何将其传递给构造函数?还是将字符值转换为int
?
还通过声明构造函数显式阻止了此处的哪些转换?
为澄清我的疑问:
如果我将构造函数声明为explicit
,则会看到以下结果:
int main() {
A objA = 'x'; // Error: conversion from ‘char’ to non-scalar type ‘A’ requested
A objA('x'); // OK
A objA = 1; // Error: conversion from ‘int’ to non-scalar type ‘A’ requested
A objA = A(1); // OK: Constructor called explicitly
A objA = (A)1; // OK: type Casting
}
我不理解前三个陈述中的行为。为什么第一和第三条语句转换为A
类型,而不是第一条转换为int
?
即使从char
到int
进行了隐式转换,为什么第二条语句仍要编译?
答案 0 :(得分:1)
A obj = 'c';
A obj = 1;
这些称为复制初始化。在这种情况下,仅考虑转换接受一个参数的构造函数(即非显式构造函数),只有一个是
A(int e)
{
// ...
}
'c'
(char
)转换为int
,然后作为参数提供给选定的构造函数。
如果将构造函数声明为explicit
,则它不是转换构造函数,并且 copy-initialization 无法找到合适的转换构造函数,从而使程序格式错误。 / p>
A obj('c');
A obj{'c'}; // since C++11
A obj(1);
A(1);
(A)1;
这些称为直接初始化。在这种情况下,将考虑所有构造函数(包括显式构造函数)。因此,无论您是否将构造函数声明为显式,都将调用该构造函数。