C++ Primer Notes(6)

来源:互联网 发布:软件企业评估证书 编辑:程序博客网 时间:2024/05/17 01:27

6.1 函数的返回类型不能是数组类型或函数类型,但可以是指向数组或函数的指针。

6.2 函数只能定义一次,但可以声明多次,如果一个函数永远不会被用到,那么它可以只有声明没有定义。

6.3 形参初始化的机理与变量初始化一样,如果形参是引用类型,它将绑定到对应实参上,否则,将实参的值拷贝后赋给形参。

6.4 如果函数无须改变引用形参的值,最后将其声明为常量引用。

6.5 当用实参初始化形参时会忽略掉顶层const,也就是说,当形参有顶层const时,传给它常量对象或者非常量对象都是可以的。

6.6 数组两个性质:不允许数组拷贝、使用数组时(通常)会将其转换成指针。尽管不能以值传递的方式传递数组,但是我们可以把形参写成类似数组的形式:

void func(const int *)

void func(const int[])

void func(const int[10])//这里的维度10表示我们期望数组有多少个元素,实际不一定。

上面三个函数等价,每个函数的唯一形参都是const int*类型的。

因为数组是以指针的形式传递给函数的,所以一开始函数并不知道数组的确切大小,调用者应提供一些额外的信息,管理指针形参有三种常用技术:

(1)使用标记指定数组长度。(2)使用标准库规范:void func(const int *beg,const int *end) .(3)显式传递一个表示数组大小的形参:void func(const int a[],size_t size);

6.7数组引用形参:void func(int (&arr)[10]) //形参是数组的引用,维度是类型的一部分不能省略。

6.8 指针数组:int *p[10];  指向数组的指针:int (*p)[10];

6.9可变形参的函数:(1)如果所有的实参类型相同,数量可变,可以传递一个名为initializer_list的标准库类型;(2)如果实参类型不同,可以用可变参数模板;

initializer_list定义在同名的头文件中,类似vector,是一种模板类型。

eg:int sum(initializer_list<int> L)

   {

       int sum=0;

       for(auto it=L.begin();it!=L.end();it++)

             sum+=*it;

       return sum;

    }

调用方法:sum({1,2});sum({1,2,3,4,5,6});(注意花括号);


      

原创粉丝点击