当前位置: 首页 > wzjs >正文

设计师个人网站建设wordpress d8主题

设计师个人网站建设,wordpress d8主题,广州网络运营课程培训班,苏州网站推广哪家好C_CH18_构造函数与析构函数 1 类的默认成员函数 在编写类的时候,C编译器会默认生成6个默认的函数,但是不显示出来: 需要关注以下两个方面: 第一:我们不写时,编译器默认生成的函数行为是什么,是否满足我们的需求。 …

C++_CH18_构造函数与析构函数

1 类的默认成员函数

在编写类的时候,C++编译器会默认生成6个默认的函数,但是不显示出来:
在这里插入图片描述
需要关注以下两个方面:

第一:我们不写时,编译器默认生成的函数行为是什么,是否满足我们的需求。
第二:编译器默认生成的函数不满足我们的需求,我们需要自己实现,那么如何自己实现?

2 构造函数

构造函数是一种特殊类型的方法,他在类的实例化时被使用。

2.1 一个例子来说明

创建一个Entity类,并给他写一个method,Print(),这样实例化后,调用Print就可以将x,y的值打印到控制台:

#include <iostream>class Entity
{
public:float X,Y; //二维坐标下的(x,y)点void Print(){std::cout<<X<<','<<Y<<std::endl;}
};int main()
{Entity e;e.Print();std::cin.get();return 0;
}

在低版本的编译器中,得到的输出是两个随机值,当然现在的编译器得到的结果是

0,0

因为X、Y是public的,因此我们可以打印X,Y试试

#include <iostream>class Entity
{
public:float X,Y; //二维坐标下的(x,y)点void Print(){std::cout<<X<<','<<Y<<std::endl;}
};int main()
{Entity e;std::cout<<e.X<<e.Y<<std::endl;e.Print();std::cin.get();return 0;
}

还是对于高版本的编译器,输出为

00
0,0

但是对于低版本的编译器,则会报错:未初始化局部变量。

2.2 诞生需求

默认为低版本编译器。我们需要在创建实例时,就把X和Y初始化为0,0而不是一个随机值。要一个新的方法。

2.3 Init()方法

在class中添加Init(),来初始化

#include <iostream>class Entity
{
public:float X,Y; //二维坐标下的(x,y)点void Init(){X = 0.0f;Y = 0.0f;}void Print(){std::cout<<X<<','<<Y<<std::endl;}
};int main()
{Entity e;e.Init();std::cout<<e.X<<e.Y<<std::endl;e.Print();std::cin.get();return 0;
}

此时,在低版本编译器下输出也为:

00
0,0

成功完成了初始化。

但是:这样我们每创建一个实例,都需要调用一次Init,这样十分的麻烦。

2.5 诞生新需求

新需求:我们创建实例的时候就自动完成了Init()类似的操作,不需要额外的代码

2.6 构造函数的诞生

