计算机程序设计c++ 10-1:构造函数及重载

类的共性

  • 数据成员都是私有化成员,外界不能直接访问
  • 都有一个成员函数,用来设置数据成员
  • 该函数可以在需要时调用,达到随时修改数据成员
  • 数据成员值读出必须通过相关成员函数

构造函数的定义

  • 声明一个对象后,紧接着要给对象初始化
  • 对象初始化实质上就是对所有数据成员赋值
  • 如果对象中某个数据成员未赋值,则该数据成员的值不确定,那么该对象的值不完整
  • 构造函数(Constructor)用于创建一个对象,提供了初始化该对象的一种简便手段
  • 注意在所有类的定义中都有一个成员函数完成
  • 初始化数据成员,这个函数就可以当成构造函数

构造函数的语法格式

<类名>(<参数表>)
{
    
    
	<函数体>
};

注意事项

  • 构造函数的函数名必须与类名相同
  • 构造函数没有返回值
  • 其功能是将对象中的所有数据成员进行初始化,一般由一系列赋值语句构成
  • 系统在声明对象时自动调用

之前的日期类

class Date {
    
    
	private:
		int year,month,day;
	public:
		void init(int,int,int );
		void print_ymd();
		void print_mdy();
		int get_year() {
    
     return year; }
		int get_month() {
    
     return month; }
		int get_day() {
    
     return day; }
};

void Date::init(int yy,int mm,int dd) {
    
    
	month = (mm>=1&&mm<=12) ? mm: 1;
	year = (yy>=1900&&yy<=9999) ? yy:1900;
	day=(dd>=1&&dd<=31) ? dd:1;
};

可以看到,要想初始化的时候要调用init函数。

在日期类中增加构造函数

#include<iostream>
using namespace std;
class Date
{
    
     
	int year, month, day;

	public:
		Date(int y=1900, int m=1, int d=1)  // 构造函数,默认值
		{
    
    
			year = y; month = m; day = d;
		}
		
	void init(int,int,int );
	void print_ymd();
	void print_mdy();
};

void Date::init(int yy,int mm,int dd)
{
    
     
	month = (mm>=1&&mm<=12) ? mm:1;
	year = (yy>=1900&&yy<=9999) ? yy:1900;
	day = (dd>=1&&dd<=31) ? dd:1;
};

日期类构造函数测试

void Date::print_ymd()
{
    
     cout << year << "-" << month << "-" << day << endl;}


void Date::print_mdy()
{
    
     cout << month << "-" << day << "-" << year << endl;}


int main()
{
    
    
	Date date1; //创建一个日期类对象,并以默认值初始化
	date1.print_ymd(); //显示初始化数据的情况
	date1.init(2006, 3, 28); //修改数据成员
	date1.print_ymd(); //显示修改数据的情况
	Date date2(2013, 11, 26); //再创建一个日期类对象,并初始化
	date2.print_mdy();
	date2.init(2006, 13, 38);
	date2.print_ymd();
	return 0;
}

有无构造函数的区别

在前面章节中的程序声明变量

  • int a=0; 或int a(0);
  • struct Date today = {2013, 3, 19};
  • 或struct Date today(2013, 3, 19);
  • 以上为变量声明的同时赋初值,即都允许初始化

对于无构造函数的类,声明变量(对象)不允许初始化

  • 例如 CLOCK alarm = {10, 53, 11};×
  • CLOCK alarm(10, 53, 11)×

有构造函数就允许初始化

  • 例如:Date birthday(1998, 12, 12); √ 在创建的时候初始化
  • Date birthday = {1998, 12, 12}; ×

构造函数的重载

回归函数重载
若干个不相同的函数允许共用一个函数名称

下面3个排序函数共用一个函数名称

  • void sort(int a[],int n); //采用冒泡排序方法
  • void sort(float a[],int n); //采用快速排序方法
  • void sort(double a[],int n); //采用选择排序方法

调用运行时根据实际参数确定哪一个函数运行

重载构造函数

  • 一个类中允许定义多个构造函数
  • 将日期类再增加一个构造函数
Date()
{
    
    
	Year=1900; Month=1; Day=1;
}
  • 在声明对象时自动选择执行某个构造函数

数据成员初始化的四种方法

1. 在构造函数的函数体中进行初始化
Date(Date &d){year=d.year; month=d.month; day=d.day;}

2. 在构造函数的头部初始化
类名::构造函数名(参数表): 变量1(初值1), …变量n(初值n) {…}
例如:Date::Date(): year(1900), month(1), day(1) {}

3. 混合初始化:前两种方式结合
例如:Date::Date(int y, int m, int d): year(y), month(m) {day=d; }

4. 使用默认参数初始化

Date(char yy[], int mm=1, int dd=1)
{
    
     
	year = atoi(yy);
	month = mm;
	day = dd;
}

日期类中4个重载构造函数

#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;

class Date
{
    
    
	int year,month,day;
	
	public:
	Date():year(1900), month(1), day(1) {
    
     } //无参构造函数
	Date(int yy, int mm=1, int dd=1); //默认参数构造函数
	Date(Date&d):year(d.year), month(d.month), day(d.day){
    
    };//日期对象参数构造函数
	Date(char *ps); //字符串日期构造函数
	void print_ymd();
};

默认构造函数的类外定义

  • Date::Date(int yy, int mm, int dd)
Date::Date(int yy, int mm, int dd):year(1900),month(1),day(1)
{
    
    
	if (yy>=1900&&yy<=9999)
		year = yy;
	else
	{
    
    
		return;
	}
	
	if (mm>=1&&mm<=12)
		month = mm;
	else
	{
    
    
		year=1900;
		return;
	}
	
	if (dd>=1&&dd<=31)
		day = dd;
	else
	{
    
    
		year=1900;
		month=1;
		return;
	}
};
  • Date::Date(char *ps):year(1900),month(1),day(1)
Date::Date(char *ps): year(1900), month(1), day(1)
{
    
     
	char py[5],pm[3],pd[3];
	strncpy(py, ps, 4);

	ps = ps+5;
	strncpy(pm, ps, 2);

	ps = ps+3;
	strncpy(pd, ps, 2);

	int yy=atoi(py), mm=atoi(pm), dd=atoi(pd);
	if (yy>=1900 && yy<=9999)
		year = yy;
	else
		return;

	if (mm>=1 && mm<=12)
		month = mm;
	else
		{
    
     year = 1900;
		  return;
		}

	if (dd>=1 && dd<=31)
		day = dd;
	else
		{
    
     year = 1900;
		  month = 1;
	      return;
		}
}

日期类重载构造函数测试

int main()
{
    
    
	Date date1; //使用无参构造函数
	cout << "date1:";
	date1.print_ymd();
	
	Date date2(2006); //默认参数构造
	cout << "date2:";
	date2.print_ymd();

	Date date3(2006, 4); //默认参数构造
	cout << "date3:";
	date3.print_ymd();
	
	Date date4(2006, 4, 8); //默认参数构造
	cout << "date4:";
	date4.print_ymd();

	Date date5(2006, 14, 8); //默认参数构造
	cout << "date5:";
	date5.print_ymd();

	Date date6(date4); //日期对象参数构造函数
	cout << "date6:";
	date6.print_ymd();

	Date date7("2008-08-08"); //字符串日期构造函数
	cout << "date7:";
	date7.print_ymd();
	return 0;
}

Guess you like

Origin blog.csdn.net/uncle_ll/article/details/121727620