实验目的:
进一步加深对类和对象的理解
掌握几种对象传递的使用方法
掌握静态成员的概念和使用
实验内容part a
了解三种不同对象的传递方式
#include<iostream>
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;
}
//第二种:
//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;
//}
//第三种:
//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)
静态成员为所有对象共享,只有一份存于公用内存中
静态成员包括静态数据成员和静态函数成员
//实验内容part b
#include <iostream>
using namespace std;
class Ctest {
static int count;
public:
Ctest() {
++count; cout << "对象数量=" << count << '\n';
}
};
int Ctest::count = 0;
int main(void) {
Ctest a[3];
return 0;
说明:
1、静态数据成员的定义与普通数据成员相似,但前面要加上static关键字。
2、静态数据成员的初始化与普通数据成员不同。静态数据成员初始化应在类外单独进行,而且应在定义对象之前进行。一般在main()函数之前、类声明之后的特殊地带为它提供定义和初始化。
3、静态数据成员属于类(准确地说,是属于类中对象的集合),而不像普通数据成员那样属于某一对象,因此,可以使用“类名::”访问静态的数据成员。格式如下:类名::静态数据成员名。
4、静态数据成员与静态变量一样,是在编译时创建并初始化。它在该类的任何对象被建立之前就存在。因此,共有的静态数据成员可以在对象定义之前被访问。对象定以后,共有的静态数据成员也可以通过对象进行访问。
下面对静态成员函数的使用再做几点说明:
1、一般情况下,静态函数成员主要用来访问静态成员函数。当它与静态数据成员一起使用时,达到了对同一个类中对象之间共享数据的目的。
2、私有静态成员函数不能被类外部的函数和对象访问。
3、使用静态成员函数的一个原因是,可以用它在建立任何对象之前调用静态成员函数,以处理静态数据成员,这是普通成员函数不能实现的功能
4、编译系统将静态成员函数限定为内部连接,也就是说,与现行文件相连接的其他文件中的同名函数不会与该函数发生冲突,维护了该函数使用的安全性,这是使用静态成员函数的另一个原因。
5、静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公有的静态成员函数,使用如下格式较好:类名::静态成员函数名()
实验内容part c
#pragma once
#include <iostream>
using namespace std;
class Student
{
public:
void InitStudent(char name[]);
void ExpendMoney(float a);
void ShowMoney();
private:
static float m_ClassMoney;
char Name[20];
};
float Student::m_ClassMoney = 1000;
void Student::InitStudent(char name[])
{
int i = 0;
while (name[i])
{
Name[i] = name[i];
i++;
}
}
void Student::ExpendMoney(float a)
{
m_ClassMoney += a;
}
void Student::ShowMoney()
{
cout << "班费还剩" << m_ClassMoney << endl;
}
int main()
{
Student A, B, C;
A.ExpendMoney(-50);
A.ShowMoney();
B.ExpendMoney(-98.5);
B.ShowMoney();
C.ExpendMoney(-500.53);
C.ShowMoney();
}