`
Conviction
  • 浏览: 5896 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++函数

 
阅读更多

1.函数的传递

形参的初始化与变量的初始化一样,如果形参是非引用类型,则复制实参的值;如果形参为引用类型,则它只是实参的别名。

(1)非引用形参

普通的非引用类型的参数通过复制对应的实参实现初始化,当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会修改实参的值。 

注意:非引用形参表示对应实参的局部副本。对这类形参的修改仅仅改变了局部副本的值。一旦函数执行结束,这些局部变量的值也就没有了。

(2)非引用形参之指针形参

与其他非引用类型的形参一样,该类型的任何改变也仅仅作用于局部副本。如果函数将新指针值赋给形参,主调函数使用的实参指针的值没有改变。实参指针不改变,实参指针所指的对象可以改变值。若保护实参指针的值,加const修饰符。

(3)复制实参的局限性

复制实参并不是在所有的情况下都适合,不适合复制实参的情况包括:

当需要在函数中修改实参的值时。

当需要以大型对象作为实参传递时。对实际的应用而言,复制对象所付出的时间和存储空间代价往往过大。

当没办法实现对象的复制。

对于上述几种情况,有效的解决办法是将形参定义为引用或指针类型。

(4)引用形参

如交换两个实参的值。

(5)利用const引用避免复制

如果,使用引用的唯一目的是避免使用复制实参,则将形参定义为const引用。

(6)返回非引用类型

会复制对象

(7)返回引用

都不会复制对象

注意:千万不要返回局部对象的引用。千万不雅返回指向局部对象的指针。

(8)函数声明

正如变量必须先声明然后使用,函数也必须在调用之前先声明

(9)内联函数

内联函数应该放在头文件中

(10)指向函数的指针

函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回值以及形参确定。

bool (*pf)(const string&,const string&);

 注意:用typedef简化函数指针的定义

该定义表示cmpFcn是一种指向函数的指针类型的名字。该指针类型为“指向返回bool类型并带有两个const string”引用形参的函数的指针。

(11)指向函数的指针的初始化和赋值

可以使用函数名对函数指针做初始化或赋值

此时直接引用函数名等效于在函数名上引用取地址操作符:

typedef bool (*cmpFcn)(const string&,const string&);
bool length(const string&,const string&);
int main()
{
	cmpFcn fp = 0;
	fp = length;
	fp = &length;
	return 0;
}

bool length(const string& a,const string& b)
{

}

 注意:函数指针只能通过同类型的函数或函数指针或0值常量值表达式进行初始化或赋值。

将函数值初始化0,表示该指针不指向任何函数。

(12)通过指针调用函数

cmpFcn fp = length;
length("zhangsan","123");
fp("zhangsan","123");		//等价
(*fp)("zhangsan","123");	//等价

 指向函数的指针可用于调用它所指向的函数。可以不需要使用解引用操作符,直接通过指针调用函数。

注意:如果指向函数的指针没有初始化,或者具有0值,则该指针不能在函数调用中使用,只有当指针已经初始化,或被赋值为指向某个函数,方能安全地用来调用函数。

(13)函数指针形参

函数的形参可以是指向函数的指针,这种形参有两种编写形式:

bool length2(const string& a,bool (const string&,const string&));
bool length2(const string& a,bool (*)(const string&,const string&));

 

(14)返回指向函数的指针

int (*ff(int))(int*,int);//返回值为函数指针
typedef int (*PF)(int*,int);
PF ff(int);

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics