C++ 4.2构造函数和析构函数

先给个具体说明

  • 构造函数是给数据成员用来初始化的初始化
  • 析构函数是当object结束时,自动调用处理善后(比如申请了某块内存,结束时在析构函数里释放)

相似之处:

  1. 无返回值
  2. 名称和类一样

区别:
构造函数:初始化成员参数,可以重载,可以带参数

class Triangular
{
    
    
    public:
        Triangular();//总共三个初始化函数
        Triangular( const Triangular &tri);//拷贝构造函数
        Triangular(int len = 1, int beg_pos = 1);//默认参数只需给出一次即可
        virtual ~Triangular();

    protected:

    private:
        int _length;
        int _beg_pos;
        int _next;
        string _name;
};

Triangular::Triangular(const Triangular &tri) : _length(tri._length),
                            _beg_pos(tri._beg_pos),_next(tri._beg_pos-1),_name("Triangular")//成员列表初始化,拷贝构造函数
{
    
    //在这里会遇到一个疑惑,
//能不能用 _beg_pos-1 给 next,问题暂存
}

Triangular::Triangular()
{
    
    
    _length = 1;
    _beg_pos =1;
    _next = 0;
}

Triangular::Triangular(int len, int beg_pos):_name("Triangular")
{
    
    
    _length = len>0 ? len : 1;
    _beg_pos = beg_pos ? beg_pos :1;
    _next = _beg_pos -1;
}

Triangular::~Triangular()
{
    
    
    //dtor
}

调用

Triangular tri1;
Triangular tri4 = tri1;
Triangular tri2(12);//tri2和tri3调用的是同一个构造函数
Triangular tri3(19,2);

析构函数:class名称上加上~(这个符号在字母数字键盘1的隔壁),没有参数,不能重载。

class Matrix
{
    
    
public:
    Matrix (int row, int col);
    ~Matrix();
private:
    int _row, _col;
    double* _pmat;
};

Matrix::Matrix(int row, int col): _row(row), _col(col)
{
    
    
    cout<< "new " << row*col<<endl;
    _pmat = new double[row*col];//括号不要写错
}

Matrix::~Matrix()
{
    
    
    cout<< "delete " <<endl;
    delete [] _pmat;
}

运行下看看效果

#include <iostream>
#include "Triangular.h"
using namespace std;

int main()
{
    
    
    cout << "Hello world!" << endl;

    Matrix t1(4,4);

    return 0;
}

在这里插入图片描述
现在我们回看前面代码

Triangular tri1(12;
Triangular tri4 = tri1;
Triangular  tri5(tri1);//同样使用了拷贝构造函数

这样的操作,tri1会将数据复制给tri4,但是对于Matrix这个类来说,如果执行这个操作。

Matrix t1(4,4);
Matrix t2 = t1;//

这会导致t2._pmat = t1._pmat指向同一内存,当析构函数开始执行,会将同一内存重复释放,所以我们需要自己写一个拷贝构造函数

class Matrix
{
    
    
public:
	.....
    Matrix (const Matrix &rhs);
	.....
private:
	......
};

Matrix::Matrix(const Matrix &rhs):_row(rhs._row),_col(rhs._col)
{
    
    
	 cout<< "copy " <<endl;
     cout<<_row<<"  "<<_col<<endl;
	int elem_cnt = _row*_col;
	_pmat = new double[elem_cnt];
	for(int i = 0; i<elem_cnt;i++)
	{
    
    
		_pmat[i] = rhs._pmat[i];
	}
}

尝试运行下

int main()
{
    
    
    cout << "Hello world!" << endl;

    Matrix t1(4,4);
    Matrix t2 = t1;

    return 0;
}

在这里插入图片描述

注意了,由于我自己的粗心,申请数组的地方写错了,导致我运行后代码看不到想要的效果,怀疑人生了都。

_pmat = new double(rowcol);//错误的写法
数组的申请不能用圆括号
_pmat = new double[row
col];//正确的写法

猜你喜欢

转载自blog.csdn.net/weixin_43387612/article/details/107146838