比较三类对象传递方式的不同:
1、定义一个对象作为实参:在这种方式里面实参与形参是相互隔离的,即改变形参里的内容是并不会改变实参里的数值,形参只在函数内部存在,函数结束时存储形参的存储空间被释放掉,因此在调用函数后实参里的值是不变的。
2、使用指针作为形参:在这种方式中,相当于把实参的地址传递给了函数中 ,我们函数是对指针所对应的内容进行修改,相当于直接修改实参,因此在这种方式下,我们调用函数后,实参的内容会改变。
3、引用作为形参:代码如下
#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内部,数据成员的值:" << ob.get_i() << endl;
}
void main()
{
Tr obj(10);
cout << "调用函数SQR前,实参对象内数据成员的值:" << obj.get_i() << endl;
sqr_it(obj);
cout << "调用之后,实参对象OBJ数据对象的值:" << obj.get_i() << endl;
}
在程序中,我们以ob作为函数sqr_it()的形参,ob相当于实参obj的别名,两者所代表的对象在存储器中占用的空间地址是同一个,ob相当于obj的别名,因此以引用作为形参在函数内部调用时就相当于直接对形参操作,因此在调用完函数之后,形参内容也随之变化。
关于静态成员需要注意的问题:
1、类内静态成员在定义时使用关键字static定义,但不可以给他初始量,初始化要在类外进行。
举例:
#include<iostream>
using namespace std;
class Student
{
static float m_ClassMoney;
public:
void InitStudent(char nametemp[])
{
for (int count = 0; count < 10; count++)
{
name[count] = nametemp[count];
}
}
void ExpendMoney(float moneytemp)
{
money = moneytemp;
m_ClassMoney -= money;
}
void ShowMoney()
{
cout << "班费还剩余:" << m_ClassMoney << endl;
}
private:
char name[10];
float money;
};
float Student::m_ClassMoney = 1000;
void main()
{
char one[10] = { 'A' };
char two[10] = { 'B' };
char three[10] = { 'C' };
Student A;
Student B;
Student C;
A.InitStudent(one);
A.ExpendMoney(50);
A.ShowMoney();
B.InitStudent(two);
B.ExpendMoney(98.5);
B.ShowMoney();
C.InitStudent(three);
C.ExpendMoney(500.53);
C.ShowMoney();
}