做门户类网站报价,wordpress图片上传卡住,陕西省建设厅八大员证,丹徒网站建设咨询文章目录 默认成员函数构造函数默认构造函数析构函数不同生命周期的构造、析构函数的执行顺序 默认成员函数
在c中#xff0c;每个类里面都有六个默认成员函数。即便这个类什么都没有#xff0c;也就是空类#xff0c;也会有这六个成员函数。这些函数的存在极大的简化了代码… 文章目录 默认成员函数构造函数默认构造函数析构函数不同生命周期的构造、析构函数的执行顺序 默认成员函数
在c中每个类里面都有六个默认成员函数。即便这个类什么都没有也就是空类也会有这六个成员函数。这些函数的存在极大的简化了代码的实现并且一定程度上提高了代码的安全性。
构造函数 构造函数是一个特殊的成员函数名字与类名相同,创建类类型对象时由编译器自动调用以保证每个数据成员都有 一个合适的初始值并且在对象整个生命周期内只调用一次。 特点
函数名与类名相同。无返回值。对象实例化时编译器自动调用对应的构造函数。构造函数可以重载。
class A()
{
private:int a;double b;
public:A(int x0){coutA()xendl;}
}
int main()
{A a1;A a1(10);return 0;
}上述代码的运行结果告诉我们当对象实例化的时候就会自动运行构造函数。 要注意的是实例化时不可以如下
int main()
{A a1;A a2(10);A a3();return 0;
}这个运行结果还是和上面的代码运行结果相同这时因为编译器将A a3();识别成了函数声明。
默认构造函数
对于可以无参的构造函数统称为默认构造函数包括全缺省构造函数无参构造函数、编译器默认生成的构造函数。日常中建议使用全缺省的构造函数 对于编译器默认生成的构造函数会根据类的属性的不同进行不同的处理
内置类型基本类型声明时赋给默认值如果没有默认值就不做处理。自定义类型调用其自身的构造函数。
class B
{
private:int x;
public:B(){cout B() endl;x 0;}
};
class A
{
private:int a10;//默认值double b;B bb;
public:void Print(){cout a b endl;}
};
int main()
{A a1;a1.Print();return 0;
}如上A中的int a默认值为10所以初始化为10b则不做处理为随机值。B bb为自定义类型执行了B的构造函数。
析构函数 析构函数与构造函数功能相反析构函数不是完成对对象本身的销毁局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数完成对象中资源的清理工作。 特点
析构函数名是在类名前加上字符 ~。无参数无返回值类型。一个类只能有一个析构函数。若未显式定义系统会自动生成默认的析构函数。注意析构函数不能重载对象生命周期结束时C编译系统系统自动调用析构函数。
析构函数的存在能能够帮我们在函数生命周期结束时自动释放动态开辟的空间有效地避免了空间泄露。 此外若没有自行定义类的析构函数。那么编译器就会生成默认的析构函数其对不同成员变量的处理参照默认构造函数对不同成员变量的处理。
不同生命周期的构造、析构函数的执行顺序
class A
{
public:A(){cout A() endl;}~A(){cout ~A() endl;}
};
class B
{
public:B(){cout B() endl;}~B(){cout ~B() endl;}
};
class C
{
public:C(){cout C() endl;}~C(){cout ~C() endl;}
};
class D
{
public:D(){cout D() endl;}~D(){cout ~D() endl;}
};
int main()
{B b1;static C c1;D d1;return 0;
}
A a1;根据上述代码的运行结果可知
构造函数的执行顺序首先是全局变量的构造函数然后是主函数里的局部变量构造函数从上往下依次进行。析构函数的执行顺序先执行主函数里的局部变量的析构函数从下往上依次进行然后执行静态区的析构函数最后才是全局变量的析构函数。