C++ Primer(4 edition) 中文版P407上说:“复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。”但我的实验结果显示是没有调用复制构造函数。
我做了个实验(实验1),首先写了一个简单的类,里面提供一个默认构造函数,一个接受单个形参的构造函数,一个复制构造函数和一个=重载函数,在上面每个函数中都打印一个消息,提示这个函数正在被调用。
接着在主函数使用这个类,使用复制初始化这个类的对象。按照书上说的,显示结果应该是先调用单形参的构造函数创建临时对象,输出一个提示,然后调用复制构造函数,输出一个提示。但结果只有一个提示!显示的是只调用了单形参的构造函数直接创建了对象,并没有临时对象的存在。结果很诡异!
既然没有调用复制构造函数,我又做了个实验(实验2),把这个复制构造函数改成private的,其他地方没有变,做了同样的实验,编译就不通过了,错误提示是我的主函数调用了复制构造函数。结果是不是很诡异?
问题:C++在复制初始化的时候到底有没有创建临时对象?如果有,为什么会出现实验1的结果;如果没有为什么出现实验2的结果?
实验1的类定义代码如下:
class Employee
{
public:
Employee();
Employee(std::string sname);
// copy constructor
Employee(const Employee &old);
Employee& operator=(const Employee&old);
int getID() const { return id; }
std::string getName() const { return name;}
private:
static int newid;
int id;
std::string name;
};
实验2的类定义代码如下:
class Employee
{
public:
Employee();
Employee(std::string sname);
Employee& operator=(const Employee&old);
int getID() const { return id; }
std::string getName() const { return name;}
private:
// copy constructor
Employee(const Employee &old);
static int newid;
intid;
std::string name;
};
实验的类实现代码如下:
int Employee::newid =1;
Employee::Employee(): id(newid)
{
std::cout << "In defaultconstructor, id = " << id << std::endl;
++newid;
}
Employee::Employee(std::stringsname) : id(newid), name(sname)
{
std::cout << "In singleparameter constructor, id = " << id << std::endl;
++newid;
}
// copy constructor
Employee::Employee(constEmployee &old) : id(newid), name(old.getName())
{
std::cout << "In copy constructor,id = " << id << std::endl;
++newid;
}
Employee&Employee::operator=(const Employee &old)
{
std::cout << "In aissignfunction, id = " << id << std::endl;
name = old.getName();
return *this;
}
主函数使用类的代码如下:
int main()
{
string name = "adu";
Employee em5 = name;
return 0;
}
实验1结果:
In single parameterconstructor, id = 1
实验2结果:
error:‘Employee::Employee(const Employee&)’ is private
问题发在CSDN论坛上,欢迎大家一起探讨。