构造函数调用规则
默认情况下,C++编译器至少给一个类添加3个函数
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝
调用规则如下:
- 如果用户定义有参构造函数,C++不再提供无参构造,但会提供默认拷贝构造
- 如果用户定义拷贝构造函数,C++不会再提供其他构造函数
深拷贝和浅拷贝
class Person{
public:
Person(int age, int height){
m_Age=age;
m_Height=new int(height);
coun<<"有参构造函数"<<endl;
}
Person(const Person &p){ //之所以用引用是因为用的是别名,不用另外开辟内存空间,节省内存
coun<<"拷贝构造函数"<<endl;
m_Age=p.Age;
//m_Height=p.Height;编译器默认实现就是这行代码
//深拷贝操作
m_Height=new int(*p.m_Height); //另外开辟了内存,析构函数就会释放不同的内存
}
~Person(){
if(m_Height!=null){
delete m_Height;
m_Height=NULL;
}
coun<<"析构函数"<<endl;
}
int m_Age;
int *m_Height;
}
void test01(){
Person p1(18,160);
coun<<"p1的年龄为:"<<P1.m_Age<<"身高为"<<*p1.m_Height<<endl;
Person p2(p1);
coun<<"p2的年龄为:"<<P2.m_Age<<"身高为"<<*p2.m_Height<<endl;
}
int main(){
test01();
return 0;
}
使用默认的拷贝构造函数是浅拷贝
自己实现拷贝构造函数实现深拷贝
类对象作为类成员
例如:
class A{}
class B{
A a;
}
创建对象的顺序是:当其他类对象作为本类的成员时,先构造类对象,再构造自身,析构函数与之相反。