目 录实验一 熟悉Visual C++开发环境及上机过程 1
实验二 类的定义和对象的使用 7
实验三 多文件结构及静态成员和对象数组的使用 8
实验四 类的继承和派生 10
实验五 多继承 12
实验六 虚函数的使用 14
实验七 抽象类的使用 17
实验八 运算符重载和友元 19
实验九 STL的使用 20
实验十 利用AppWizard向导生成Windows应用程序 22
实验一 熟悉Visual C++开发环境及上机过程一、实验目的了解和使用VC集成开发环境;
熟悉VC环境的基本命令和功能键;
熟悉常用的功能菜单命令;
学习使用VC++环境的帮助;
学习完整的C++程序开发过程;
理解简单的C++程序结构。
二、实验内容
使用Visual C++ 6.0集成环境来编辑、编译并运行程序1:
#include <iostream>
using namespace std;
class TAdd
{
public:
TAdd(int a,int b)
{
x=a;y=b;
cout<<"constructor."<<endl;
cout<<x<<","<<y<<endl;
}
~TAdd()
{
cout<<"destructor."<<endl;
cout<<x<<","<<y<<endl;
}
int add(){return x+y;}
private:
int x,y;
};
int main()
{
TAdd p1(3,4);
cout<<"x+y="<<p1.add()<<endl;
TAdd p2(30,40);
cout<<"x+y="<<p2.add()<<endl;
return 0;
}
三、实验步骤启动Visual C++ 6.0——选择菜单“开始/程序/Microsoft Visual Studio 6.0/Microsoft Visual C++ 6.0”,启动后的用户界面如图1-1所示。

图1-1 Visual C++ 6.0用户界面
1、创建新工程
(1)单击菜单“文件/新建”,显示“新建:对话框,如图1-2所示。
(2)在此对话框的列表栏中,选择“Win32 Console Application”(Win32控制台应用程序”)。在,工程”栏中输入一个工程名,如实验一。在位置文本框中选择工程所在的路径,如图中所示H:\C++实验\实验一。单击“确定”按钮。

图1-2,新建”对话框
(3)在弹出的“Win32 Consol Application-Step 1 of 1” 对话框中选择An empty project单选项。然后单击“Finish”按钮,如图1-3所示。

图1-3,Win32 Consol Application-Step 1 of 1” 对话框
(4)在“新建工程信息”对话框中单击“确认”按钮,完成工程创建过程。
2、创建C++源程序文件
(1)编辑C++源程序:编辑C++源程序时,选择“文件”菜单项,在弹出的子菜单中选择新建(热键为Ctrl+N),出现如图1-4所示的窗口。
 图1-4,新建”窗口
(2) 选择“文件”选项卡,在此属性页中选择“C++ Source File”,如图1-4所示,单击“确定”,出现如图1-5所示的编辑屏幕。

图1-5,C++”源程序编辑
(3)在“C++源程序编辑”窗口下编辑C++源程序。在编辑窗口键入C++源程序。如图1-6所示,输入以下源程序:

图1-6 编辑C++源程序
3.编译连接和运行源程序
(1)选择菜单项“编译”,出现“编译”的下拉菜单,在该下拉式菜单中选择“编译 eg1-1.cpp”菜单项,这时系统开始对当前的源程序进行编译,在编译过程中,编译器会将错误信息显示在屏幕下方的“编译”窗口中。错误信息包括错误所在大致位置和错误的性质。用户可根据这些错误信息进行修改。上述程序的“编译”窗口,如图1-7所示。

图1-7,编辑”窗口
(2)编译无错误后,可进行连接生成可执行文件(.exe),这时选择“编译”下拉菜单中的“构件 eg1-1.exe”选项。“编译”窗口出现如图1-8所示的信息说明编译连接成功,并生成以源文件名为名字的可执行文件(eg1-1.exe)。

图1-8 编译连接信息
(3)执行可执行文件的方法是选择“编译”菜单项中“执行 eg1-1.exe”选项。这时,运行该可执行文件,并将结果显示在另外一个显示执行文件输出结果的窗口中,如图1-9所示。

