为此,C++提供了一个更好的方法,就是利用类的构造函数来初始化类的数据成员。构造函数具有如下几个特点:构造函数名与类名相同,且没有返回值,不能指定函数类型。构造函数通常被声明为公有属性,但它不能像其他成员函数那样被显式地调用,它是在创建对象时被系统自动调用的。例如,可以将例2.1的MyClass类扩展为MyClass2,使其包含两个构造函数:上述类中包含两个构造函数:一个没有参数,另一个有两个参数。......
2023-11-07
【例2.27】编写一个程序,设计一个满足如下要求的CDate类,用数据进行调试并输出结果:
(1)用日/月/年格式输出日期
(2)可进行日期加一天的操作
(3)设置日期
解:设计一个日期类CDate,包含m_nYear(年),m_nMonth(月)和m_nDay(日)等3个私有数据成员,另外设计如下成员函数:
◇CDate():默认构造函数;
◇CDate(int,int,int):重载构造函数;
◇Display():以指定的格式输出日期;
◇AddDay():返回当前日期加1后的日期;
◇SetDate(int,int,int):用指定参数设置当前日期;
◇~CDate():析构函数;
◇IsLeapYear():判断当前年是否为闰年。
其中,IsLeapYear()函数只在内部使用,因此设计成私有成员函数,其他函数均为公有成员函数。
在main主函数中,定义CDate类的一个对象date,根据用户输入调用SetDate成员函数设置当前日期,再调用Display成员函数输出当前日期,然后调用AddDay成员函数将当前日期加1天,最后调用Display成员函数输出加1天后的日期。程序如下:
本程序的一次执行结果如下:
年月日:2019 3 18↙
当前日期:2019年3月18日
当前日期加1:2019年3月19日
【例2.28】编写一个程序,有若干教师和研究生,每个研究生有且仅有一名指导教师,每个教师可以带若干名研究生,建立一个教师对象数组和研究生对象数组,通过相关函数为每个研究生指定指导教师,最后输出所有研究生的完整信息和所有教师的完整信息。
解:设计一个教师类Teacher和一个研究生类Graduate,后者包含有一个Teacher类对象成员,前者包含有一个Graduate类对象指针数组。在Graduate类中设计有setteacher()成员函数用于设置每个研究生的导师。完整的程序如下:
程序的执行结果如下:
研究生列表
学号:201姓名:张三 导师:王进(101,副教授)
学号:202姓名:李四 导师:李清(103,教授)
学号:203姓名:王五 导师:陈果(102,教授)
学号:204姓名:刘六 导师:李清(103,教授)
学号:205姓名:赵七 导师:王进(101,副教授)(www.chuimin.cn)
教师列表
王进(101,副教授)
指导研究生人数:2
学号:201姓名:张三
学号:205姓名:赵七
陈果(102,教授)
指导研究生人数:1
学号:203姓名:王五
李清(103,教授)
指导研究生人数:2
学号:202姓名:李四
学号:204姓名:刘六
上述程序中,有两个难点需要进一步说明:
(1)在Graduate类中设计了一个导师对象t(一个研究生只有一名导师),而为什么Teacher类中不直接使用Graduate类对象数组,而使用Graduate类对象数组指针呢?
这是因为前向引用声明的规定,若在Teacher类中直接使用Graduate类对象数组,而此时Graduate类只是一个替换标识符,尚未声明,因此不能为这样的对象数组元素分配存储空间,而对象数组指针是可以分配存储空间的,因为在C++中每个指针,不论指向何种数据,分配的存储空间大小均为4个字节。
(2)设计Graduate类的成员函数setteacher,其代码如下:
其中,this指针是指向当前的研究生对象,例如,若s是一个研究生对象,t是一个教师对象,则执行s.setteacher(t)时,this就指向s对象(即this=&s),这样就可以执行t.assgraduate(&s)将s作为t的一个研究生加入t的研究生指针数组sp中了。
【例2.29】编写一个程序,设计一个点类Point和一个距离类Distance,后者的数据成员包括了Point类的两个对象p1和p2,并计算这两个点的距离。
解:两点的距离由Distance类构造函数求得,存放在其私有数据成员dist中,通过公有成员函数GetDis()来访问。完整的程序如下。
程序的执行结果如下:
Point复制构造函数被调用
Point复制构造函数被调用
Point复制构造函数被调用
Point复制构造函数被调用
Distance构造函数被调用
(1,2)和(8,6)两个点的距离:8.06226
有关C++程序设计基础教程的文章
为此,C++提供了一个更好的方法,就是利用类的构造函数来初始化类的数据成员。构造函数具有如下几个特点:构造函数名与类名相同,且没有返回值,不能指定函数类型。构造函数通常被声明为公有属性,但它不能像其他成员函数那样被显式地调用,它是在创建对象时被系统自动调用的。例如,可以将例2.1的MyClass类扩展为MyClass2,使其包含两个构造函数:上述类中包含两个构造函数:一个没有参数,另一个有两个参数。......
2023-11-07
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2023-11-07
声明函数模板的一般格式如下:template<模板参数表>函数返回值类型函数模板名(形参表)函数模板定义由关键字template开头,表示声明一个模板。模板参数表写在尖括号<>中,参数一般由关键字class或typename后加一个标识符构成。Class和typename的意义相同,表示后面的标识符是一个参数类型,代表一个潜在的标准类型或用户定义的类型。例如,定义max函数模板求两个数中的较大者。如下面的声明是错误的:可以看出,用函数模板比函数重载更方便,程序更简洁。......
2023-11-07
在类声明中,public、private和protected是关键字,称为成员访问限定符,它们分别表示公有、私有和保护的成员访问权限。其他函数不能访问该类的保护数据成员,也不能调用该类的保护成员函数。◇一旦给出了成员访问限定符,它后面的成员都具有这个成员访问权限,直到出现另一个成员访问限定符或类声明结束为止。类的成员函数可以访问类的所有成员,没有任何限制,而类的对象对类的成员的访问是受成员访问控制符制约的。......
2023-11-07
多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。按照绑定进行阶段的不同,可以分为两种不同的绑定方法:静态绑定和动态绑定,这两种绑定过程中分别对应着多态的两种实现方式。有些多态类型,其同名操作的具体对象能够在编译、连接阶段确定,通过静态绑定解决,比如重载、强制和参数多态。包含多态操作对象的确定就是通过动态绑定完成的。分析以下程序的执行结果。......
2023-11-07
类的每一个成员函数都有一个隐含的特殊指针,通常称为this指针,this指针的类型就是成员函数所属的类型。通常不显式使用this指针。this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每个对象都拥有自己的成员函数。this指针一般用于返回当前对象自身。程序的执行结果如下:s1∶n=2s2∶n=1s3∶n=3this指针大量用于运算符重载成员函数设计中,这将在后面详细介绍。......
2023-11-07
图2.3对象stu1和stu2实际上,类Student的所有成员函数放在公用区中,每个函数代码有一个地址,类Student的每个对象中只存放自己的数据成员值和指向公共区中对应函数的地址,也就是说,类的成员函数是共享的,如图2.4所示,这种对象的存储空间分配方式不仅节省了存储空间,而且各个对象的数据成员分别存放,互不相干。......
2023-11-07
throw、try和catch语句的一般语法如下:throw表达式;异常处理的执行过程如下:程序通过正常的顺序执行到达try语句块,然后执行try块内受保护的语句。对于fun语句,其捕获异常的过程是相似的。只要找到一个匹配的异常类型,后面的异常处理都将被忽略。......
2023-11-07
相关推荐