0
点赞
收藏
分享

微信扫一扫

HarmonyOS入门

他说Python 2024-08-03 阅读 34

一、类的默认成员函数

  默认成员函数就是用户没有显式实现,编译器自动生成成员函数。在C++中,共有6个默认成员函数,其中前四个尤为重要,分别是:构造函数、析构函数、拷贝构造函数、赋值重载函数。

二、构造函数

  构造函数是用来初始化类内部成员的函数,在实例化一个对象时自动调用

2.1 构造函数的特点

class Date 
{
public:
	void Print()
	{
		cout << _year << '/' << _month << '/' << _day << endl;
	}
	//构造函数(全缺省)
	Date(int year = 2000, int month = 6, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;

};

int main()
{
    Date date1;//调用构造函数,使用缺省值
    Date date2(2005,12,20);//调用构造函数,使用实参值

    return 0;
}

三、析构函数

  析构函数与构造函数的作用相反,它不是销毁对象本身,而是在对象的生命周期结束时,用来释放对象内的资源(指动态开辟的内存等)的函数。在一个对象的生命周期结束时自动调用。

3.1 析构函数的特点

class Date 
{
public:
	void Print()
	{
		cout << _year << '/' << _month << '/' << _day << endl;
	}
	//构造函数(全缺省)
	Date(int year = 2000, int month = 6, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
        _a = (int*)malloc(sizeof(int)*5);
	}
    //析构函数
    ~Date()
	{
		free(_a);
	}
private:
	int _year;
	int _month;
	int _day;
    int* _a;

};

int main()
{
    Date date1;//调用构造函数,使用缺省值
    Date date2(2005,12,20);//调用构造函数,使用实参值

    return 0;  //调用 date1 和 date2的析构函数,date2先析构。
}

四、拷贝构造函数

  拷贝构造函数是一种特殊的构造函数,它的作用是用现有的一个对象来初始化和这个对象同类型的对象

4.1 拷贝构造函数的特点

4.2 关于无限递归的原因

//类中的拷贝构造函数
Date(const Date& date)
{
	_year = date._year;
	_month = date._month;
	_day = date._day;
}
int main()
{
	Date date(2024, 8, 1);//传值构造
	date.Print();
	
	Date date2(date);//拷贝构造
	date2.Print();
	Date date3 = date2;//拷贝构造,和上面的写法等价
	date3.Print();

	return 0;
}

五、赋值重载函数

5.1 运算符重载

5.1.1 代码示例 

class Date 
{
public:
	void Print()
	{
		cout << _year << '/' << _month << '/' << _day << endl;
	}
	//获取当前的月份天数
	int GetMonthDay(int year, int month)
	{
		static int Month[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
		if (month == 2 && ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)))
		{
			return 29;
		}
		else
			return Month[month];
	}
	//构造函数
	Date(int year = 2000, int month = 6, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//析构函数 可写可不写
	~Date(){}
	//拷贝构造函数
	Date(const Date& date)
	{
		_year = date._year;
		_month = date._month;
		_day = date._day;
	}
/*===========================================================================*/
   //(类外实现)运算符重载函数
	// 日期+=天数
	Date& operator+=(int day);
	// 日期+天数
	Date operator+(int day);
	// 日期-天数
	Date operator-(int day);
	// 日期-=天数
	Date& operator-=(int day);
	
private:
	int _year;
	int _month;
	int _day;

};
Date& Date::operator+=(int day)
{
	_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		++_month;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}
	}
	return *this;
}
Date& Date::operator-=(int day)
{
	_day -= day;
	while (_day < 0)
	{
		_day += GetMonthDay(_year, (_month - 1) == 0 ? 12 : (_month - 1));
		--_month;
		if (_month == 0)
		{
			_year--;
			_month = 12;
		}
	}
	return *this;
}

// 日期+天数
Date Date::operator+(int day)
{
	Date date = *this;
	date += day;
	return date;
}
// 日期-天数
Date Date::operator-(int day)
{
	Date date = *this;
	date -= day;
	return date;
}

 5.1.2 调用示例

int main()
{
	Date date(2024, 8, 1);//传值构造
	date.Print();
	
    //以下两种写法等价,以+=运算示例
	date.operator+=(300);
	date += 300;

	date.Print();

	return 0;
}

5.2 赋值重载

//类中的赋值运算符重载函数
Date& operator=(const Date& date)
{
	_day = date._day;
	_month = date._month;
	_year = date._year;

	return *this;
}
int main()
{
	Date date(2024, 8, 1);//传值构造
	date.Print();
	
	Date date2(2000, 1, 1);
	date2.Print();

	//赋值重载,以下两种写法等价
	date2 = date;
	date2.operator=(date);

	date2.Print();

	return 0;
}
举报

相关推荐

0 条评论