part a
三种不同的对象传递方式
1.使用对象作为函数参数 ? ? ? ? 对象可以作为参数传递给函数,其方法与传递基本类型的变量相同。在向函数传递对象时,是通过“传值调用”传递给函数的,即单向传递,只由实参传给形参,而不能由形参传回来给实参。因此函数中对对象的任何修改均不影响调用该函数的对象(实参)本身。
代码
#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;
}
?
2.使用对象指针作为函数参数 ? ? ? ?对象指针可以作为函数的参数,使用对象指针作为函数参数可以实现“传址调用”,即在函数调用时使实参对象和形参对象指针变量指向同一内存地址,在丽数调用过程中,对形参对象指针所指对象值的改变也同样影响着实参对象的值。当函数的形参是对象指针时,调用函数的对应实参应该是某个对象的地址值。
代码
#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;
}
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_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
#include<iostream>
using namespace std;
class Ctest {
static int count;
public:
Ctest() {
++count; cout << "对象数量=" << count << endl;
}
};
int Ctest::count = 0;
int main(void) {
Ctest a[3];
return 0;
}
?
说明:
(1)静态数据成员的定义与普通数据成员相似,但前面要加上static关键字。例如
static?int?count; //静态数据成员,用于统计人数 static?float?sum; //静态数据成员,用于统计累加成绩
(2)静态数据成员的初始化与普通数据成员不同。静态数据成员初始化应在类外单独进行,而且应在定义对象之前进行。一般在主函数main之前,类声明之后的特殊地带为它提供定义和初始化。初始化的格式如下: 数据类型.类名::静态数据成员名=初始值; 注意:这时在数据成员名的前面不要加static.
(3)静态数据成员属于类(准确地说,是属于类对象的集合),而不像普通数据成员那样属于某一对象,因此可以使用“类名::”访问静态的数据成员。用类名访问静态数据成员的格式如下。
类名::静态数据成员名
(4)静态数据成员与静态变量一样,是在编译时创建并初始化。它在该类的任何对象被建立之前就存在。因此,公有的静态数据成员可以在对象定义之前被访问。对象定义后:公有的静态数据成员,也可以通过对象进行访问。用对象访问静态数据成员的格式如下:
对象名.静态数据成员名; 对象指针->静态数据成员名;
(5)私有静态数据成员不能在类外直接访问,必须通过公有的成员函数访问。
(6)C++支持静态数据成员的一个重要原因是可以不必使用全局变量。依赖于全局变量的类几乎都是违反面向对象程序设计的封装特性的。静态数据成员主要用作类的所有对象所公用的数据,如统计总数、平均数等。 ?
part c
#include<iostream>
#include<string>
using namespace std;
class Student {
public:
void InitStudent();
void ExpendMoney(float money);
void ShowMoney();
static float m_ClassMoney;
private:
string name;
float money=0;
};
void Student::InitStudent()
{
cout << "学生姓名";
cin >> name;
}
void Student::ExpendMoney(float money)
{
m_ClassMoney -= money;
}
void Student::ShowMoney()
{
cout << "班费余额" << m_ClassMoney << endl;
}
float Student::m_ClassMoney = 1000;
int main()
{
Student A;
A.InitStudent();
A.ExpendMoney(50);
A.ShowMoney();
Student B;
B.InitStudent();
B.ExpendMoney(98.5);
B.ShowMoney();
Student C;
C.InitStudent();
C.ExpendMoney(500.53);
C.ShowMoney();
return 0;
}
?
|