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

        实验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论坛上,欢迎大家一起探讨。





























  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值