构造函数:
**定义:**构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
如果类里什么都不声明,系统(编译器)会自动生成6个函数
1.构造函数
2.拷贝构造函数
3.赋值语句
4.析构函数
5.空
6.空
析构函数:
**定义:**析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
1.析构函数名也应与类名相同,只是在函数名前面加一个按位取反符,例如stud( ),以区别于构造函数;
2.它不能带任何参数,也没有返回值(包括void类型);
3.只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,
ps:
习题:
class MyClass
{
int val;
public:
MyClass(int x = 0)
{
val = x;
cout << val << endl;
}
~MyClass()
{
cout << "xi" << val << endl;
}
private:
};
void fun()
{
MyClass a(1);
}
MyClass b(2);
int main()
{
MyClass c(3);
fun();
return 0;
}
MyClass d(4);
执行结果:2 4 3 1 xi1 xi3 xi4 xi2
分析:
b和d都是定义(设计)在全局,故编译器会先执行它们的构造函数,然后进入main主函数里,看到c,执行它的构造函数,然后进入fun里执行a的构造函数。当从fun中出来时,a的生存期结束,执行a的析构函数,然后main主函数结束,执行c的析构函数,程序结束前,执行b,d的析构函数。
其他:
全局变量在数据区,局部变量在栈区
空间和构造函数,析构函数都是系统提供。
构造和析构函数都有this指针(除友元函数);
malloc与new:
malloc在堆区申请空间;
new也是在堆区申请空间 但它不是函数,是运算符;
new有俩步功能:1.申请空间 2.调动构造函数
如果堆区不足时
malloc返回NULL;
new抛出异常;
new三种用法
1.关键字
Object *op = new Object(10);
2.函数用法
Object *os=(Object *):: operator new(sizeof(Object));
3.定位new
new(os) Object(100);
方法1=方法2+方法3;
先定义:Object a(10);
不能在调用构造函数来改变a(a.Object(1000);//错误)
但可以用 new (&a) Object(1000);
free只是释放空间
delete
1.调动指针指向对象的析构函数
2.释放空间
ps:
c++可以 int a = 10; 等同于 int b(10);
引用:
不为引用提供内存空间,就是给了新名字
在编译时由图一变图二