构造函数有无参默认构造、有参构造、拷贝构造三种。
如果在构造类对象时采用隐式转换法时,在没有默认构造函数和有参构造函数的情况下,可以正常编译;但在仅有有参构造的情况下会出现错误。所以,在用户自定义有参构造函数时,编译器不提供默认的构造函数。
#include<iostream>
using namespace std;
//人的家庭成员类
class family {
public:
string dog_name;
string cat_name;
// family (){
// cout<<"family的默认构造函数调用"<<endl;
// }
family(string d_name, string c_name) :dog_name(d_name), cat_name(c_name) {
cout << "family的有参构造函数调用" << endl;
}
~family() {
cout << "family的析构函数调用" << endl;
}
};
//人类
class Person {
public:
string P_name;
family animal;
Person(string ren_name, family AN) :P_name(ren_name), animal(AN) {
cout << "Person的有参构造函数调用" << endl;
}
~Person() {
cout << "Person的析构函数调用" << endl;
}
};
void test() {
// 隐式转换,调用无参构造函数 ,如果不写无参的默认构造函数,只有有参的构造函数,出现编译错误。
family an;
an.dog_name = "cv";
an.cat_name = "ui";
//调用有参构造函数
// family an("cv","ui");
Person p("per", an);
cout << p.P_name << "有动物: " << p.animal.dog_name << " 以及 " << p.animal.cat_name << endl;
}
int main() {
test();
system("pause");
return 0;
}
添加默认构造函数后,或者注释掉有参构造函数就可以运行。最终结果如下:
仅记录学习历程。