浅谈构造函数和析构函数
发布日期:2022-02-07 06:39:45
浏览次数:5
分类:技术文章
本文共 2539 字,大约阅读时间需要 8 分钟。
类成员函数
先了解好类的一些基础知识
大纲: 1. 类的构造函数与析构函数 1. 对象的初始化 2. 对象的销毁
在开始写之前
我们先来尝试实现一个矢量类 二维的矢量由两个变量决定 我们先来用x,y 表示 然后该矢量还应该有这样的成员函数 show(), 用于查看这个矢量的坐标值 还有矢量的标量乘法 我们用 multiple(int) 还有很多其他的以后再实现 (运算符重载以后再写)//由于比较短小,暂时不分文件#includeclass Vector{private: int x; int y;public: void show(); void multiple(int);};void Vector::show(){ using namespace std; cout << x << "," << y << endl; return ;}void Vector::multiple(int m){ x *= m; y *= m; return ;}
构造函数与析构函数
构造函数
在声明对象的时候 (如声明一个v的Vector对象)Vector v;
就会自动调用构造函数进行初始化析构函数
在对象过期或程序结束销毁变量的时候 就会自动调用析构函数来销毁对象
有问题了
一开始自己写类的时候都不知道构造函数和析构函数是什么鬼
为什么程序也能正常运行,正常初始化,正常销毁在用户没有自定义构造函数和析构函数的前提下
类会自动生成默认构造函数和默认析构函数构造函数(constructor)
原型:
函数名与类名相同 形参列表自己定义 会返回一个对象,不过不用在函数中写出 如Vector类的构造函数可以这样定义Vector(){};
这个函数不需要输入数据,也不进行任何操作 实际上这个就是默认构造函数 在不声明任何析构函数的情况下会自动声明默认析构函数
在自定义了析构函数之后就不会再自动声明默认析构函数 析构函数可以重载
析构函数(destructor)
原型:
函数名是在类名前加上~; 不接受任何参数,也不返回任何值 如Vector类的析构函数可以这样定义~Vector(){};
不做任何事情的它,实际上 就是Vector类的默认析构函数 在不声明任何构造函数的情况下会自动声明默认构造函数
在自定义了构造函数之后就不会再自动声明默认构造函数 构造函数可以重载
如何初始化类
先弄明白在声明对象的时候
会怎样调用构造函数 之前的Vector v;
声明一个名字为v的Vector变量 实际上等同于这样 Vector v()
它调用了Vector类的默认构造函数 Vector();
因此它什么也不做,里面的所有变量也没有初始化 那我自己定义一个构造函数
//函数在类中的原型Vector(int , int);//函数定义//注意在类的外部,需要用作用域解析运算符访问类的内部Vector::Vector(int a, int b){ x = a; y = b;}
当有了这个构造函数之后
我们就可以这样Vector v(2,3);
这样,在初始化的时候就会自动调用我自己定义的构造函数 然后就能够把v对象中的x和y初始化 总结
对象的初始化方式 注意含有花括号的为c++11中的列表初始化// 调用默认构造函数Vector v;Vector v();Vector v{};Vector v = {};//调用自己的构造函数Vector v(2,3);Vector v {2,3};Vector v = {2,3}
如果用new的话,还可以这样
Vector *pv = new Vector;Vector *pv = new Vector();Vector *pv = new Vector(2,3);Vector *pv = new Vector{ 2,3};
对象的销毁
每生成一个对象,一定需要对应着一个销毁的过程
默认的析构函数 虽然语句什么都没有~Vector() {};
但是析构函数会执行释放对象里的成员的操作 情况1
声明局部对象
在离开代码块后,自动执行析构函数情况2
new了一个对象
Vector *pv = new Vector
在我delete的时候
delete pv;
就会自动调用析构函数来释放对象 情况3
程序结束后
自动调用析构函数来释放对象总结
- 构造函数和析构函数的原型要记住
- 掌握构造函数和析构函数的调用时期
- 类的各种初始化
- new一个对象时的初始化方式
然后我们的Vector类变成了这样
//由于比较短小,暂时不分文件#includeclass Vector{private: int x; int y;public: Vector() {};//默认构造函数 Vector(int a, int b);//自定义构造函数 ~Vector(){};//析构函数 void show(); void multiple(int);};Vector::Vector(int a, int b){ x = a; y = b;}void Vector::show(){ using namespace std; cout << x << "," << y << endl; return ;}void Vector::multiple(int m){ x *= m; y *= m; return ;}
提醒一下:
声明对象的时候当然可以声明对象数组Vector array[10];
但是,声明对象数组有个前提 该对象必须有默认构造函数 原因:Vector array[2] = { {2,3},{3,4}};
在初始化对象数组的时候,首先使用默认构造函数创建数组元素 然后花括号中的构造函数讲创建临时变量,然后将临时对象的内容复制到相应的成员 调用默认构造函数的过程是无法避免的
转载地址:https://blog.csdn.net/wyfwyf12321/article/details/54731191 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月15日 16时07分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
模拟器连接端口汇总和常用ADB命令
2019-04-27
ShaderGraph使用教程与各种特效案例:Unity2020(持续更新)
2019-04-27
Unity爆炸、闪电、火焰、雷雨特效Demo
2019-04-27
使用python登录和访问Confluence
2021-06-30
Unity2020中使用MemoryProfile卡死和报错的问题
2021-06-30
Unity中加载Texture2D不断消耗内存的问题
2021-06-30
手把手教你使用Unity制作一个飞机喷射火焰尾气的粒子效果
2021-06-30
gitee使用教程,创建项目仓库并上传代码
2021-06-30
Unity3D 上传日志
2021-06-30
Unity3D 序列帧
2021-06-30
Unity3D 动态创建图集并压入精灵(NGUI)
2021-06-30
C# 将Excel转xml
2021-06-30
Unity3D log写入文件
2021-06-30
Unity3D动态创建摄像机
2021-06-30
unity 根据纪元时间(1970/1/1)转换为DateTime
2021-06-30
C# 字符串md5加密
2021-06-30
unity3D 拖拽旋转3D物体
2021-06-30