概要
带参构造和初始化列表赋值区别
技术细节
//手机类phone class phone { public: phone() { cout << "phone无参构造" << endl; } phone(string name) { this->name = name; cout << "phone带参构造" << endl; } private: string name; }; //类对象作为类成员 class Person { public: Person(string name1, string pName) : name(name1), ph(pName) { //this->name = name1; //ph = pName; } private: string name; phone ph; };
Person类中有个手机类对象作为Person类的一个成员,如果直接如图中初始化列表方式给ph赋值,其实就是做了一个默认的操作Phone ph = pName; 这样ph直接是调用Phone类中的带参构造,不会调用无参构造。如果按照注释的方式赋值,实际做了两步操作,第一步:Phone ph;(已经在私有里面定义好了) 第二步: Ph = pName; 第一步ph调用无参构造,第二步ph对象又被赋值会调用带参构造。
需要注意的是当进行完第二步后此时的ph为带参构造的对象,第一步的无参构造的ph立刻销毁会调用析构函数,在屏幕上打印出来的顺序就是ph无参构造,ph带参构造,ph析构函数(析构的是无参构造的ph)