构造函数相关
1)默认构造函数
如果类中没有定义自己的构造函数,编译器为构造一个默认构造函数,如果自定义了任何一个构造函数,编译器都不会再构造默认构造函数。
默认构造函数分为两种:一种是A(),不带任何参数的默认构造函数。第二种是A(a=1,b=2)带了默认实参的默认构造函数。
2)关于复制构造函数
对象的初始化分为直接初始化使用括号A a(),调用的是相应的构造函数;复制初始化string a="DFAA",调用的是复制构造函数,先生成一个临时string对象,然后复制给a.
复制构造函数使用的地方:同类对象的复制,实参复制传递,函数返回对象值。
对于不支持复制初始化的类或者构造函数为explicit,初始化方式有着本质区别例如:
ifstream file("file_name")//OK,直接初始化,调用构造函数
ifstream file="file_name"//error,复制初始化,但是不支持复制
salse_item item=string("9-9999-999")//如果构造函数为explicit,则初始化失败
默认复制构造函数的行为:将现有对象的每个非static成员复制到新对象的对应成员,包括数组成员
复制构造函数必须定义的类型:类中包含指针数据或者有成员表示在构造函数中分配的其他资源。
复制构造函数也成为拷贝构造函数,拷贝分为浅拷贝和深拷贝
浅拷贝:简单的成员变量复制,不需要对资源重新分配
深拷贝:比如成员变量为指针并且分配了堆空间,那么需要重新释放空间,指定新的空间,则为深拷贝
如果函数禁止拷贝,则可以把复制构造函数声明为private类型。如果声明为private且不定义,那么成员函数以及友元函数都不能调用拷贝构造函数
浙公网安备 33010602011771号