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

为什么拷贝函数 有cosnt不行呢?

#include <stdlib.h>
#include <string>
#include <iostream>
#include <QDebug>
using namespace std;

class Teacher
{
public:
  Teacher(string name = "ti", int _age = 100);
  Teacher(const Teacher &tea);

  const double m_dPi;

};

Teacher::Teacher(string name, int _age)
  :m_dPi(8)
{

   cout << "teacher init is run !\n" << endl;
}

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

int main()
{
   Teacher t;
   Teacher t1 = t;

}

 我发现 把 const double m_dPi;改成 double m_dPi;就可以了,

但是不知道为什么?

正在回答

3 回答

你把m_dPi在类中定义成常量, 就意味在只能在构造函数中使用初始化列表的方式来初始化, 可是你的复制构造函数却没有用初始化列表的方式来初始化m_dPi的值, 所以编译出错。

所以这也能解释为什么你把m_dPi定义成变量编译器就可以通过了。

你也可以把复制构造函数这么修改:

Teacher::Teacher(const Teacher &tea) :m_dPi(8)

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

其实理解了默认的复制构造函数原理就好理解了, 系统默认的构造函数是单纯的去给相应的值去对应复制, 可是我们声明的m_dPi是常量, 一旦作为左值被赋值编译器就会报错。

个人理解,欢饮纠错。

8 回复 有任何疑惑可以回复我~
#1

面具VS口罩

nice
2017-03-21 回复 有任何疑惑可以回复我~
#2

qq_K_152

666
2017-12-04 回复 有任何疑惑可以回复我~

66666666666

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

我也有相同的问题,求解

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

举报

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

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

进入课程

为什么拷贝函数 有cosnt不行呢?

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号