原创 【博客大赛】《C++ Primer》学习笔记(十五)函数的基本概念

2016-3-20 18:20 1417 14 14 分类: MCU/ 嵌入式 文集: Qt和Cpp

哇呼呼!函数!简单而不简单的函数!


函数的使用其实是使用call表达式。Call表达式的类型是它的返回值类型。
函数的参数表可以是空,以下两种方式都可以:
void f1() { /* ...... */ }
void f2(void) { /* ...... */ }

参数表内的名字不能相同,函数内部的本地变量名不能和参数相同。
参数表内的参数可以没有名字,意味着它没有被函数使用,但是调用的时候还是要给出实际的值。

Automatic objects,定义在函数本地,函数结束时它的寿命也会结束。
函数的参数是一种自动变量。
如果函数的本地变量被static修饰,那么它的值会在第一次调用的时候被初始化,以后就都保持不变。

函数在源文件里面定义,在头文件里面声明。这和变量是一样的。
C++支持separate compilation分开编译,虽然现在Eclipse做了所有的事情。

对函数来说,参数的初始化和变量的初始化是一样的。
和变量一样,如果参数是引用,则参数和它的值是绑定的,否则,值会被复制进来。
绑定参数值的引用,是参数值的别名。
将指针作为函数参数时也是这样,指针会被复制成独立的变量;但通过它仍然可以访问它指向的地址。

----------------
**** 在C语言里,我们习惯使用指针来访问外部的变量(是的,我就是这么做的)。
**** 但是在C++语言里,我们习惯使用引用来访问外部的变量。
为什么要这样?
因为我们关心的就是修改这个参数的值,而完全不关心它的地址是什么。
而且,有的对象的体积很大,有的无法被赋值,所以引用是一个非常有用的手段。

记得为参数加上const,如果我们不需要修改参数的值。
而且这里要分辨top-level const和low-level const的不同用法:
当我们复制一个参数值时,top-level的const会被忽略,因此下面两个函数名是重复定义:
void fcn(const int i) {}
void fcn(int i) {}

有关被const修饰的引用,还有很多值得好好注意的地方。
Anyway,原则是在能够使用const的地方,尽量使用const,因为它有很多好处。

----------------
使用数组做函数参数时会发生什么呢?
参数会自动转换成数组第一个元素的地址,不论数组的长度是多少。由程序员保证对数组的访问不要越界。

有三种方法可以处理数组的长度:
Using a Marker to Specify the Extent of an Array
Using the Standard Library Conventions
Explicitly Passing a Size Parameter

也可以使用引用,来做数组参数:
void print(int (&arr)[10])
{
    for (auto elem : arr)
        cout << elem << endl;
}
注意这里的参数里的括号是必须的,否则它的含义就是包含有10个引用的数组了。

也可以使用指针,来做数组参数,比如这里的含义一样的函数声明:
void print(int (*matrix)[10], int rowSize);
void print(int matrix[][10], int rowSize);

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
14
关闭 站长推荐上一条 /3 下一条