我是靠谱客的博主 长情滑板,最近开发中收集的这篇文章主要介绍计算机程序设计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;
}

最后

以上就是长情滑板为你收集整理的计算机程序设计c++ 10-1:构造函数及重载的全部内容,希望文章能够帮你解决计算机程序设计c++ 10-1:构造函数及重载所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部