复制构造函数的诡异行为,哪位C++高手可以解释一下?
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;};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; int id; std::string name;};int Employee::newid = 1;Employee::Employee() : id(newid){ std::cout << "In default constructor, id = " << id << std::endl; ++newid;}Employee::Employee(std::string sname) : id(newid), name(sname){ std::cout << "In single parameter constructor, id = " << id << std::endl; ++newid;}// copy constructorEmployee::Employee(const Employee &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 aissign function, id = " << id << std::endl; name = old.getName(); return *this;}int main(){ string name = "adu"; Employee em5 = name; return 0;}
Employee em5 = name;改成Employee em5(name); //用到了Employee(std::string sname)这个构造函数
[解决办法]
这句话,印象中primer确实有
string str="ihello"; 就说这句代码
首先编译器: 讲ihello这个字符串创建了一个 临时的 string对象,然后
用这个临时对象 进行赋值拷贝了了str
只不过编译器优化了,看不出来
说的不对,请指教