图1-9 运行C++程序结果
4.关闭工作区、打开工作区单击菜单“文件/关闭工作区”,关闭工作区。
单击菜单“文件/打开工作区”,在弹出的对话框中选定“H:\C++实验\实验一\实验一.dsw”,单击“打开”按钮,则可打开工作区,对已建立的工程文件进行修改。
5.根据实验步骤1-4,建立、编译并运行实验程序1。
四、实验要求
1. 复习教材有关内容。
2. 掌握VC控制台应用程序的开发、调试步骤。
3. 完成实验报告。
实验二 类的定义和对象的使用一、实验目的
掌握类的概念、类的定义格式、类与结构的关系、类的成员属性和类的封装性;
掌握类对象的定义;
理解类的成员的访问控制的含义,公有、私有和保护成员的区别;
掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数。
二、实验内容
1、定义一个学生类,其中有3个数据成员有学号、姓名、年龄,以及若干成员函数。同时编写主函数使用这个类,实现对学生数据的赋值和输出。
要求:
(1)使用成员函数实现输入、输出;
(2)使用构造函数和析构函数实现对数据的输入、输出;
(3)编写主函数,定义对象,完成相应功能。
2、定义日期类Date。要求:
(1)可以设置日期;
(2)日期加一天操作;
(3)输出函数,输出格式为“XXXX年XX月XX日”;
(4)编写主函数,定义对象,完成相应功能。
三、实验要求写出程序,并调试程序,要给出测试数据和实验结果。
整理上机步骤,总结经验和体会。
完成实验报告和上交程序。
实验三 多文件结构及静态成员和对象数组的使用一、实验目的
1、掌握自定义头文件的方法;
2、学会建立和调试多文件程序;
3、了解静态成员的使用;
4、掌握对象数组的使用。
二、实验内容
1、编写一个函数,求从n个不同的数中取r个数的所有选择的种数。
要求:
(1)将main()函数放在一个.cpp文件中;
(2)将fn(int n),Cnr(int n,int r)放在另一个.cpp文件中;
(3)将函数原型说明放在一个头文件中;
(4)建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。
2、上机调试例2-30,在Employee类中增加一个静态数据成员来设置本公司员工编号基数,新增加的员工编号将在创建对象的同时自动在基数上增加。另外,将Employee类的声明部分和实现部分分成两个文件来实现。
3、上机调试例3-14,假设有一个点类point,具有两个实数坐标。希望主程序使用这个类完成下述功能:
(l)主程序为类point申请10个连续存储空间。
(2)要求调用一个函数Set()从键盘输入10个对象的属性,并顺序存入申请的内存中。
(3)要求调用一个函数Display()显示10个对象的值。
(4)要求调用一个函数Lenth(),计算将这些点连成一条折线时,这条折线的长度。
(5)程序结束时,删除申请的内存。
(6)演示析构对象(动态对象或堆对象)的执行顺序。
设计这个类和各个函数并验证运算结果的正确性。
三、实验要求
1、写出程序,并调试程序,要给出测试数据和实验结果。
2、整理上机步骤,总结经验和体会。
3、完成实验报告和上交程序。
实验四 类的继承和派生?
一、实验目的理解继承的含义,掌握派生类的定义方法和实现;
理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地访问继承层次中的各种类成员;
理解保护成员在继承中的作用,能够在适当的时候选择使用保护成员以便派生类成员可以访问基类的部分非公开的成员;
条件编译的运用。多文件结构的进一步使用。
二、实验内容
1、编写一个程序计算出球、圆柱和圆锥的表面积和体积。
要求:
(1)定义一个基类,至少含有一个数据成员半径,并设为保护成员;
(2)定义基类的派生类球、圆柱、圆锥,都含有求表面积和体积的成员函数和输出函数;
(3)编写主函数,求球、圆柱、圆锥的表面积和体积。
2、编写一个学生和教师数据输入和显示程序。其中,学生数据有编号、姓名、班级和成绩,教师数据有编号、姓名、职称和部门。
要求:
(1)将编号、姓名输入和显示设计成一个类person;
(2)设计类person的派生类:学生类student和教师类teacher;
(3)各个类的声明放在相应的头文件中(*.h),类的实现放在相应的实现文件中(*.cpp):person.h,person.cpp,student.h,student.cpp,teacher.h,teacher.cpp;
(4)编写一个主文件(SY4_2.cpp),在该文件中分别定义student、teacher的对象,完成相应功能。
三、实验要求写出程序,并调试程序,要给出测试数据和实验结果。
整理上机步骤,总结经验和体会。
完成实验报告和上交程序。
实验五 多继承一、实验目的
1、理解多继承的概念
2、多继承中构造与析构的应用。
二、实验内容
1、输入以下程序,分析运行结果。
#include <iostream>
using namespace std;
class B1
{
public:
B1(int i)
{
b1 = i;
cout<<"构造函数 B1."<<b1<<endl; }
void print() { cout<<b1<<endl; }
private:
int b1;
};
class B2
{
public:
B2(int i)
{
b2 = i;
cout<<"构造函数 B2."<<b2<<endl; }
void print() { cout<<b2<<endl;}
private:
int b2;
};
class B3
{
public:
B3(int i)
{
b3 = i;
cout<<"构造函数 B3."<<b3<<endl; }
int getb3() { return b3; }
private:
int b3;
};
class A,public B2,public B1
{
public:
A(int i,int j,int k,int l):B1(i),B2(j),bb(k)
{
a = l;
cout<<"构造函数 A."<<a<<endl; }
void print()
{
B1::print();
B2::print();
cout<<a<<endl;}
private:
int a;
B3 bb;
};
void main()
{
A aa(1,2,3,4);
aa.print();
}
2、修改上面的4个类,添加析构函数,在析构函数中输出各私有数据成员的值。并分析结果。
三、实验要求写出程序,并调试程序,要给出测试数据和实验结果。
整理上机步骤,总结经验和体会。
完成实验报告和上交程序。
实验六 虚函数的使用一、实验目的
1、理解多态的概念。
2、理解函数的静态联编和动态联编。
3、掌握虚函数的定义。
4、理解虚函数在类的继承层次中的作用、虚函数的引入对程序运行时的影响,掌握其使用。
二、实验内容虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行动态联编,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。多态指同一个方法根据其所属的不同对象可以有不同的行为。
虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数
1、录入下面程序,并分析结果:
#include <iostream>
#include <complex>
using namespace std;
class Base
{
public,
Base() {cout<<"Base-ctor"<<endl;}
~Base() {cout<<"Base-dtor"<<endl;}
virtual void f(int){cout<<"Base::f(int)"<<endl;}
virtual void f(double){cout<<"Base::f(double)"<<endl;}
virtual void g(int i=10){cout<<"Base::g()"<<i<<endl;}
};
class Derived,public Base
{
public,
Derived() {cout<<"Derived-ctor" <<endl;}
~Derived(){cout<<"Derived-dtor"<<endl;}
void f(complex<double>) {
cout<<"Derived::f(complex)"<<endl;
}
void g(int i=20){
cout<<"Derived::g()"<<i<<endl;
}
};
int main()
{
cout<<sizeof(Base)<<endl;
cout<<sizeof(Derived)<<endl;

Base b;
Derived d;
Base *pb=new Derived;
b.f(1.0);
d.f(1.0);
pb->f(1.0);
b.g();
d.g();
pb->g();
delete pb;
return 0;
}
2、录入下面程序,分析运行结果:
#include <iostream>
using namespace std;
class Base
{
public,
Base():data(count)
{
cout<<"Base-ctor"<<endl;
++count;
}
~Base()
{
cout<<"Base-dtor"<<endl;
--count;
}
static int count;
int data;
};
int Base::count;
class Derived,public Base
{
public:
Derived():data(count),data1(data)
{
cout<<"Derived-ctor"<<endl;
++count;
}
~Derived()
{
cout<<"Derived-dtor"<<endl;
--count;
}
static int count;
int data1;
int data;
};
int Derived::count=10;
int main()
{
cout<<sizeof(Base)<<endl;
cout<<sizeof(Derived)<<endl;

Base* pb = new Derived[3];
cout<<pb[2].data<<endl;
cout<<((static_cast<Derived*>(pb))+2)->data1<<endl;
delete[] pb;

cout<<Base::count<<endl;
cout<<Derived::count<<endl;
return 0;
}
三、实验要求写出程序,并调试程序,要给出测试数据和实验结果。
整理上机步骤,总结经验和体会。
完成实验报告和上交程序。
实验七 抽象类的使用一、实验目的
了解抽象类的概念;
灵活应用抽象类。
二、实验内容
1、录入下面程序,分析编译错误信息。
#include <iostream>
#include <new>
#include <assert.h>
using namespace std;
class Abstract
{
public:
Abstract()
{
cout << "in Abstract()\n";
}
virtual void f() = 0;
};
int main()
{
Abstract *p = new Abstract;
p->f();
return 0;
}
2、基类shape类是一个表示形状的抽象类,area( )为求图形面积的函数。请从shape类派生三角形类(triangle)、圆类(circles)、并给出具体的求面积函数。
#include<iostream.h>
class shape
{
public,
virtual float area( )=0 ;
};?
3、定义一个抽象类Base,在该类中定义一个纯需函数virtual void abstractMethod() = 0;在函数的实现中输出"Base::abstractMethod is called.",派生一个基于Base的派生类Derived,在派生类Derived的abstractMethod方法中首先调用基类的abstractMethod方法,在输出"Derived::abstractMethod is called",最后编写主函数,其内容如下:
int main()
{
Base* pBase = new Derived;
pBase->abstractMethod();
delete pBase;
return 0;
}
分析运行结果。
三、实验要求写出程序,并调试程序,要给出测试数据和实验结果。
整理上机步骤,总结经验和体会。
完成实验报告和上交程序。
实验八 运算符重载和友元一、实验目的
1、掌握运算符重载和友元的概念;
2、掌握使用friend重载运算符的方法。
二、实验内容
1、设计一个类,用自己的成员函数重载运算符,使对整型的运算符=、+、-、*、/ 适用于分数运算。要求:
(1)输出结果是最简分数(可以是带分数);
(2)分母为1,只输出分子。
2、用友元函数重载运算符,使对整型的运算符=、+、-、*、/ 适用于分数运算。
三、实验要求
1、写出程序,并调试程序,要给出测试数据和实验结果。
2、整理上机步骤,总结经验和体会。
3、完成实验报告和上交程序。
实验九 STL的使用一、实验目的
1、掌握VC中STL的使用方法;
2、掌握容器(container)、模板(template)、游标(Iterator)、算法(Algorithms)、分配器(Allocator)、向量(vector)等知识的应用。
二、实验内容
1、vector向量的使用(目的:理解STL中的向量),输入以下程序并运行、分析结果。
// #include "stdafx.h" -如果使用预编译的头文件就包含这个头文件
#include <vector> // STL向量的头文件。这里没有".h"。
#include <iostream> // 包含cout对象的头文件。
using namespace std;
//保证在程序中可以使用std命名空间中的成员。
char* szHW = "Hello World"; //这是一个字符数组,以”\0”结束。
int main(int argc,char* argv[]) {
vector <char> vec; //声明一个字符向量vector (STL中的数组)
//为字符数组定义一个游标iterator。
vector <char>::iterator vi;
//初始化字符向量,对整个字符串进行循环,
//用来把数据填放到字符向量中,直到遇到”\0”时结束。
char* cptr = szHW; // 将一个指针指向“Hello World”字符串
while (*cptr != '\0') {
vec.push_back(*cptr);
cptr++;
}
// push_back函数将数据放在向量的尾部。
// 将向量中的字符一个个地显示在控制台
for (vi=vec.begin(); vi!=vec.end(); vi++)
// 这是STL循环的规范化的开始——通常是 "!=",而不是 "<"
// 因为"<" 在一些容器中没有定义。
// begin()返回向量起始元素的游标(iterator),end()返回向量末尾元素的游标(iterator)。
{
cout << *vi;
} // 使用运算符,*” 将数据从游标指针中提取出来。
cout << endl; // 换行
return 0;
}
2、容器和游标的使用,输入以下程序,并调试、分析结果
#pragma warning(disable:4786)
#include <iostream>
#include <string>
#include <map>
using namespace std;
typedef map<int,string,less<int> > INT2STRING;
void main() {
INT2STRING theMap;
INT2STRING::iterator theIterator;
string theString = "";
int index;
theMap.insert(INT2STRING::value_type(0,"Zero"));
theMap.insert(INT2STRING::value_type(1,"One"));
theMap.insert(INT2STRING::value_type(2,"Two"));
theMap.insert(INT2STRING::value_type(3,"Three"));
theMap.insert(INT2STRING::value_type(4,"Four"));
theMap.insert(INT2STRING::value_type(5,"Five"));
theMap.insert(INT2STRING::value_type(6,"Six"));
theMap.insert(INT2STRING::value_type(7,"Seven"));
theMap.insert(INT2STRING::value_type(8,"Eight"));
theMap.insert(INT2STRING::value_type(9,"Nine"));
for (;;)
{
cout << "Enter \"q\" to quit,or enter a Number,";
cin >> theString;
if(theString == "q")
break;
for(index = 0; index < theString.length(); index++) {
theIterator = theMap.find(theString[index] - '0');
if(theIterator != theMap.end() )
cout << (*theIterator).second << " ";
else
cout << "[err] ";
}
cout << endl;
}
}
三、实验要求
1、写出程序,并调试程序,要给出测试数据和实验结果。
2、整理上机步骤,总结经验和体会。
3、完成实验报告和上交程序。
实验十 利用AppWizard向导生成Windows应用程序一、实验目的学习利用Appwizard向导开发Windows应用程序的过程。
二、实验内容
AppWizard是一个工具,利用该工具,你可以创建一个建立在MFC基础上的窗口应用程序框架,然后在这个框架中加上自己的应用逻辑。你可以选择所创建的应用类型,最常用的是多文档应用(就象你用的字编辑器Microsoft Word一样,可以同时打开多个文档窗口的应用)、单文档应用(类似于Windows提供的notepad,一次只能打开一个文档)和对话框应用(类似于Windows的时钟程序)。
1、用AppWizard建立一个单文档应用程序,在窗口中输出”Hello,World!”。
2、用AppWizard建立一个对话框应用程序,在对话框上摆放相应控件。程序结果如下图10-1:

