一.构造函数
如哈让一个对象在创建的时候就被赋予了值——
构造函数是类的一种特殊的成员函数
(1)函数名必须和类名相同
(2)没有返回值
#include<stdio.h>
class Circle
{
public:
int x,y,radius;
public://以下就是构造函数
Circle()
{
x = y = 0;
radius = 1;
printf("11111\n");
}
Circle(int x,int y,int radius)
{
this->x = x;
this->y = y;
this->radius = radius;
printf("22222\n");
}
};
int main()
{
Circle a;
Circle b(1,1,4);
return 0;
}
二.析构函数
析构函数:对象被销毁时调用
(1)名称固定,在类名前加~
(2)没有返回值
(3)不能带参数
(4)析构函数只允许一个 不能重载
析构函数从不显式调用,都是编译器自定调用->在对象销毁时自动调用
对于局部变量(函数) ,在超出变量作用域后,该对象失效
#include<stdio.h>
class Circle
{
public://以下就是析构函数
~Circle()
{
printf("1111111111\n");
}
};
int main()
{
{
Circle obj;
}
printf("---------------\n");
return 0;
}
析构函数:在对象销毁之前,做一个清理善后的工作
比如:申请来的内存要释放掉,打开的文件要关闭掉
例如:
class StringBuffer
{
public:
StringBuffer()
{
m_buffer = malloc(1024);
}
~StringBuffer()
{
free(m_buffer);
}
} ;
class DataStore
{
public:
DataStore()
{
m_head.next = NULL;
}
~DataStore()
{
//删除链表中所有的结点,并把所有malloc的内存都释放掉
}
private:
Student m_head;
};
.h/.cpp分离式写法:与之前类的成员函数写法类似。
class DataStore{
public:
DataStore();
~DataStore();
};
DataStore::DataStore()
{
}
DataStore::~DataStore()
{
}
三.构造与析构的深究
1.
我们把不要传参的构造函数叫做默认构造函数
例如,之前举过的例子
Circle()
或者 构造函数的所有参数都有缺省值
Circle(int x=10,int y=5)
有了默认构造函数,在构造时就可以不传参。
默认构造函数很重要,如果一个类没有默认构造函数,则无法构造数组
例如:
class Object
{
public:
Object(int x){
}
} ;
Object obj[4]; //错误!!
如果一个类没有定义任何构造和析构函数,编译器会默认为我们加一个
2.考虑成员变量也是一个 class类型时
class Child
{
public://以下就是析构函数
Child()
{
printf("Child:创建\n");
}
Child(int x,int y)
{
printf("Child:创建\n");
}
~Child()
{
printf("Child:销毁\n");
}
};
class Circle
{
public://以下就是析构函数
Circle()
{
printf("Circle:创建\n");
}
~Circle()
{
printf("Circle:销毁\n");
}
private:
Child m_circle;
int x,y;
};
int main()
{
{
Circle obj;
}
printf("---------------\n");
return 0;
}
结论:
构造的时候
(1)成员被依次构造:从前往后
(2)先执行成员的构造函数在执行自己的构造函数
析构的时候
(1)成员被依次析构:从后往前
(2)先执行自己的析构,在执行成员函数的析构
3.初始化列表:可以在构造函数后面直接初始化
(1)以冒号引导
(2)使用小括号来初始化
//基本类型的初始化
class Object
{
public:
Object(): x(1),y(2)
{
}
} ;
//class类型的初始化
class Object
{
public:
Object(): m_circle(1,2)
{
}
};