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

标签 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;
}

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/

相关文章:

go - 使用现有的 Homebrew 软件安装引导 Golang 安装的最佳方式

c++ - 在 C++ 中使用 memcpy 将结构写入 char 数组

java - Android JNI 从 Java 类中获取两个字段

linux - 如何为不同的用户维护不同的编译库?

c - 64位机器中的对齐不是8字节

linker - 链接时:使用-l标志或仅将归档作为输入

c++ - 我的 C++ 代码在宏+模板编译时失败,为什么会出现这个错误?

c++ - 在从 Lua 调用的 C++ 中,lua_type(L,0) 返回未记录的 9

c++ - '/usr/include/c++/4.4/bits/'中的位是什么意思

c++ - 我可以在类中重载静态运算符吗?