#include<iostream>
using namespace std;
//一、Constructor
class Triangular
{
public:
Triangular(); //(1)constructor不应返回类型,亦不用返回任何值。可以被重载。
Triangular(int len);
Triangular(int len, int beg_pos);
Triangular(int len = 1,int bp = 1);//(1)default constructor,为每个参数提供默认值
Triangular(const Triangular &rhs);
private:
int _length;
int _beg_pos;
int _next;
string _name; //(3)重定义Triangular,后添加
};
Triangular::Triangular() //(1)default constructor,不需要任何参数
{
_length = 1;
_beg_pos = 1;
_next = 0;
}
Triangular::Triangular(int len, int bp)
{
_length = len > 0 ? len : 1;
_beg_pos = bp > 0 ? bp : 1;
_next = _beg_pos - 1;
}
//(2)Constructor 第二种初始化 -成员初始化列表
Triangular::Triangular(const Triangular &rhs) :_length(rhs._length)
, _beg_pos(rhs._beg_pos), _next(rhs._beg_pos - 1){};
//(3)为了将_name的初值传给string constructor,必须使用各成员列表初始化完成初始化
Triangular::Triangular(int len, int bp):_name("Triangular")
{
_length = len > 0 ? len : 1;
_beg_pos = bp > 0 ? bp : 1;
_next = _beg_pos - 1;
}
//二、Destructor
//Destructor绝不会有返回值,也没有任何参数。绝不可能被重载。
//何时需要定义destructor是最难部分之一。
class Matrix
{
public:
Matrix(const Matrix &rhs);
Matrix(int row, int col) :_row(row), _col(col)
{
_pmat = new double[row*col];
}
~Matrix()
{
delete[]_pmat;
}
private:
int _row;
int _col;
double* _pmat;
};
//三、成员逐一初始化,设计类时,要考虑是否在类之上进行“成员逐一初始化”,是否适当?
//若适当,则不需要copy constructor。若否定,则需要copy constructor
Matrix::Matrix(const Matrix &rhs) :_row(rhs._row), _col(rhs._col) //copy constructor
{
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()
{
//everything will be ok
Triangular tri1(8);
Triangular tri2 = tri1; //此处,类成员会依次被复制
//will be wrong
//逐一初始化,则指针指向同一块内存,析构两次。是错误的。故需copy constructor
Matrix mat(4, 4); //调用构造函数
{
Matrix mat2 = mat;//进行逐一成员初始化
//调用mat2析构函数
}
//调用mat1析构函数
return 0;
}