使用对象作为函数参数
代码如下:
#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 << "在函数sqrt_it内,形参对象的ob的数据成员t的值为:" << 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的数据成员t的值为:" << 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;
}
程序运行结果如下:
总结:
1、使用对象作为函数参数,形参和实参是不同的对象,它们所占地址空间不同,因此,形参
的改变,并不影响实参的值。
2、使用对象指针作为函数参数中,所谓"传址调用",就是在函数调用时使实参对象和形参对象
的地址传递给函数,形参和实参都指向同一个地址值,此时在函数中对形参对象的修改将影
响调用该函数的实参对象本身。
3、使用对象引用作为函数的参数,所谓"对象引用",就是对实参对象换了个别名,实际上它们
仍是同一个对象,所以,所谓的形参(别名对象)值的的改变,直接就是实参对象值的改变。
代码如下:
#include<iostream>
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;
}
程序运行结果如下:
总结
(1)静态数据成员的初始化与普通数据成员不同。静态数据成员初始化应在类外单独进行,而且应定义对象之前进行。一般在主函数main之前,类声明之后的特殊地带为它提供定义和初始化。初始化格式如下:
数据类型 类名::静态数据成员=初始值
int Ctest::count = 0
这时在数据成员的前面不要加static
(2)静态数据成员属于类的对象的集合,而不像普通函数那样属于某一对象,因此可以使用"::"访问静态的数据成员。
(3)静态数据成员与静态变量一样,是在编译时创建并初始化。它在该类的任何对象被建立之前就存在。因此,共有的数据成员可以在对象被定义之前被访问。对象建立后,共有的静态数据成员也可以被对象进行访问。
注:私有静态数据成员不能在类外直接访问,必须通过公有的成员函数访问。
c.cpp代码如下:
#include<iostream>
#include<string>
#include"Tstudent.h"
using namespace std;
TStudent::TStudent() {
cout << "班费统计"<<endl;
}
void TStudent:: InitStudent() {
cout << "姓名是" ;
cin >> name;
}
void TStudent:: ExpendMoney(float money) {
m_ClassMoney -= money;
}
void TStudent:: ShowMoney() {
cout << "班费还剩余" << m_ClassMoney << endl;
}
float TStudent::m_ClassMoney = 1000;
int main()
{
TStudent A;
A.InitStudent();
A.ExpendMoney(50);
A.ShowMoney();
TStudent B;
B.InitStudent();
B.ExpendMoney(98.5);
B.ShowMoney();
TStudent C;
C.InitStudent();
C.ExpendMoney(500.53);
C.ShowMoney();
return 0;
}
c.h文件代码如下:
#include<iostream>
#include<string>
using namespace std;
class TStudent {
static float m_ClassMoney;
public:
TStudent();
void InitStudent();
void ExpendMoney(float money);
void ShowMoney() ;
private:
string name;
float money;
};
程序运行结果如下:
心得体会
对于就对象传递来说,若要想通过修改函数的形参来改变实参,则需要运用对象指针和对象引用来作为函数参数。
在定义静态变量时,要在类外及主函数之前进行初始化,静态成员属于私有成员,无法在主函数内被访问。