第7章 函数(3)

本文深入解析C++中函数参数的四种常见类型:引用形参、指向指针的引用、数组形参及容器形参的使用与注意事项。详细阐述了如何有效利用引用避免复制、常量引用的灵活性、指向指针的引用及数组形参的定义与传递策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7.2.2 引用形参

与所有引用一样,引用形参直接关联到其所绑定的对象,而并非这些对象的副本。定义引用时,必须用与该引用绑定的对象初始化该引用。引用形参完全以相同的方式工作。每次调用函数,引用形参被创建并与相应实参关联。

void swap(int &i, int &j)
{
	int tmp = i;
	i = j;
	j = tmp;
}
1.使用引用形参返回额外的信息

2. 利用const引用避免复制

如果使用引用形参的唯一目的是避免复制实参,则应该将形参定义为const引用。

3. 更灵活的指向const的引用

如果函数具有普通的非const引用形参,则显然不能通过const对象进行调用。毕竟,此时函数可以修改传递进来的对象,这样就违背了实参的const特性。

非const引用形参只能与完全同类型的非const对象关联。

应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不太灵活。这样的形参既不能用const对象初始化,也不能用字面值或产生右值的表达式实参初始化。

4. 传递指向指针的引用

void swap(int *&i, int *&j)
{
	int *tmp = i;
	i = j;
	j = tmp;
}
形参i,j为指向指针的引用。

7.2.3 vector和其他容器类型的形参

通常,函数不应该有vector或其他标准库容器类型的形参。调用含有普通的非引用vector形参的函数将会复制vector的每一个元素。

C++程序员倾向于通过传递指向容器中需要处理的元素的迭代器来传递容器。

void print(vector<int>::const_iterator beg, vector<int>::const_iterator end)
{
	while(beg != end)
	{
		cout << *beg++;
		if(beg != end) cout << " "; 
	}
	cout << endl;
}
7.2.4 数组形参

数组有两个特殊的性质,影响我们定义和使用作用在数组上的函数:一是不能复制数组;而是使用数组名字时,数组名会自动转化为指向其第一个元素的指针。

因为数组会被自动转化为指针,所以处理数组的函数通常通过操纵指向数组中的元素的指针来处理数组。

1. 数组形参的定义

void print(int*){}
void print(int[]){}
void print(int[10]){}
虽然不能直接传递数组,但是函数的形参可以写成数组的形式。虽然形参表示方式不同,但可将使用数组语法定义的形参看作指向数组元素类型的指针。上面的三种定义是等价的,形参类型都是int*。

通常,将数组形参直接定义为指针要比使用数组语法定义更好。这样就明确地表示,函数操纵的是指向数组元素的指针,而不是数组本身。由于忽略了数组的长度,形参定义中如果包含了数组长度则特别容易引起误解。

2. 形参的长度会引起误解

编译器忽略为任何数组形参指定的长度。

当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数组的长度。

3. 数组实参

数组以普通的非引用类型传递,此时数组会悄悄地转换为指针。一般地说,非引用类型的形参会初始化为其相应实参的副本。而在传递数组时,实参是指向数组第一个元素的指针,形参复制的是这个指针的值,而不是数组元素本身。函数操纵的是指针的副本,因此不会修改实参指针的值。然而,函数可通过该指针改变它所指向的数组元素的值。通过指针形参做的任何改变都在修改数组元素本身。

不需要修改数组形参的元素时,函数应该将形参定义为指向const对象的指针。

4. 通过引用传递数组

和其他类型一样,数组形参可声明为数组的引用。如果形参是数组的引用,编译器不会将数组实例转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为形参和实参类型的一部分。编译器检查数组实参的大小与形参的大小是否匹配。

void print(int (&arr)[10])
{
	int *start = &arr[0];
}
&arr两边的括号是必需的,因为下标操作具有更高的优先级。

5. 多维数组的传递

void print(int (*arr)[], int row_size)
{
	int (*start)[] = arr;
	int *start_first = &(*start)[0];
	int *start_first1 = *start;
}
所谓多维数组实际是指数组的数组。和其他数组一样,多维数组以指向0号元素的指针方式传递。多维数组的元素本身就是数组。除了第一维以外的所有维的长度都是元素类型的一部分,必须明确指定。

我们也可以用数组语法定义多维数组,与一维数组一样,编译器忽略第一维的长度,所以最好不要把它包括在形参表内。

void print(int matrix[][10], int row_size)
{
	int (*start)[10] = matrix;
	int *start_first = &(*start)[0];
	int *start_first1 = *start;
}
形参是一个指针,指向数组的数组中的元素。数组中的每个元素本身就是含有10个int型对象的数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值