复习8:函数

来源:互联网 发布:农夫抢购软件下载 编辑:程序博客网 时间:2024/06/05 21:11

1.内联函数

   内联函数提示编译器把函数调用在线化,递归内联函数能在线化调用的层次由编译器的“聪明度”决定。

2.参数传递

   2.1参数传递的求值顺序是未定义的。如f(i,i++)的参数值是未定义的,结果也是不可知的。

   2.2参数传递一般为值传递,保证了实参的值不会修改,但存在效率问题。于是我们使用指针和引用做参数,但使用它们可能会修改实参。为了给调用者足够的保证,我们使用const修饰它们表示不会改变实参的值,不使用则说明我们需要修改实参值。这样的风格对程序设计是大有裨益的。

   2.3指针、常量指针或引用不能指向文字量,const int* p = &1;会产生编译错误,常量引用则可以。指针、常量指针或引用都不能做类型转换,double& d = (double)i;产生编译错误,常量引用可以。把常量引用特殊化,我想是为了函数调用和泛型编程的方便,具体的实现已在前面说过。考虑如下代码, 因为const引用不会修改实参,所以引入临时量是合理的,这也方便了编程。其实常量指针也可以采用这种方式,但是c++没有这样做。相反,引用和指针是要改变实参的,建立临时量或做类型转换显然是不合适的。

    2.4数组作为函数参数,传递的是到数组首元素的指针,也就是说T[]作为参数传递时将被转换成一个T*。现在来考虑为什么不能把数组做成值传递,你猜对了,因为数组是不能自表示的数据结构,他不能说明元素的个数!我们知道调用函数时必须先计算好它的栈大小,而函数的形参是放到栈里去的!

3.函数调用与返回值

   函数的调用过程不想再这里赘述,说两句返回值把。返回语句所做的就是初始化一个具有返回类型的匿名变量。这时将对照函数的返回类型检查返回表达式类型,并执行所有标准或用户定义的转换。例如double f(){return 1;}1被隐式转换到double(1).这就是c++的关于返回值的定义。其实编译器常常把这个匿名变量放在寄存器exa中,而非内存的栈或堆中,这样做的好处自然是效率的提升。这里只做高级语言的表述,不去深察其底层或本质的东东。http://learn.akae.cn/media/index.html提供了很好的linux c学习教材,可作为复习的补充。

4.默认参数

   默认参数的类型在函数声明时检查,在调用时求值。只能对排列在最后面的哪些参数提供默认值。在同一个作用域中随后的声明里,默认参数不能重复或改变。例如 同理,头文件中默认参数需要带上默认值,源文件中默认参数不能带默认值了,否则也产生默认值重复错误1。

 

 

原创粉丝点击