7.1.1 函数的返回类型
函数的返回类型可以是内置类型,类类型,复合类型,还可以是void ,函数不能返回另一个函数,或者内置数组类型,但是能返回指向函数的指针,或者指向数组的指针的指针。
7.2参数传递
每次调用函数时,如果形参具有非引用类型,则复制实参的值,如果形参为引用类型的值,则它只是实参的别名。
非引用形参表示对应实参的局部副本,对这类形参的修改仅仅改变了局部副本的值,一旦函数执行结束,这些局部变量的值也就没有了。
7.2.1指针形参
函数的形参将复制实参指针,因此形参内可以修改指针所指向的内存。
但是指针的地址值不改变实参的地址值。
同时如果函数形参是
xx(const int *p)
这样的代表不能修改指针所指向的内存值,只能读。
7.2.2 const 形参
在调用函数时,如果函数使用了非引用的非const形参,则既可以给该函数传递const实参也可以传递非const实参
void fcn(const int i);
void fcn(int i) 这两种编译器视为一样的额
7.2.3 引用形参
引用形参直接关联到所绑定的对象,而非这些对象的副本,定义引用时,必须用与该引用绑定的对象初始化该引用。
7.2.3.1 使用引用形参返回额外的信息
7.2.3.2 利用const引用避免复制
7.2.3.3 更灵活的指向const引用
7.2.3.4 传递指向指针的引用
7.2.4 vector和其他容器类型的形参
传递迭代器来访问
7.2.5 数组形参
void print(int *)
void print(int[])
void print(int[10])
数组传递引用会检测参数数组的个数
void print(int (&arr)[10]) {
}
&arr 两边的圆括号是必须的,因为下标操作符具有更高的优先级
f(int (&arr)[10])
多维数组传递
void print(int (matrix*)[10]) matrix声明为指向含有 10个int型元素的指针
void print(int matrix[][10])
7.2.6 main:处理命令行选项
prog -d -o ofile data0
int main(int argc,char *argv[]){}
argc = 5
argv[0]= prog
argv[1]="-d"
agrv[2]="-o"
agrv[3] = "ofile"
agrv[4] = "data0"
7.2.7 含有可变形参的函数
void fun(param,....)
void fun(...)
千万不要返回局部对象的引用
const string &mainip() {
string rest = "as";
return rest; // 错误,函数运行完毕,会释放局部变量的内存
7.3 函数声明
7.4.2 静态局部对象
size_t count_call(){
static size_t = 0;
return ++ctr;
}
int main(){
for(size_t i = 0;i != 10;++i)
cout << count_call() << endl;
return 0;
}
输出 1 --10
7.6 内联函数
- 内联函数避免函数调用开销
- 在函数前面加上 inline 即可,对于编译器只是一个建议,编译器可以选择忽略
- 在内联函数放入头文件
7.7 类
const 成员函数的引入
改变隐式this指针的类型 变成const 对象
7.7.1 在类外定义成员函数
类修饰符::
7.7.2编写构造函数
Sales_item():units_sold(0),revenue(0.0){}
在冒号和花括号之间的叫构造函数的初始化列表
合成的默认构造函数
如果没有为一个类显示定义任何构造函数,编译器将自动为这个类生成默认构造函数。
7.8 重载函数
函数不能因为不同的返回类型就算作重载
必须根据形参表不同的类型来算作重载
7.8.1 重载与作用域
特例:仅仅当形参是引用或指针时,形参是否为const才有影响
不能基于指针本身是否为const来实现函数重载:
f(int *);
f(int *const);
7.9 指向函数的指针
函数指针是指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型及形参表决定。与函数名无关。
bool (*pf)(const string &,const string &);//ok
bool *pf(const string &,const string &); //error 不是函数指针
7.9.1 用typedef 简化函数指针的定义
typedef bool (*cmpFcn)(const string &,const string &);
7.9.2 指向函数的指针的初始化和赋值
bool length(const string &,const string &);
cmpFcn p1 = length; //1
cmpFcn P2 = &length; //2 2种形式等价
7.9.3 函数指针调用函数
直接使用指针调用函数
cmpFcn pf = length;
length("hi","bye"); //直接调用
pf("hi","bye"); // 指针调用
(*pf)("hi","bye");
7.9.4 函数形参可以是函数指针形参
7.9.5 返回指向函数的指针
int (*ff(int ))(int *,int);
使用typedef 更容易理解
typedef int (*PF)(int*,int);
PF ff(int); // ff 是一个函数指针,指向一个返回类型为int,参数为int*,int 的函数.
7.9.6 指向重载函数的指针
略