一、实验目的
类构成了实现 C++面向对象程序设计的基础。类是 C++封装的基本单元,它把数据和函
数封装在一起。当类的成员函数声明为保护时,外部不能访问;声明为公共时,则在任何地
方都可以访问。
通过建立类来掌握面向对象程序设计中类的封装性、数据保护等特性以及构造函数、
析构函数,掌握系统什么时候自动缺省构造函数和缺省析构函数。要求掌握声明和定义类和
成员函数的方法,掌握访问成员函数的方法,理解保护数据如何屏蔽外部访问的原理,使得对
类的封装有更好的认识。
成员函数的定义:
1. 在类中定义成员函数:在类中定义的成员函数一般规模都比较小,语句只有 1~5
句,而且特别是不允许使用 switch 语句,它们一般为内联函数,即使没有明确使
用 inline 标示。
2. 在类之后定义成员函数:对于大的成员函数,直接把代码放到类定义中使用起来
十分不方便。为了避免这种情况,C++允许在其他地方定义成员函数。
将类定义和其成员函数定义分开,是目前开发程序的通常做法。我们把类定义(头文件)
看成是类的外部接口,类的成员函数定义看成是内部实现。
二、实验内容
使用 Visual C++6.0 建立一个复数类,并编制主程序来验证对所创建的复数类的操作
的正确性。
三、实验要求
1、有两个私有的成员 x 和 y;
2、分别有一个带参数构造函数和无参数构造函数;
3、定义一个可以显示复数的实部和虚部的成员函数。
四、思考题
1、该复数没有定义析构函数(如果使用 Visual C++ 6.0 创建类,则会自动为该类生成析
构函数),系统会怎样做?
2、如果定义该复数类的对象时不带参数,是否可以?如果不行,是何原因?
实验代码:
//sy1.h
#ifndef SY1_H_
#define SY1_H_
#include<iostream>
using namespace std;
class fushu
{
private://私有函数,只限内部函数访问即public里的函数
double shi;
double xu;
public://与外部的接口
fushu();
fushu(double s, double x);//不能带默认参数,会产生歧义或者不全带默认参数
void show();
};
#endif
//sy1.cpp
//#include<iostream>
#include"sy1.h"
//using namespace std;
fushu::fushu()
{
shi = 0.0;
xu = 0.0;
}
fushu::fushu(double s, double x) :shi(s), xu(x)//我用初始化列表,可以写在里面
{
}
void fushu::show()
{
if (xu >= 0)
cout << shi << "+" << xu << "j" << endl;
else
cout << shi << xu << "i" << endl;
}
/*假设你的工程里面有4个文件,分别是a.cpp,b.h,c.h,d.h。
a.cpp的头部是:
#include "b.h "
#include "c.h "
b.h和c.h的头部都是:
#include "d.h "
而d.h里面有class D的定义。
这样一来,
编译器编译a.cpp的时候,先根据#include "b.h "去编译b.h这个问题,再根据b.h里面的#include "d.h ",去编译d.h的这个文件,这样就把d.h里面的class D编译了;
然后再根据a.cpp的第二句#include "c.h ",去编译c.h,最终还是会找到的d.h里面的class D,但是class D之前已经编译过了,所以就会报重定义错误。 加上ifndef / define / endif,就可以防止这种重定义错误。
所以还是把头文件的内容都放在#ifndef和#endif中吧。
不管你的头文件会不会被多个文件引用,你都要加上这个。*/
//user.cpp
#include<iostream>
#include"sy1.h"
using namespace std;
int main()
{
double shi;
double xu;
fushu a;//测试默认构造函数
a.show();
cout << "please enter a complex number: " << endl;
cout << "please enter real part:";
cin >> shi;
cout << "please enter imaginary part:";
cin >> xu;
fushu b(shi, xu);
b.show();
return 0;
}
思考题1:该复数没有定义析构函数(如果使用 Visual C++ 6.0 创建类,则会自动为该类生成析构函数),系统会怎样做?
答:系统会自动分配一个析构函数给它。
思考题2:如果定义该复数类的对象时不带参数,是否可以?如果不行,是何原因?
答:可以,系统则自动调用无参构造函数。