如果创建了对象并为其分配了值,则转换构造函数将执行哪些转换?

时间:2019-05-19 07:00:21

标签: c++ constructor explicit

如果我有一个带有这样的构造函数的类:

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? 即使从charint进行了隐式转换,为什么第二条语句仍要编译?

1 个答案:

答案 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;

这些称为直接初始化。在这种情况下,将考虑所有构造函数(包括显式构造函数)。因此,无论您是否将构造函数声明为显式,都将调用该构造函数。