我不明白这段代码是如何编译的.有人可以解释一下那里发生了什么.
#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)
在实践中,所有副本都将被任何半合半的编译器省略,并且您总是最终得到一个默认的构造函数调用.
因为这
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)
是:
B,使用提供的const char* str- 这是允许的,因为class B有构造函数,它接受一个参数而没有定义为explicit.换句话说,所有具有类型的对象B都可以从a构造const char*ob临时对象创建对象1..| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |