6.1
调用运算符。函数的返回类型不能是数组类型或者函数类型,但是可以是指向数组或函数的指针。生命周期。局部变量(形参与函数体内部定义的变量)。自动对象。局部静态对象(生命周期贯穿函数),局部静态变量默认初始化为0。
函数声明也叫函数原型,函数声明不包含函数体,所以也就无需形参的名字。事实上,函数声明经常省略形参的名字。
C++支持分离式编译,分离式编译允许我们把程序分割到几个文件中去,每个文件独立编译。
$$ CC factmain.cc fact.cc #generate factmain.exe or a.out
$$ CC factmain.cc fact.cc -o main #generate main or main.exe
分离式编译提供了分离式编译每个文件的机制,这一过程通常会产生一个后缀名是.obj(windows)或.o(linux)的文件,后缀名的含义是该文件包含对象代码(object code).
6.2
形参的类型决定了形参与实参交互的方式。如果形参是引用类型,它将绑定到对应的实参上(实参被引用调用,传引用调用),否则将实参的值传递拷贝后赋值给形参(被值传递,传值调用)。使用引用避免拷贝,还可以返回额外信息。
用实参初始化形参会忽略顶层const。当形参有顶层const时,传给它常量或者非常量对象都是可以的。我们可以用非常量初始化底层const,但是不可以反过来。尽量使用常量引用。
用函数传递数组时,实际上传递的是数组首元素的指针:
void print(const int*);
void print(const int[]);
void print(const int[10]);//这里的维度表示我们期望数组含有的元素个数,实际上不一定。
int i=0,j[2]={1,2};
print(&i);
print(j);
一开始函数并不知道数组的确切尺寸,调用者应该提供额外的信息。管理指针形参有三种常用的技术。1.对于C风格字符串,函数遇到空字符时停止:
void print(const char *cp)
{
if (cp)//cp不是空指针
while(*cp)//cp内容不是空字符
cout<<*cp++;//++优先级高于*
}
2.使用标准库规范,传递指向数组首元素和尾后元素的指针:
void print(const int *beg, const int *end)
{
while(beg!=end)
cout<<*beg++<<endl;
}
3.显示传递一个表示数组大小的形参:
void print(const int a[], size_t size)
可以有如下的调用方法3的函数:
print(j,end(j)-begin(j));