第7张函数

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声明为指向含有	10int型元素的指针
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 内联函数

  1. 内联函数避免函数调用开销
  2. 在函数前面加上 inline 即可,对于编译器只是一个建议,编译器可以选择忽略
  3. 在内联函数放入头文件

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 指向重载函数的指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值