初始化表对多个其他类对象初始化的运行顺序

初始化表对多个其他类对象初始化的运行顺序

使用大学C++教材上的一个例子来说明这个运行先后顺序:

#include
#include
using namespace std;

class Date //定义日期类
{
public:
Date(int y, int m, int d); //声明带参数的构造函数
void show();
private:
int m_nYear, m_nMonth, m_nDay;
};
Date::Date(int y, int m, int d) //定义Date类的构造函数
{
cout << “Date constructor!” << endl;
m_nYear = y;
m_nMonth = m;
m_nDay = d;
}
void Date::show() //定义成员函数show(),显示日期
{
cout << m_nYear << “-” << m_nMonth << “-” << m_nDay << endl;
}

//
class Student //定义学生类
{
public:
//声明带参数的构造函数,con_name表示学生姓名,con_id表示学生id,y、m、d表示日期信息
Student(char *con_name, int con_id, int y, int m, int d);
void disp_msg();
private:
Date a;
Date m_iBirthday; //Date类型的数据成员
char m_gName[20];
int m_nID;
};
//定义Student类带参数的构造函数,参数y、m、d用于对Date类对象m_iBirthday初始化
Student::Student(char *con_name, int con_id,
int y, int m, int d) :m_iBirthday(y, m, d),a(m)
{
cout << “Student constructor!” << endl;
strcpy_s(m_gName, strlen(con_name) + 1, con_name);
//strcpy(m_gName, con_name);
m_nID = con_id;
}
void Student::disp_msg() //定义成员函数disp_msg(),显示学生信息
{
cout << “std name:” << m_gName << ", id = " << m_nID << “, birthday:”;
m_iBirthday.show();
a.show();
}
//
int main()
{
Student student(“xiaoming”, 1, 1998, 10, 25); //调用带参数的构造函数定义类对象
student.disp_msg();
system(“pause”);
return 0;
}
//
——————代码是简而易懂的———————————我是分割线—————————————
在这里插入图片描述将程序在vs2017中打开运行;
在39-40行中,我们通过参数y、m、d对Date类对象m_iBirthday进行初始化(在34行定义了m_iBirthday为Date类型的数据成员);

若我们在34行中再定义一个Date型的数据成员a;同时在40行中用参数y对Date类对象a进行初始;52行输出show:
在这里插入图片描述

根据所学知识,39-41行中我们要先执行后面初始化的对象;即m_iBirthday和a两个对象;我们写的是m_iBirthday在前,a在后;而实际上运行结果却是a对象先进行初始化、m_iBirthday初始化排在a对象之后;
而这又是为什么呢?

原来初始化表对多个其他类对象初始化时的顺序不是根据后面对象的先后顺序来的,m_iBirthday在前面也不一定比a先执行;执行顺序是根据34-35行这些对象成为Date类的数据成员的先后顺序来的;因为a比m_iBirthday先在被Date定义,所以后面初始化表中会先初始化a;

               ****这与初始化表中初始化对象的顺序是没有关系的!****
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值