所在的位置: C++ >> C++优势 >> c函数探幽内联模板

c函数探幽内联模板

1c++内联函数

概念:内联函数是c++为提高程序运行速度的一项改进。内联函数编译器将使用相应的函数代码替换函数调用。

对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来。因此,!内联函数的运行速度比常规函数稍快,但代价是需要占用更多的内存。

内联函数和常规函数的对比

使用内联函数:

在函数声明前加上关键字inline。

在函数定义前加上关键字inline。

延伸阅读

InlineVersusMacrosTheinlinefacilityisanadditiontoC++.Cusesthepreprocessor#definestatementtoprovidemacros,whicharecrudeimplementationsofinlinecode.Forexample,here’samacroforsquaringanumber:

#defineSQUARE(X)X*X

Thisworksnotbypassingargumentsbutthroughtextsubstitution,withtheXactingasasymboliclabelforthe“argument”:

a=SQUARE(5.0);isreplacedbya=5.0*5.0;b=SQUARE(4.5+7.5);isreplacedbyb=4.5+7.5*4.5+7.5;d=SQUARE(c++);isreplacedbyd=c++*c++;

Onlythefirstexamplehereworksproperly.Youcanimprovematterswithaliberalapplicationofparentheses:

#defineSQUARE(X)((X)*(X))

Still,theproblemremainsthatmacrosdon’tpassbyvalue.Evenwiththisnewdefinition,SQUARE(c++)incrementsctwice,buttheinlinesquare()functioninListing8.1evaluatesc,。passesthatvaluetobesquared,andthenincrementsconce.TheintenthereisnottoshowyouhowtowriteCmacros.Rather,itistosuggestthatifyouhavebeenusingCmacrostoperformfunction-likeservices,youshouldconsiderconvertingthemtoC++inlinefunctions.Note

Listing8.1inline.cpp------------------------------------------------------------//inline.cpp--usinganinlinefunction#includeiostream//aninlinefunctiondefinitioninlinedoublesquare(doublex){returnx*x;}intmain(){usingnamespacestd;doublea,b;doublec=13.0;a=square(5.0);b=square(4.5+7.5);//canpassexpressionscout"a="a",b="b"\n";cout"c="c;cout",csquared="square(c++)"\n";cout"Nowc="c"\n";return0;}-------------------------------------------------------------

注:摘自c++PrimerPlus(第六版)

2引用变量

引用变量:引用是已定义的变量的别名(另一个名称)。一旦与某个变量关联起来,就将一直效忠于他。

用法:引用常被用作函数参数,使得函数中变量名成为程序中的变量别名(也就是按引用传递)。

按值传递导致被调用函数使用调用程序的值拷贝,按引用传递允许被调用的函数能够访问调用函数中的变量。

按值传递和按引用传递3默认参数

默认参数:默认参数指的是当函数调用中省略了实参时自动使用一个值。

如何设置默认值呢?

必须通过原型函数,由于编译器通过查看原型来了解函数所使用的参数数目,因此函数原型也必须将可能的默认参数告知程序。方法就是将值赋给原型中的参数。例如,left()函数原型如下:

char*left(constchar*str,intn=1);

(用户在使用的时候,如果只输入了第一个参数,则按照默认n=1;如果用户输入了第二个参数,则n的值被覆盖。)

4函数重载

函数重载(函数多态):函数重载允许多个函数可以同名,但区别是使用不同的参数列表,通过函数重载来设计一系列函数---他们完成相同的工作,但使用不同参数列表。

(编译器就是根据函数的参数列表的不同,确定重载哪一个函数。虽然函数重载很吸引人,但也不要滥用。仅当函数基本执行相同的任务,但使用不同形式的数据时,才应函数重载)

5函数模版

函数模版:函数模版就是通用的函数描述。也就是说使用泛型来定义函数,其中泛型可用具体的类型替换。通过将类型作为参数参数传递给模版,可使编译器生成该类型的函数。

例如一个交换模版:

templatetypenameAnyType//关键字template和typename是必须的voidSwap(AnyTypea,AnyTypeb)//许多程序员习惯使用T代替AnyType{AnyTypetemp;temp=a;a=b;b=temp;}

(在c++98添加关键字typename之前,c++使用关键字class来创建模版。这两种关键字是等价的。如果要多个将同一种算法用于不同类型的函数,请使用模版。)

6.参考资料

C++PrimerPlus(第六版)




转载请注明:http://www.aierlanlan.com/grrz/3441.html