对象传递与静态成员

本文探讨了C++中对象作为函数参数的三种方式:直接传递、指针传递和引用传递,以及它们对实参的影响。通过实例展示了对象如何在函数调用中传递,并解释了静态成员变量的初始化和访问规则。此外,还讨论了对象在内存中的复制行为,包括浅拷贝和深拷贝的概念,强调了在处理对象时正确传递和复制的重要性。
摘要由CSDN通过智能技术生成

 

使用对象作为函数参数

 代码如下:

#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;
};

程序运行结果如下:

 心得体会

对于就对象传递来说,若要想通过修改函数的形参来改变实参,则需要运用对象指针和对象引用来作为函数参数。

在定义静态变量时,要在类外及主函数之前进行初始化,静态成员属于私有成员,无法在主函数内被访问。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值