浅谈构造函数和析构函数

类成员函数

先了解好类的一些基础知识
大纲:
1. 类的构造函数与析构函数
1. 对象的初始化
2. 对象的销毁

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

//由于比较短小,暂时不分文件
#include <iostream>
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 <iostream>
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}};
在初始化对象数组的时候,首先使用默认构造函数创建数组元素
然后花括号中的构造函数讲创建临时变量,然后将临时对象的内容复制到相应的成员
调用默认构造函数的过程是无法避免

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值