图10-1 对话框主界面图三、实验步骤
1、创建一个新项目利用Developer Studio的AppWizard创建一个新的项目,步骤如下:
(1)选择菜单File|New,系统将显示New对话框
(2)选择Projects标签,在显示的项目类型中选择MFC AppWizard(exe)
(3)在右边的Project Name编辑框中输入项目名称,如“helloMFC”,然后按OK
(4)MFC AppWizard 将分几步询问你有关要建立的新项目的配置。第一个对话框问你是创建哪种类型的应用(单文档、多文档还是对话框类型),选择创建单文档应用“Single document”,然后按Next按钮
(5)翻过后面的五个页面(按Next),每个页面可以让你改变项目的不同选项,这个例子暂时不设置这些选项。
(6)最后一个MFC AppWizard屏幕告诉你App Wizard为你自动产生的类。单击Finish键,AppWizard显示一个关于该项目的摘要,列出这些类和你所选择的特征。如图10-1所示。

图10-2 最后一个MFC AppWizard屏幕单击OK,系统自动产生helloMFC所需要的文件。
2、浏览helloMFC项目当你用MFC AppWizard创建了helloMFC项目后,这个项目的工作区窗口将会打开,工作区窗口(如下图):

图10-3 打开helloMFC项目后的工作区窗口你可以先选择FileView看一下AppWizard为你创建了哪些文件,然后选择ClassView看一下定义了哪些类。ClassView中还可以看到一个Globals文件夹,单击它前面的加号,可以看到,有一个预定义的全局变量theApp,这是你的Windows应用程序类的对象。
3、编译连接运行按F7或者选择菜单Build|Build helloMFC.exe,编译连接得到可执行程序,再按Ctrl+F5或者选择Build|Execute helloMFC.exe运行该程序。程序的结果如下:

图10-4 编译连接运行的结果
4、用MFC处理输出现在修改程序。要在程序中间的窗口上显示一行文字“Hello,World”,步骤如下:
(1)在工作区窗口中选择ClassView标签,单击helloMFC classes前面的加号(如果已经变成减号则不做此操作)。
(2)单击类CHelloMFCView类前面的加号。
(3)双击OnDraw()函数,在右边的文档将显示窗口显示文件helloMFCView的内容,并且自动将光标定位到函数OnDraw()处。
(4)修改OnDraw函数的定义,在最后一行加一句:
pDC->TextOut(50,50,"Hello,World");
(5)按Ctrl+s或者选菜单File|Save来保存所作的修改。
5、编译连接并运行重新编译连接该项目,运行程序,也可以用Ctrl+F5直接运行程序,系统将询问是否重新编译该项目,回答“是(Yes)”,如果有编译错误,仔细检查你加的一句话,是否有错。当编译连接通过后,系统会自动运行该程序。查看结果。
四.实验要求
1、写出程序,并调试程序,要给出测试数据和实验结果。
2、整理上机步骤,总结经验和体会。
3、完成实验报告和上交程序。