#include<iostream>
#include<string>
using namespace std;
class card
{
public:
card(int a,string b)
{
index=a;
password=b;
}
int index;
string password;
};
class student
{
public:
1. student(string a,int b,string c):m_name(a),m_card(b,c){} //right
2. student(string a,int b,string c)
{
m_name=a;
card m_card(b,c); //error
}
string m_name;
card m_card;
};
void f()
{
student hfj("hanfeijiang",0213,"hfj020709");
cout << hfj.m_name << endl;
cout << hfj.m_card.index << endl;
cout << hfj.m_card.password << endl;
}
int main()
{
f();
return 0;
}
想问一下在class student中那两种student含参构造函数,为什么第一种直接使用初始化列标就正常赋值,第二种就错误。
类成员的初始化于初始化列表中完成, 先于构造函数体执行. 即成员真正的初始化发生在初始化列表中, 而不是构造函数体中.
因为要满足类成员先进行初始化,所以必须把类成员的初始化放在类初始化的前面,即把它放到初始化列表中进行初始化。如果把它放到函数体中则无法优先初始化。
什么时候必须使用初始化列表?_cckluv的博客-CSDN博客_什么时候必须用初始化列表 什么时候必须使用初始化列表1. 初始化 != 赋值.a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时).b.赋值代表"擦除对象当前值, 赋予新值". 它不承担为对象分配内存的义务2. C++中, 类成员的初始化于初始化列表中完成, 先于构造函数体执行. 即成员真正的初始化发生在初始化列表中, 而不是构造函数体中.如果类中有一个成员是一个引用, 由于引用必须给予初始值, 因此, 引用必须使用初始化列表.同理, const https://blog.csdn.net/cckluv/article/details/109144665?utm_source=app&app_version=4.14.0&code=app_1562916241&uLinkId=usr1mkqgl919blen
你是不是少写了继承。
student类需要在继承的情况下,才需要用列表形式构造。