●进一步加深对类和对象的理解
●掌握几种对象传递的使用方法
●掌握静态成员的概念和使用
PART A :了解三种不同的对象传递方式
(1)使用对象作为函数参数,但在函数中对对象进行任何修改均不影响调用该函数的本身,也就是说,在函数中进行变量的修改,不会传递给外面的对象本身。实现代码如下:
#include "sj5.h"
using namespace std;
class Tr {
public:
Tr(int n) {
i = n;
}
void set_i(int n) {
i = n;
}
int get_i() {
return i;
}
private:
int i;
};
void sqr_it(Tr ob) {
ob.set_i(ob.get_i() * ob.get_i());
cout << "在函数Sqr_it内,形参对象ob的数据成员i的值为:" << ob.get_i();
cout << endl;
}
int main() {
Tr obj(10);
cout << "调用函数sqr_it前,实参对象obj的数据成员i的值为:";
cout << obj.get_i() << endl;
sqr_it(obj);
cout << "调用函数sqr_it后,实参对象obj的数据成员i的值为:";
cout << obj.get_i() << endl;
return 0;
}
运行结果如下:
(2)使用对象指针作为函数参数,使用对象指针作为函数参数可以实现“传址调用”,即在函数调用时使实参对象和形参对象指针变量指向同一内存地址,在函数调用过程中,对形参对象指针所指对象值的改变也同样影响着实参对象的值。代码如下:
#include "sj5.h"
using namespace std;
class Tr {
public:
Tr(int n) {
i = n;
}
void set_i(int n) {
i = n;
}
int get_i() {
return i;
}
private:
int i;
};
void sqr_it(Tr* ob) { //对象指针ob作为函数sqr_it的形参
ob->set_i(ob->get_i() * ob->get_i());
cout << "在函数Sqr_it内,形参对象ob的数据成员i的值为:" << ob->get_i();
cout << endl;
}
int main() {
Tr obj(10);
cout << "调用函数sqr_it前,实参对象obj的数据成员i的值为:";
cout << obj.get_i() << endl;
sqr_it(&obj);
cout << "调用函数sqr_it后,实参对象obj的数据成员i的值为:";
cout << obj.get_i() << endl;
return 0;
}
运行结果如下:
由此可得,通过使用对象指针,当在函数中进行对形参修改时,同时也会改变实参的值。
(3)使用对象引用作为函数参数,因为使用对象引用作为函数参数不但具有对象指针用作函数参数的优点,而且用对象引用作函数将更简单、更直接。代码如下:
#include "sj5.h"
using namespace std;
class Tr {
public:
Tr(int n) {
i = n;
}
void set_i(int n) {
i = n;
}
int get_i() {
return i;
}
private:
int i;
};
void sqr_it(Tr& ob) {
ob.set_i(ob.get_i() * ob.get_i());
cout << "在函数Sqr_it内,形参对象ob的数据成员i的值为:" << ob.get_i();
cout << endl;
}
int main() {
Tr obj(10);
cout << "调用函数sqr_it前,实参对象obj的数据成员i的值为:";
cout << obj.get_i() << endl;
sqr_it(obj);
cout << "调用函数sqr_it后,实参对象obj的数据成员i的值为:";
cout << obj.get_i() << endl;
return 0;
}
运行结果如下:
PART B
●掌握静态成员的概念和使用
●由关键字static修饰说明的成员,称为静态成员(static class member) 。
●静态成员为所有对象共享,只有一份存于公用内存中。
●静态成员包括静态数据成员和静态函数成员。
代码如下:
#include "sj5.h"
using namespace std;
class Ctest {
static int count; //私有成员
public:
Ctest() {
++count;
cout << "对象数量=" << count << endl;
}
};
int Ctest::count = 0;
int main() {
Ctest a[3];
return 0;
}
运行结果:
PART C
●创建一个TStudent类,完成以下功能:
●该类包括三个函数:InitStudent、ExpendMoney和ShowMoney;
●采用float m_ClassMoney变量作为静态变量,用于存储班级的班费,初始值设为1000;
●InitStudent (char name[)主要负责完成学生姓名的初始化;OExpendMoney(float money)主要完成班费的花销计算;oShowMoney()主要完成班费余额显示;
●主程序中分别定义A、B、C三个学生,每个学生为一个对象,每个学生分别消费班费50,98.5,500.53,最后显示班费的余额。
代码如下:
#include "sj5.h"
using namespace std;
class TStudent {
public:
void InitStudent(string name1) {
//cin >> name1;
name = name1;
}
void ExpendMoney(float money) {
m_ClassMoney = m_ClassMoney - money;
}
void ShowMoney() {
cout << "班费还剩余:" << m_ClassMoney << endl;
}
private:
static float m_ClassMoney;
string name;
};
float TStudent::m_ClassMoney = 1000;
int main() {
TStudent a, b, c;
a.InitStudent("小明");
a.ExpendMoney(50);
a.ShowMoney();
b.InitStudent("小红");
b.ExpendMoney(98.5);
b.ShowMoney();
c.InitStudent("小刚");
c.ExpendMoney(500.53);
c.ShowMoney();
return 0;
}
运行结果如下:
实验中遇到的问题:
1、在定义静态数据成员时,在类内进行初始化时,程序报错。那时认为这一数据成员在类内为私有成员,在类外不能进行访问修改。
经过查阅书本,所得:静态数据成员的初始化与普通数据成员不同。静态数据成员初始化应在类外单独进行,而且应在定义对象之前进行。一般在主函数main之前,类声明之后的特殊地带为它提供定义和初始化。其初始化地格式如下:
数据类型 类名::静态数据成员名=初始值;
实验总结:
(1)如需要通过修改函数中的形参来影响实参的值,那么则需要用对象指针或者对象引用作为函数参数。
(2)静态数据成员属于类(准确地说,是属于类对象的集合),而不像普通数据成员那样属于某一对象,因此可以使用“类名::”访问静态的数据成员。用类名访问静态数据成员的格式如下:
类名::静态数据成员名
(3)在定义类时,需要提前规划好类实现的功能,需要使用哪些函数,使得类的定义更加完善,提高编程效率。