对象实质上是一块内存区,在内存区中存放着数据,并隐含着对这些数据的操作,在创建对象时应该对这块区域进行合理的初始化
显示的调用初始化函数(1)有时会非常麻烦(2)有可能忘记,有了构造函数之后编译器可以在创建对象的时候自动的调用构造函数来初始化对象
析构函数:
在对象生命周期结束时返回相关资源和自动释放资源
#include<iostream>
using namespace std;
class Test3
{
public:
void init(int _a,int _b)
{
a = _a;
b = _b;
}
protected:
private:
int a;
int b;
};
int main()
{
//类没有提供构造函数 c++编译器会自动给你提供一个默认的构造函数
//如果类没有提供构造函数,copy构造 构造函数 c++编译器会自动的默认的提供一个 copy构造函数
Test3 t1;
int a = 10;
int b = 20;
t1.init(a,b);
Test3 tArray[3];//没机会初始化
tArray[0].init(1,2);
tArray[1].init(1,2);
tArray[2].init(1,2);
//这种场景之下,显示的初始化很麻烦
system("pause");
return 0;
}
一个对象的生命周期的展现
#include<iostream>
using namespace std;
class Test
{
public:
Test()//无参数的 构造函数
{
a = 10;
p = (char *)malloc(100);
strcpy(p,"aaaafffff");
cout<<"我是构造函数"<<endl;
}
void printP()
{
cout<<p<<endl;
cout << a <<endl;
}
~Test()
{
if (p != NULL)
{
free(p);
}
cout<<"我是析构函数,被调用了"<<endl;
}
protected:
private:
int a;
char *p;
};
//给对象搭建一个舞台,研究对象的行为,可以完整的展现对象的生命周期
void objplay()
{
Test t1;//在次加个断点,F11进入到函数体中
}//执行到这里时按F11可以观察到自动调用析构函数
int main()
{
objplay();
system("pause");
return 0;
}
两个对象的生命周期的展现
#include<iostream>
using namespace std;
class Test
{
public:
Test()//无参数的 构造函数
{
a = 10;
p = (char *)malloc(100);
strcpy(p,"aaaafffff");
cout<<"我是构造函数"<<endl;
}
void printP()
{
cout<<p<<endl;
cout << a <<endl;
}
~Test()
{
if (p != NULL)
{
free(p);
}
cout<<"我是析构函数,被调用了"<<endl;
}
protected:
private:
int a;
char *p;
};
//给对象搭建一个舞台,研究对象的行为,可以完整的展现对象的声明周期
void objplay()
{
Test t1;//在次加个断点,F11进入到函数体中
printf("分隔符\n");
t1.printP();
//Test t1,t2;//析构的时候 先创建的对象后释放
Test t2;
t2.printP();
}
int main()
{
objplay();
system("pause");
return 0;
}