C++ 高效编程:pass-by-value(值传递)与pass-by-reference(引用传递)

C++在定义函数传参时,常用pass-by-value(值传递)与pass-by-reference(引用传递)两种形式,两种参数传递具体实现方式为:

值传递(pass-by-value)

值传递(passl-by-value)过程中,在堆栈中开辟了形参内存空间,并调用拷贝构造函数把实参值复制给形参,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值,且实参到形参传值过程中调用了拷贝构造函数

例:

#include <iostream>

using namespace std;

class Test
{
public:
	int getValue(void);
	Test(int len);						   // 简单的构造函数
	Test(const Test &obj);			// 拷贝构造函数
	~Test();								    // 析构函数

private:
	int *ptr;
};

// 成员函数定义,包括构造函数
Test::Test(int len)
{
	cout << "调用构造函数" << endl;
	// 为指针分配内存
	ptr = new int;
	*ptr = len;
}

Test::Test(const Test &obj)
{
	cout << "调用拷贝构造函数" << endl;
	ptr = new int;
	*ptr = *obj.ptr; // 拷贝值
}

Test::~Test(void)
{
	cout << "调用析构函数" << endl;
	delete ptr;
}
int Test::getValue(void)
{
	return *ptr;
}

void display(Test obj)
{
	cout << "Test 值 : " << obj.getValue() << endl;
}


// 程序的主函数
int main()
{
	Test test(10);
	cout << "***************************************" << endl;
	display(test);

	return 0;
}

运行结果

调用构造函数
***************************************
调用拷贝构造函数 
Test 值 : 10
调用析构函数
调用析构函数

引用传递(pass-by-reference)

引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。因此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。同时,如果参数所占内存空间大时,引用传递在堆上开辟的空间小于值传递方式。

例:

#include <iostream>

using namespace std;

class Test
{
public:
	int getValue(void);
	Test(int len);						   // 简单的构造函数
	Test(const Test &obj);			// 拷贝构造函数
	~Test();								    // 析构函数

private:
	int *ptr;
};

// 成员函数定义,包括构造函数
Test::Test(int len)
{
	cout << "调用构造函数" << endl;
	// 为指针分配内存
	ptr = new int;
	*ptr = len;
}

Test::Test(const Test &obj)
{
	cout << "调用拷贝构造函数" << endl;
	ptr = new int;
	*ptr = *obj.ptr; // 拷贝值
}

Test::~Test(void)
{
	cout << "调用析构函数" << endl;
	delete ptr;
}
int Test::getValue(void)
{
	return *ptr;
}

void display(Test &obj)
{
	cout << "Test 值 : " << obj.getValue() << endl;
}

// 程序的主函数
int main()
{
	Test test(10);
	cout << "***************************************" << endl;
	display(test);

	return 0;
}

运行结果

调用构造函数
***************************************
Test 值 : 10
调用析构函数

总结:pass-by-reference与pass-by-value相比,后者多调用了一次拷贝构造函数与析构函数,且当形参为非基本类型时,也将在栈区开辟更多的空间。因此,参数传递尽可能使用pass-by-reference方式,如果不希望函数内部对实参进行更改,可以在形参前加canst修饰。

但是,并不是pass-by-reference方式一定优于pass-by-value,由于引用的实质是指针实现,引用真正传递的是指针,进行间接寻址,在传递内置类型时(如 int),指针所占空间甚至高于变量所占内存空间(char类型占用一个字节,而32bit系统指针占用4个字节),且间接寻址的效率要低些,因此,此时应选用pass-by-value更有效。同理,大多数STL容器内含的东西仅仅比指针类型多一点。因此,pass-by-reference节省空间有限,且间接寻址降低了程序效率,选用pass-by-value效率更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值