我不明白这段代码是如何编译的。有人可以解释一下里面发生了什么吗。
#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;
}
optput 是: 构造函数调用
P.S.:我想不出比这更贴切的标题了,谁能想到更好的标题,请修改。
最佳答案
"copy me"
的类型是char const[8]
,它衰减为char const *
。由于默认构造函数不是explicit
,"copy me"
可以隐式转换为B
,因此ob
可以从隐式转换的临时 B
对象复制构造。
如果默认构造函数被声明为explicit
,您将不得不编写以下内容之一:
B ob1 = B("copy me");
B ob2("copy me");
如果复制构造函数也被声明为显式
,您将不得不说出以下之一:
B ob3(B("copy me"));
B ob4("copy me");
在实践中,所有拷贝都将被任何不合格的编译器删除,并且您总是以单个默认构造函数调用结束。
关于C++:为什么代码正在编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446772/