浅谈构造函数和析构函数
发布日期:2022-02-07 06:39:45 浏览次数:5 分类:技术文章

本文共 2539 字,大约阅读时间需要 8 分钟。

类成员函数

先了解好类的一些基础知识

大纲:
1. 类的构造函数与析构函数
1. 对象的初始化
2. 对象的销毁

在开始写之前

我们先来尝试实现一个矢量类
二维的矢量由两个变量决定
我们先来用x,y 表示
然后该矢量还应该有这样的成员函数
show(),
用于查看这个矢量的坐标值
还有矢量的标量乘法
我们用
multiple(int)
还有很多其他的以后再实现
(运算符重载以后再写)

//由于比较短小,暂时不分文件#include 
class 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

程序结束后

自动调用析构函数来释放对象

总结

  1. 构造函数和析构函数的原型要记住
  2. 掌握构造函数和析构函数的调用时期
  3. 类的各种初始化
  4. new一个对象时的初始化方式

然后我们的Vector类变成了这样

//由于比较短小,暂时不分文件#include 
class 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:python 首页探秘(高级编程技术week1-1)
下一篇:继续实现Vector类

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月15日 16时07分01秒