第7章 函数——C++的编程模块
1. 函数的返回类型不能是数组,但可以是其他任何一种类型,甚至可以是结构和对象。有趣的是,C++函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回。
2. 在C++中括号为空意味着不指出参数。在ANSI C中,括号为空意味着不指出参数。在C++中,不指定参数列表时应该用省略号。
void say_bye(…);
- 3. 数组名数组名解释为其第一个元素的地址有一些例外,首先,对数组名使用sizeof将得到整个数组的长度;其次,将地址运算符用于数组名时,将返回整个数组的地址。
4. 在C++中,当且仅当int *arr和int arr[]用于函数头或函数原型中,它们的含义才是相同的,它们都意味着arr是一个int指针。
5. 用const保护数组:为防止函数无意中修改数组的内容,可在声明形参时使用关键字const, void show_array(const double ar[], int n);
C++将声明const double ar[]解释为const double *ar。
6. 如果数据类型本身并不是指针,则可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针。
7. 尽可能使用const,将指针参数声明为指向常量数据的指针有两条理由:首先,可以避免由于无意间修改数据而导致的编程错误;其次,使用const使得函数能够处理const和非const实参,否则将只能接受非const数据。
8. int age = 39;
const int *pt = &age;
pt的声明并不意味着它指向的值就是一个常量,而只是意味着对pt而言,这个值是个产量。换句话说,可以直接通过age变量来修改age的值,但不能使用pt指针来修改它。
9. int data[3][4];
int total = sum(data, 3);
data是一个数组名,数组名是数组第一个元素的地址,该数组有3个元素,每个元素本身是一个数组,由4个int值组成,因此data的类型是指向由4个int组成的数组的指针。
int sum(int (*ar2)[4], int size);
int sum(int ar2[][4], int size);
sum的代码在声明参数ar2时,没有使用const,因为这种技术只能用于指向基本类型的指针,而ar2是指向指针的指针。
10. 函数的地址为存储其机器语言代码的内存的开始地址。
11. auto自动类型推断只能用于单值初始化,而不能用于初始化列表。P245
12. 使用typedef简化复杂的声明。P248