先给个具体说明
- 构造函数是给数据成员用来初始化的初始化
- 析构函数是当object结束时,自动调用处理善后(比如申请了某块内存,结束时在析构函数里释放)
相似之处:
- 无返回值
- 名称和类一样
区别:
构造函数:初始化成员参数,可以重载,可以带参数
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[rowcol];//正确的写法