做门户类网站多少钱,网站留言板模板,如何做能放照片的网站,手机端企业网站源码一、构造函数
1.实现的功能#xff1a;实例化对象的时候默认自动调用#xff0c;相当于初始化。 条件#xff1a;在书写时要满足构造函数的规范#xff08;函数名 类名#xff0c;不写返回值#xff0c;也没有返回值#xff09;#xff0c;可以用inline来修饰。
2.自…一、构造函数
1.实现的功能实例化对象的时候默认自动调用相当于初始化。 条件在书写时要满足构造函数的规范函数名 类名不写返回值也没有返回值可以用inline来修饰。
2.自定义构造函数
在自定义构造函数的时候要清楚默认调用的构造函数是没有传参的即c1.C()如果有自定义构造函数那么下面的这种情况要报错 构造函数也支持函数重载我们可以进一步验证 这里就能很明显的看到在默认调用的情况下只会以c1.C()这种形式去调用注意c1.C()这种写法是错误的这里只是为了形象表示下同。
因此在我们平时自定义构造函数的时候最好使用全缺省参数这样的话在我们有特殊初始化需求的时候可以选择自己传参在其余情况又能默认初始化这样会很方便。 #include iostream
using namespace std;class C
{
public:C(int a, int b, int c){_a a, _b b, _c c;}C(int a 1){_a _b _c a;}private:int _a;int _b;int _c;
};int main()
{C c1;C c2(4, 5, 6);return 0;
}
注意构造函数是在定义的时候就调用的格式要严格遵守 3.自动生成的构造函数条件
只有在没有自定义构造函数的情况下才会自动生成构造函数。
如果自定义了一个有参数的构造函数且没有在定义的时候使用C也不会自动生成此时会报错。 所以要么别自定义构造函数要么就要定义一个无参或者全缺省的构造函数。如果一定要定义一个有参的构造函数那么实例化对象时一定要在定义时调用构造函数如 C c1(1, 2, 3);
4.自动生成的构造函数的初始化规则
先看一段代码尝试解释 class C1
{
public:C1(int a 1, int b 1){_a a, _b b;}
private:int _a;int _b;
};class C2
{
private:int _x;int _y;C1 _z;
};int main()
{C2 c2;return 0;
}c2的各个成员变量的初始化值是 我们发现_x和_y并没有初始化而_a和_b初始化了如何解释
首先需要清楚C/C内置类型基本类型和自定义类型
内置类型void、char、short、int、long、float、double、void*、int*等
自定义类型struct、class、enum等
自动生辰的构造函数初始化成员变量针对内置类型和自定义类型有不同的初始化方式。
对于内置类型不进行初始化
对于自定义类型调用这些自定义类型的无参全缺省构造函数。
对上面的现象分析如下 尝试解释下面的初始化现象 class C1
{
public:C1(int a 1, int b 1){_a a, _b b;}
private:int _a;int _b;
};class C2
{
public:C2(){_x _y 2;}
private:int _x;int _y;C1 _z;
};class C3
{
private:int _p;int _q;C2 _r;
};int main()
{C3 c3;return 0;
}结果是 解释c3没有自定义构造函数所以自动生成构造函数。_p和_q都是内置类型所以不会初始化_r是自定义类型所以调用_r的自定义构造函数。
_r有自定义构造函数将_x和_y都初始化为2_z是自定义类型所以调用_z的自定义构造函数。
_z有自定义构造函数将_a和_b都初始化为2。
如果成员变量中自定义类型和内置类型同时存在在少数编译器中还是会初始化内置类型的。但显然刚刚演示的编译器就不是这样的。这点也不需要纠结
二、析构函数
实现的功能在对象生命周期结束后自动free掉堆区开辟的空间防止内存泄漏。 条件函数名 ~类名没有参数没有返回值不写返回值。
因为析构函数在对象的生命周期结束后会自动调用因此它可以很好的解决内存泄漏的问题。
需要注意的是析构函数不能带有参数包括全缺省所以也不需要考虑传参的各种情况。