C++实验报告
(类和对象)
1. 掌握类的声明和使用。
2. 掌握类的声明和对象的声明。
3. 学习具有不同访问属性的成员的访问方式。
4. 观察构造函数和析构函数的执行过程。
5. 学习类的组合使用方法。
6.学会构造函数的重载方法。
7.使用Visual Studio
2008以及Eclipse的Debug调试功能观察程序流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序。
1. 可以定义出一个类,并且在程序中创建一个该类的对象。
2. 实现类的定义,借助VS2008的方法建立一个新的类。
3. 体现出构造函数和析构函数的调用。
4. 重载构造函数。
5. 为了提高对相关知识的综合应用能力,编写一个较为复杂的类和对象的应用程序。
三.实验设计(分析)
1.建立一个空的工程Lab_01。
2.在工程Lab_01中,建立一个源程序文件,在此文件中建立一个新的类。将新建的类命名为CPU。
3.向CPU类中添加数据成员及成员函数,并完善成员函数功能。如设计一个int
GetFrequency()函数, 得到数值为整型的CPU频率值;设计一个float
GetVoltage()函数,获取数值为实型的CPU电压值。
4.体现对象的构造函数和析构过程。例如,在构造函数中用cout<<
“构造了一个CPU!”<
“析构了一个CPU!”<
5.在main函数中定义一个CPU类的对象,用实例实现(就像定义普通变量一样),并作调用等操作
6.使用Dubug调试功能观察Lab_01.cpp的程序的运行流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序,特别注意观察成员变量的构造与析构顺序。
//------------------------------------------------------------------------------------
实验代码:
//
Lab_01.cpp
#include
using namespace
std;
enum
CPU_Rank{ P1=1 , P2 , P3 , P4 , P5 , P6 , P7
};
class CPU
{
private:
CPU_Rank
rank ;
int
frequency ;
float
voltage;
public:
CPU(
CPU_Rank r , int f , float v )
{
rank = r ;
frequency = f ;
voltage = v ;
cout << "构造了一个CPU!"
<< endl;
}
~CPU() {
cout << "析构了一个CPU!"
<< endl; }
CPU_Rank
GetRank() const { return rank ; }
int
GetFrequency() const { return frequency ; }
float
GetVoltage() const { return voltage ; }
void
SetRank( CPU_Rank r ) { rank = r ; }
void
SetFrequency( int f ) { frequency = f ; }
void
SetVoltage( float v ) { voltage = v ; }
void Run() {
cout << "CPU开始运行!"
<< endl ; }
void Stop()
{ cout << "CPU停止运行!"
<< endl ; }
};
int main()
{
CPU a( P6 ,
300 , 2.8 );
a.Run();
a.Stop();
}
//------------------------------------------------------------------------------------------------
(二)
7.
下面提供一个较为复杂的类与对象的应用,将我们在C++程序语言设计中所学到的知识综合的应用到具体的案例解决方案中去。使我们所学的理论真正能够作用于实际。
Problem: 游泳池改造预算
问题描述:一个圆形游泳池,现在要在其周围建一个圆形过道,并在其四周围上围栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求变成计算并输出过道和栅栏的造价。
源程序代码如下:
//
Lab_02.cpp
#include
using namespace
std;
const float
PI=3.141593;
const float
FENCE_PRICE=35;
const float
CONCRETE_PRICE=20;
class Circle
// class 定义了一个Circle 类
{
public: // 定义公有成员,即该类的外部接口
Circle( float r
); // 这里为一个构造函数,来接受外部传进来的数据
float circumference(); // 构造计算圆的周长的函数,是类内部的功能函数
float area();
// 构造计算圆面积的函数,是类内部的功能函数
private:
// 定义了私有成员,即类内部的保护数据
float
radius; // 将半径定义为Circle
类的内部保护数据
};
Circle::Circle( float
r ) // 构造函数初始化
{ radius =
r; }
//
将类从外部接受到的数据传递给radius,作为内部私有成员
进行数据保护。同时供内部函数调用
float
Circle::circumference() //
定义了类的内部函数circumference功能是计算圆的周长
{
return 2 * PI * radius;
}
float
Circle::area() // 定义了类的内部函数area
功能是计算圆的面积。
{
return PI * radius * radius;
}
int main()
{
float
radius;
cin>>radius;
Circle pool(radius);
Circle poolRim(radius+3);
float fenceCost=poolRim.circumference()*FENCE_PRICE;
cout<
"<
float concreteCost=( poolRim.area() - pool.area() )
* CONCRETE_PRICE;
cout<
return 0;
}
四.调试报告
1 在类外定义构造函数要加“::”域名符号。
2
析构函数调用是在其他成员函数调用完后。且定义时类名前必须加“~”。
3
每个类都应定义一个析构函数,若没有显示定义,系统将产生一个默认构造函数。
4
若不用“std::cout”,等之类的输入输出形式,则可用“using namespace std;”.
5 在输代码时要细心,且不能输入中文符号。
6 访问对象成员时要用对象名加“.”成员符号。
7在调用对象的类函数时,注意要细心,要完整调用,否则将报错
8
要养成良好的框架化习惯,即先定大体的框架,接着再对每个部分分别深入填充程序,而不应按照线性的方式编程,否则很容易造成符号的丢失、缺漏从而导致程序编译出错。
9 main函数是具有返回值的int类型时,注意不要少掉声明后面的一对括号,以及定义的最后要加上return
0;这个语句。
五.思考与练习
1.
数据成员可以为公有的吗?成员函数可以为私有的吗?
答:可以,二者都是合法的。数据成员和成员函数都可以为公有或私有的。但数据成员最好声明为私有的。
2.
类与结构的主要区别是什么?
答:类与结构具有相同功能,不同是在没有指定成员的访问权限时,结构中的成员具有public权限,而类具有private权限。
3.
构造函数和析构函数的主要作用是什么,他们各有什么特点?
答:构造函数:主要用来初始化对象的数据成员。
析构函数:与构造函数具有相反的功能,在对象生存期结束时完成对象的清理功能。
4.
什么叫做拷贝构造函数?拷贝构造函数何时被调用?
答:拷贝构造函数是一种特殊的构造函数,其形参是本类的对象的引用,其作用是使用一个已经存在的对象,去初始化一个新的同类的对象。在一下三种情况下会被调用:当用类的一个对象去初始化该类的另外一个对象时;如果函数的形参是类对象,调用函数进行形参和实参结合时;如果函数的返回值是类对象,函数调用完成返回时。
5.
拷贝构造函数与赋值运算符(=)有何不同?
答:赋值运算符(=)作用于一个已经存在的对象;而拷贝构造函数会创建一个新的对象。
6.
给对象的私有成员赋值的方法有哪些?
答:通过构造函数初始化数据成员,在类里直接赋初值,对象之间互相赋值时会把数据成员复制到另一个对象。