为了账号安全,请及时绑定邮箱和手机立即绑定

关于拷贝对象不调用初始化函数,如何给拷贝对象初始化?

class.h部分代码:

Teacher(string name="Jim", int age = 15);

Teacher(const Teacher &T);


class.cpp部分代码:

Teacher::Teacher(string name, int age) :m_strName(name),m_iAge(age){cout << "Teacher(string name, int age)" << endl;}

Teacher::Teacher(const Teacher &T) {cout << "Teacher(const Teacher &T)" << endl;}


main.cpp部分代码:

Teacher t2;

cout << t2.getName() << " " << t2.getAge() << endl;

Teacher t3 = t2;

cout << t3.getName() << " " << t3.getAge() << endl;


运行结果如图

http://img1.sycdn.imooc.com//5e56101000010d0702940116.jpg


我想到的解决方案是:

  1. 在main.cpp文件中加入设置代码:setName(name);setAge(age);

    缺点:对于const常量类型会引起编译器无法编译,无法初始化。

  2. 拷贝函数中加入初始化列表?

Teacher::Teacher(const Teacher &T) :m_strName(T.m_strName),m_iAge(T.m_iAge){cout << "Teacher(const Teacher &T)" << endl;}

    实验结果是成功的

        http://img1.sycdn.imooc.com//5e5617150001fcf802740096.jpg

由此思考一个问题:如果让系统自动生成拷贝构造函数,它是否是默认将被拷贝对象的值传到拷贝对象中?如果成立,则可以证明系统自动生成的拷贝构造函数中是带初始化列表的。

    我将拷贝构造函数头文件都删除并运行,得出结果如下

        http://img1.sycdn.imooc.com//5e5617d90001ebd302910088.jpg

    由于没有拷贝构造函数,所以输出中少一句Teacher(const Teacher &T)。但是结果正确,所以这个论点是成立的。


问着问题问着解决了问题,有缘看到此的学友希望对你有帮助。再次感谢制作此系列教程的老师,简直太强了!

正在回答

2 回答

前面不是早就讲过了。。。

0 回复 有任何疑惑可以回复我~

可以自己写一个函数进行复制,比如this

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之封装篇(上)
  • 参与学习       103411    人
  • 解答问题       701    个

封装--面向对象的基石,本教程力求帮助小伙伴们即学即会

进入课程

关于拷贝对象不调用初始化函数,如何给拷贝对象初始化?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信