第七章讲的是函数
1.函数的参数表中可以有函数中未使用的参数。一般是想用作以后功能的扩充
2.静态变量。普通的局部变量当进程达到其定义时就会初始化,也就是在每次调用时均会初始化,且每次调用均会产生一个备份,但static变量只会在进程第一次到达时初始化且仅初始化一次,不会产生多个备份。
3.参数传递。参数传递的语义与初始化是语义是一样的,即用实参去初始化形参。当函数调用时如果参数为普通的变量则会给变量分配存储空间并且用实参进行初始化;但当形参是引用或指针时传递的是实参的地址,所以不会另外为参数分配内存空间,但会分配一个指针的空间,想想为什么??
传递指针或引用的时候可能会修改所传参数的值所以在传引用或指针但不想改变值时就要在参数前加上const
例如:void f(const int& a);或void f(const int* a);
注意:文字量、常量和需要转换的参数都可以传给const&,但不可以传给非const的引用。
允许对const T&参数进行转换,就保证了对这种参数所能提供的值集合,正好与通过一个临时变量传递T参数的集合相同??????此话未理解
void update(float& i);
void g(double d,float r)
{
update(2.0f); //错误:const参数
update(r); //传递r的引用
update(d); // 错误:要求类型转换
}
如果允许所有调用,update()将更新一个马上就会被删除的临时量。???????传引用不是本来就为了更新吗
4.数组不会按值的方式传递,只会按首地址的方式传递。
5.函数返回值的语义与初始化是语义相同,可以认为返回做的是去初始化一个具有返回值类型的匿名变量。
注意:不可返回指向临时变量的指针和引用。因为被指位置的内容的变化未知,不可预料。
void f();
void g(){return f()} 允许,因为f函数可以认为是返回了一个“无值”。
6.重载函数名。
注意:重载不可引起歧义,例如:
void print(double);
void print(long);
void f()
{
print(1); //引发歧义
}
在不同的非名字空间作用域里声明的函数不算是重载。
例如:
void f(int);
void g()
{
void f(double);
f(1);
}
f函数未重载。
7.默认参数。
注意:int f(int,int=0,char* =0); *与=之间一定要有空格,想想为什么???
8.宏定义。
宏名字不能重载,也不能处理递归。
#define FAC(n) (n>1)?n*FAC(n-1):1 //错误
宏定义在c++中能不用则不用
原文链接: https://www.cnblogs.com/self-control/archive/2012/12/12/2814211.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/72264
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!