2.6.1 构造函数的特点
1. 没有返回值,不需要写返回值类型
2. 函数名与类名一致
3. 对象实例化时系统会自动调用对应的构造函数。
4.构造函数可以重载。
5.如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函`数,一旦用户显式定义编译器将不再生成。
6.无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有一个存在,不能同时存在。无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结一下就是不传实参就可以调用的构造就叫默认构造。
7.我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。

e.g.

#include <iostream>class Entity
{
public:float X,Y; //二维坐标下的(x,y)点Entity(){X = 0.0f;Y = 0.0f;}void Print(){std::cout<<X<<','<<Y<<std::endl;}
};int main()
{Entity e;std::cout<<e.X<<e.Y<<std::endl;e.Print();std::cin.get();return 0;
}

output:

00
0,0

此为一个不带参数的构造函数。

2.6.2 带参数的构造函数

以下为带参数构造函数。注意,有两个构造函数,名字都是Entity,此为函数重载。但是构造函数没有重载。

#include <iostream>class Entity
{
public:float X,Y; //二维坐标下的(x,y)点Entity(){}Entity(float x,float y){X = x;Y = y; //用参数给成员变量赋值。}void Print(){std::cout<<X<<','<<Y<<std::endl;}
};int main()
{Entity e(10.0f,11.0f);std::cout<<e.X<<e.Y<<std::endl;e.Print();std::cin.get();return 0;
}

output

1011
10,11

2.6.3不想要默认的构造函数

#include <iostream>class Entity
{
public:float X,Y; //二维坐标下的(x,y)点Entity() = delete;void Print(){std::cout<<X<<','<<Y<<std::endl;}
};int main()
{Entity e;std::cout<<e.X<<e.Y<<std::endl;e.Print();std::cin.get();return 0;
}

因为没有默认的构造函数,此时会报错。

3 析构函数

析构函数是构造函数的对立。它用于销毁实例。

3.1 析构函数的特点

1.析构函数名是在类名前加上字符 ~。
2.无参数无返回值。(这里跟构造类似,也不需要加void)
3.一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
4.对象生命周期结束时,系统会自动调用析构函数。
5.跟构造函数类似,我们不写 编译器自动生成的析构函数,对内置类型成员不做处理,自定类型成员会调用他的析构函数。
6.还需要注意的是我们显示写析构函数,对于自定义类型成员也会调用他的析构,也就是说自定义类型成员无论什么情况都会自动调用析构函数。
7.如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,如Date;但是有资源申请时,一定要自己写析构,否则会造成资源泄漏,如Stack。
8.一个局部域的多个对象,C++规定后定义的先析构。

3.2 实例

#include <iostream>class Entity
{
public:float X,Y; //二维坐标下的(x,y)点Entity(){X = 0.0f;Y = 0.0f;std::cout<<"完成对象创建"<<std::endl;}~Entity(){std::cout<<"销毁对象完成"<<std::endl;}void Print(){std::cout<<X<<','<<Y<<std::endl;}
};int main()
{Entity e;std::cout<<e.X<<e.Y<<std::endl;e.Print();std::cin.get();return 0;
}

output

完成对象创建
00
0,0
销毁对象完成

析构函数是在对象的生命结束时运行,这个例子无法看出析构函数实在main函数结束时运行的,我们稍加修改:

#include <iostream>class Entity
{
public:float X,Y; //二维坐标下的(x,y)点Entity(){X = 0.0f;Y = 0.0f;std::cout<<"完成对象创建"<<std::endl;}~Entity(){std::cout<<"销毁对象完成"<<std::endl;}void Print(){std::cout<<X<<','<<Y<<std::endl;}
};void func()
{Entity e;e.Print();
}int main()
{func();std::cout<<"HellO"<<std::endl;std::cin.get();return 0;
}

只要hello是在“销毁对象完成”之后打印的,就证明析构函数是在函数作用域结束的时候调用的。

output:

完成对象创建
0,0
销毁对象完成
HellO

成功证明。
当然用visual studio调试也可以证明。

总之析构函数就防止内存泄露的。


文章转载自:

http://OmabjaGV.mnsmb.cn
http://Js6y82YI.mnsmb.cn
http://aLFzuv6m.mnsmb.cn
http://h9QRuSkW.mnsmb.cn
http://6GYeprMX.mnsmb.cn
http://xe6HJzzH.mnsmb.cn
http://jQnwZywz.mnsmb.cn
http://Cdp9qHfG.mnsmb.cn
http://LGjrKcq9.mnsmb.cn
http://ULatxJWc.mnsmb.cn
http://rMOC1rPj.mnsmb.cn
http://Rsl4TagC.mnsmb.cn
http://XTjIL6Tn.mnsmb.cn
http://vn0MOysQ.mnsmb.cn
http://maMcpnqV.mnsmb.cn
http://Za1Tr1nj.mnsmb.cn
http://OqebkO0H.mnsmb.cn
http://9UVTvSiu.mnsmb.cn
http://GoPy5uXK.mnsmb.cn
http://fMAUNii5.mnsmb.cn
http://y7JK98VO.mnsmb.cn
http://3g19pVmh.mnsmb.cn
http://wGXGOjVh.mnsmb.cn
http://CODzm7ld.mnsmb.cn
http://WmPz9kLU.mnsmb.cn
http://T3J2X8ey.mnsmb.cn
http://n1qNSKwc.mnsmb.cn
http://3fWY9QJX.mnsmb.cn
http://DaPG3fQI.mnsmb.cn
http://YBs9S1sX.mnsmb.cn
http://www.dtcms.com/wzjs/646898.html

相关文章:

  • 淘宝客怎么做网站网站建设方案书 模板
  • 网站的建设包括以下几个阶段有做足球裁判跑动数据的网站吗
  • 固定在网站底部做查询快递单号的网站多少钱
  • 游戏是怎么做的视频网站网站未被百度中收录的原因
  • 做设计去哪个网站找素材上海仿站定制模板建站
  • 哪些网站做推广效果好怎样建设简单的网站
  • 安徽省卫生计生网站医共体建设提升wordpress访问速度
  • 做网站的专业网站建设行业swot分析
  • 家电网站建设费用杭州经济技术开发区建设局网站
  • 建筑材料价格查询网站代理网络app
  • 企业所得税税率表2022年狼雨seo培训
  • 响应式布局网站模板国家再就业免费培训网
  • php做网站界面代码佛山营销网站建设联系方式
  • 公司想建个网站怎么弄网站建设365
  • 给网站添加后台包工头如何找工程项目
  • 网站logo上传小程序开发平台好牌子推荐
  • 苏州吴中区专业做网站南京做企业号微网站营销
  • 成都 做网站wordpress付费插件网站
  • 滕州市住房城乡建设局网站网站建设公司文案
  • 新乡网站建设专业熊掌网络上海网站建设工作室
  • 实木餐桌椅网站建设欧美风的网站设计
  • 服务器搭建网站步骤视频上海国际人才网
  • 网站建设服务公司哪家好常州免费企业网站建设
  • 成都品牌网站建设360广告联盟平台
  • 哪些网站可以做任务挣钱深圳企业信用网
  • 佛山智唯网站建设广告软文范例200字
  • 怎么把网站做10万ippython制作网页的基本步骤
  • 如何做财经网站团队拓展总结
  • 打开网上免费网站吗企业网站推广推广阶段
  • 网站图片最大尺寸小程序定制开发多少钱一个