《Essential C++》系列笔记之第四章(基于对象的编程风格)之第二节(什么是构造函数和析构函数)

《Essential C++》系列笔记之第四章(基于对象的编程风格)之第二节(什么是构造函数和析构函数)_第1张图片
代码实践

  • main.cpp

    #include 
    using namespace std;
    #include "Matrix.h"
    #include "Triangular.h"
    
    void demo_1()
    {
    	Matrix mat(1, 2);
    
    	//这句话就会触发拷贝构造  等价于Matrix mat2(mat);
    	Matrix mat2 = mat; //如果没有拷贝构造,会发生同一片区域被重复释放的严重问题!
    }
    
    int main()
    {
    	demo_1();
    
    	system("pause");
    	return 0;
    }
    
  • Matrix.h

    #pragma once
    #include 
    using namespace std;
    
    class Matrix
    {
    public:
    	Matrix(int rol = 0, int col = 0)
    		: _row(rol), _col(col)
    	{
    		cout << "Matrix()" << endl;
    		_pmat = new double[rol * col];
    	}
    
    	//提供一个拷贝构造,解决同一内存重复释放的问题 
    	/*Matrix(const Matrix& rhs)
    		:_row(rhs._row), _col(rhs._col)
    	{
    		_pmat = new double[_row * _col];
    
    		for (int ix = 0; ix < _row * _col; ix++)
    		{
    			_pmat[ix] = rhs._pmat[ix];
    		}
    	}*/
    	Matrix(const Matrix& rhs);
    
    	~Matrix()
    	{
    		cout << "~Matrix()" << endl;
    		delete[] _pmat;
    	}
    
    private:
    	int _row, _col;
    	double* _pmat;
    };
    
  • Matrix.cpp

    #include "Matrix.h"
    
    //拷贝构造函数可以写在.cpp文件中,但只能有一个
    Matrix::Matrix(const Matrix& rhs)
    	:_row(rhs._row), _col(rhs._col)
    {
    	_pmat = new double[_row * _col];
    
    	for (int ix = 0; ix < _row * _col; ix++)
    	{
    		_pmat[ix] = rhs._pmat[ix];
    	}
    }
    
  • Triangular.h

    #pragma once
    #include 
    using namespace std;
    
    class Triangular
    {
    public:
    	//重载的构造函数
    	Triangular();
    	Triangular(int len);
    	//Triangular(int len, int beg_pos); //第一种默认构造
    	Triangular(int len = 1, int beg_pos = 1); //第二种默认构造
    
    private:
    	int _length;
    	int _beg_pos;
    	int _next;
    	string _name;
    };
    
    
    
  • Triangular.cpp

    #include "Triangular.h"
    
    //第一种:不接受任何参数的默认构造
    Triangular::Triangular()
    {
    	_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;
    //}
    
    //另外一种初始化语法(成员初始化列表),有了这个上面的第二种就不能同时存在,防止二义性
    Triangular::Triangular(int len, int bp)
    	: _name("Triangular"), _length(len > 0 ? len : 1),
    	_beg_pos(bp > 0 ? bp : 1), _next(_beg_pos - 1)
    {}
    	
    

今天是20200316 还花呗啦~

你可能感兴趣的:(《Essential,C++》系列笔记)