C++ Primer 中文版 学习笔记(六)

第7章函数

函数不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针,或指向数组元素的指针的指针。

2  C++是静态强类型语言,对于每一次的函数调用,编译时都会检查其实参。

每次函数调用时,都会重新创建该函数所有的形参,此时传递的实参将会初始化对应的形参。

形参分为 非引用形参 和 引用形参。

非引用形参的初始化为复制实参的值;引用形参则是实参的别名。

4  非引用形参表示对应实参的局部副本。对这类形参的修改仅仅改变了局部副本的值。一旦函数执行结束,这些局部变量的值也就没有了。

5  复制实参的局限性。

   复制实参并不是在所有的情况下都适合,不适宜复制实参的情况包括:

1)  当需要在函数中修改实参的值时

2)  当需要以大型队形作为实参传递时。对实际应用而言,复制对象所付出的时间和存储空间代价往往过大。

3)  当没有办法实现对象的复制时。

6  引用或指针类型形参

   引用形参直接关联到其所绑定的对象,而并非这些对象的副本

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

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

9  指向指针的引用。

   void ptrswap(int*&v1,int *&v2)

{

 int *tmp = v2;

 v2 = v1;

v1 = tmp;

}

10  数组的两个特殊性质,影响我们定义和使用作用在数组上的函数:

1)  不能复制数组                        无法编写使用数组类型形参的函数

2)  使用数组名字时,数组名会自动转化为指向其第一个元素的指针。 通过操纵指向数组中的指针来处理数组

11  三种形式指定数组形参:

1)  void printValues(int*)

2)  voidprintValues(int [])

3)  voidprintValues(int [10])

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

12  当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数组的长度。  可能编译没有问题,但执行错误。

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

    16.2.1 函数模板的模板实参不匹配的例子 int a[10],b[42]; fref(a,b)

14  三种常见的确保函数操作不超出数组实参的边界的编程技巧:

1)  在数组本身放置一个标记来检测数组的结束。例如 c_style字符串

2)  传递指向数组第一个和最后一个元素的下一个位置的指针。

3)  显示传递表示数组大小的形参。

15  千万不要返回指向局部对象的引用和指针。

16  内联函数(incline)

1)  内联函数避免函数调用的开销。在编译时内联函数展开成代码。

2)  内联函数应该在头文件中定义。在头文件中加入或修改内联函数时,使用了该头文件的所有源文件都必须重新编译。

17  编译器隐式地将在类内定义的成员函数当做内联函数

18  函数不能仅仅基于不同的返回类型而实现重载。

19  Record lookup(Phone)

Record lookup(const Phone)

第二个函数声明视为第一个的重复声明。原因在于实参传递的方式。复制形参时并不考虑形参是否为const 函数操纵的只是副本。

20  c++中,名字查找发生在类型检查之前。

21  函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化赋值。

22  允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针,而不能是函数。


没有更多推荐了,返回首页