构造函数
构造函数会在对象创建时候自动调用,与类同名,一般用于完成类的初始化工作,可重载
#include <iostream>
using namespace std;
class Person
{
public:
Person()
{
m_age = 5;
cout << "构造函数 go" << endl
<<"age = "<<m_age<<endl;
}
Person(int a)
{
m_age = a;
cout << "构造函数 go" << endl
<<"age = "<<m_age<<endl;
}
private:
int m_age;
};
int main()
{
Person person;//自动调用构造函数
Person person1(1);//重载
getchar();
return 0;
}
输出结果:
创建对象的方式可以是Person person,可以new,也可以malloc,前两个会调用构造函数,但malloc不会调用构造函数
析构函数
析构函数在程序结束时自动调用,不可重载,一般用于delete一些new出来的对象。
delete会调用析构函数,free不会调用析构函数
class Person
{
public:
Person()
{
m_age = 5;
cout << "构造函数 go" << endl
<<"age = "<<m_age<<endl;
}
~Person()
{
}
private:
int m_age;
};
初始化列表
- 假如我们这样定义类Person
class Person
{
public:
Person(int a,int b)
{
m_age = a;
m_height = b;
}
private:
int m_age;
};
- 我们可以在函数调用时,给构造函数传参来初始化属性
Person person(5);
- 也可以这样
class Person
{
public:
Person(int a,int b):m_age(a),m_height(b)
{
/*
m_age = a;
m_height = b;
*/
}
private:
int m_age;
};
tips: 为了方便,在定义构造函数时,可以配合默认参数,在调用时既可以传参,又可以不传
构造函数调用构造函数
假如说,在写代码时重载了构造函数,还想实现相互调用,则必须在初始化列表中调用,不能在构造函数实现里面调用。
class Person{
public:
int m_agr;
void Person():Person(5){
/*不能在这里写
Person(5);
*/
}
void Person(int a){
m_arg = a;
}
};
int main(){
Person person;
return 0;
}
父类构造函数的调用
子类在继承父类后,创建子类对象时会先调用父类的无参构造函数,然后才会调用自己的构造函数。如果父类未定义无参构造函数,则子类需要指定调用父类有参构造函数(初始化列表处调用)
程序结束时,会先析构掉子类,然后是父类