C++函数概念解析(2)

数组形参

我们为函数传递一个数组时,实际传递的是这个数组的指针

void print(const int*);
void print(const int[]);//函数的意图是作用于一个数组
void print(const int[10]);

以数组作为形参的函数也必须保证这个数组不越界

使用标记指定数组长度

以C风格字符串为例,函数在遇到空字符时停止

void print(const char*cp)
{
	if(cp)
		while(*cp)
			cout<<*p++;
}

适合有明显结束标记且数据类型不容易混淆,比如一段文章的结尾

使用标准库规范

传递数组首元素指针与尾元素指针也是一种管理数组形参的方法

void print(const int*beg,const int*end)
{
	while(beg!=end)
		cout<<*beg++<<endl;
}//输出beg与end之间所有的元素

调用如下:

int j[2]={0,1};
print(begin(j),end(j));

第三种方法是专门定义一个表示数组大小的形参

void print(const int ia[],size_t size)//记录大小的数据类型
{
    for(size_t i=0;i!=size;++i)//size_t就是专门记录数据大小的数据
    {
            cout<<ia[i]<<endl;
    }
}

调用print函数时

	int j[]={0,1};
	print(j,end(j)-begin(j))
C++中没有真正的多维数组

C++ 里面更严格来说其实只有数组的数组(又称jagged array),这是为什么呢?在MSDN的第CA1814号文件中找到了答案:

In a multidimensional array, each element in each dimension has the same, fixed size as the other elements in that dimension. In a jagged array, which is an array of arrays, each inner array can be of a different size. By only using the space that’s needed for a given array, no space is wasted.

翻译过来就是:
在多维数组中,每个维度中的每个元素与该维度中的其他元素具有相同的固定大小。在一个锯齿状数组(即数组的数组)中,每个内部数组可以具有不同的大小。通过只使用给定数组所需的空间,不会浪费任何空间。

C#与VB是真正支持多维数组的

main()函数

之前我们的main()函数基本为空,有时候确实需要给main()函数传递形参

int main(int argc,chat *argc[]) 

第一个形参表示的是数组中字符串的数量
第二个形参argv是一个数组,它的元素是指向C风格的字符串的指针

复习一下形参的作用:

它可以看成引用对象的另一个名字,不额外占用空间,效率高

在使用argv中的实参的时候,从argv[1]开始,argv[0]是给保存程序的名字

无法预知有多少个实参的时候

initializer_list形参

void error_msg(initializer_list<string> il)
{
	for(auto beg=i1.begin();beg!=i1.end();++beg)
		cout<<*beg<<" ";
		cout<<endl;
}

省略符形参

void foo(parm_list,...);
void foo(...);
函数的返回值

每个函数都必须有一个返回值吗?答案是否定的

  1. 没有return语句的函数只能用在返回类型是void的函数中,返回void的函数可以不要return函数
  2. 只要函数的返回类型不是void,函数就必须有一个返回值,如果没有返回值,可能导致控制流尚未返回任何值就结束了函数的执行,编译器也无法检查出这一错误
  3. 不要返回局部对象引用或者指针,因为函数完成后,他们的存储空间也随之释放掉
  4. 这条规矩有一个例外,我们允许main()函数没有return语句
左值与右值

一些语言使用左值(l-value)和右值(r-value)的概念。左值具有确定的、可以被获得的内存地址。这意味着左值可以是变量,也可以是对指向特定内存地址的指针解引用(dereference)的结果。例如C语言的表达式(4 + 9),在执行时,计算机生成一个整数值13,但因为程序没有明确指定这个13如何在计算机中存储,所以这个表达式产生一个右值。另一方面,如果一个C程序声明了一个变量x并将x赋值为13,那么表达式(x)的值是13,并且是一个左值

调用一个返回引用的函数得到左值,其他返回类型得到右值

特别的,我们能为返回类型是非常量引用的函数的结果赋值

列表初始化返回值

函数可以返回花括号包围的值的列表,函数不能返回数组,但可以返回数组的指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值