C++:为什么代码正在编译

Ama*_*tam 0 c++ compilation

我不明白这段代码是如何编译的.有人可以解释一下那里发生了什么.

#include <iostream>

using namespace std;

class B
{
public:    
    B(const char* str = "\0") //default constructor
    {
        cout << "Constructor called" << endl;
    }    

    B(const B &b)  //copy constructor
    {
        cout << "Copy constructor called" << endl;
    } 
};

int main()
{ 
    B ob = "copy me";    //why no compilation error.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

optput是:构造函数调用

PS:我想不出一个比这更贴切的标题,任何想到更好标题的人,请修改它.

Ker*_* SB 10

的类型的"copy me"char const[8],它衰减到char const *.由于默认构造函数不是explicit,"copy me"因此可以隐式转换为B,因此ob可以从隐式转换的临时对象中进行复制构造B.

如果声明了默认构造函数explicit,则必须编写以下内容之一:

B ob1 = B("copy me");
B ob2("copy me");
Run Code Online (Sandbox Code Playgroud)

如果复制构造函数被声明explicit,你将不得不说其中一个:

B ob3(B("copy me"));
B ob4("copy me");
Run Code Online (Sandbox Code Playgroud)

在实践中,所有副本都将被任何半合半的编译器省略,并且您总是最终得到一个默认的构造函数调用.


Kir*_*rov 7

因为这

B ob = "copy me";
Run Code Online (Sandbox Code Playgroud)

调用复制构造函数,它接受参数const B &b ,你的类B有一个构造函数

B(const char* str = "\0")
Run Code Online (Sandbox Code Playgroud)

这是定义为explicit.

允许编译器进行一次隐式转换.


那么,这里发生了什么:

B ob = "copy me";
Run Code Online (Sandbox Code Playgroud)

是:

  1. 创建一个临时的,未命名的对象B,使用提供的const char* str- 这是允许的,因为class B有构造函数,它接受一个参数而没有定义为explicit.换句话说,所有具有类型的对象B都可以从a构造const char*
  2. 使用创建的ob临时对象创建对象1..


小智 7

如果将关键字explicit添加到默认构造函数以防止隐式转换.然后它将无法编译.你的答案是隐式转换.