1.内联函数
为提高程序运行速度,不必在调用函数时跳到另一个位置执行代码再跳回来。采用内联函数,内联函数的编译代码与其他程序代码“内联”起来,即编译器将使用相应的函数代码替换函数调用。速度提高,但内存开销变大。
注意在函数声明之前+inline,在函数定义前+inline。通常做法是省略原型,将整个定义放在本应提供原型的地方。(内联不能使用递归,有些编译器可能没有这种特性)。一般来说冗长的代码段函数不大适宜用作内联函数。
注意c语言中的#define宏定义是通过文本替换(而不是传递参数)实现的,如#define SQUARE(X) X*X
若提供5,结果是5*5.提供4.5+7.5,结果是4.5+7.5*4.5+7.5.若提供c++,结果是c++*c++.
2.引用变量
引用是已定义的变量的别名,主要用途是作函数的形参。将引用变量作为参数,函数将使用原始数据而不是其副本。&除了取地址符,也用来声明引用。如int rats;int &redents=rats;
注意这是将redents作为rats的别名。此时&作为类型标识符的一部分。Int &代表是指向int的引用。上述引用允许将rats和rodents互换,它们指向相同的值和内存单元。即cout<<rats<<rodents; 是相同的一个变量。注意必须在声明引用时将其初始化。指针可以先声明再赋值。
引用更接近const指针,必须在创建时进行初始化,一旦与某个变量关联起来就将一直效忠于它。即int &rodents=rats;与 int *const pr=&rats;类似。如果通过赋值给rodent一个新值(新变量),那么rodent和rat的值变成了新值,但它们的地址还是原来的地址,与新值的地址并不一样。又或者引用绑定在一个指针上,即使指针变化指向其他值,引用指向的还是原值。
3.将引用用作函数参数
引用被当作函数参数时,函数中的变量名成为调用程序中变量的别名。按引用传递允许被调用函数可以访问调用函数中的变量。按值传递是两个变量,两个名称。按引用传递是一个变量两个名称。引用作形参,调用时直接给变量,相当于把形参初始化为传递的实参,指针做形参,调用时用&给出地址。当意图让函数使用传递给它的信息而不需修改时,则应使用传值,但若要想用引用,那么应该使用const限定,如double( const double &ra);另外当数据比较大时,引用参数将比较有用。注意传递引用的限制更加严格,如果ra是一个变量的别名则实参应是该变量。(x+3就不行)
在当前情况下,实参与引用参数不匹配,仅当参数为const引用时,c++将生成临时变量。即对于形参是const引用的c++函数,如果实参不匹配,则其行为类似按值传递,为确保原始数据不被修改,将使用临时变量来存储值。如果函数调用的参数不是左值(变量,数组元素,结构成员,引用和解除引用的指针,非左值包括字面常量,用引号括起来的字符串除外,它们由其地址表示)或者与相应的const引用参数类型不匹配的,则c++将创建类型正确的匿名变量。将函数调用的参数的值传给该匿名变量并让参数来引用该变量。
4.将引用用于结构
函数原型还是一样,如void set_pc (free_throws &ft); 如果不希望函数修改传入的结构可使用const。void display(const free_throw &ft); 初始化结构时,如果指定的初始值比成员少,余下的成员将被设置为0. 如果函数返回的是引用那么可以进行这样的赋值,accumulate(dup,five)=four;传统的返回机制与按值传递函数类似,计算return后面的表达式并将结果返回给调用函数。也就是说这个值被复制到一个临时位置,而调用程序将使用这个值。如果函数返回一个结构,将把整个结构复制到一个临时位置,再将这个拷贝复制给dup(变量)。但在返回引用时,将直接把返回值复制到dup。
注意要避免返回指向函数内部临时变量的引用,最简单的方法则是返回一个作为参数传递给函数的引用,作为参数的引用将指向调用函数使用的数据。另一种方法是使用new来分配新的存储空间。使用引用可以完成类似工作如
const free_throw & clone(free_throw & ft)
{
free_throws *pt; *pt=ft; return *pt;
}
5.将引用用于类对象
将类对象传递给函数时通常做法是使用引用,让函数将类string,ostream,istream,ofstream和ifstream等类的对象作为参数。注意string类允许使用char *的c-风格字符串来初始化string对象。
类型为const引用的形参的一个属性是:假设实参的类型与引用参数类型不匹配但可被转化为引用类型,程序将创建一个正确类型的临时变量,使用转换后的实参值来初始化它,然后传递一个指向该临时变量的引用。可以将实参char *(如引号括起来的字符串字面量,空字符结尾的char数组或指向char的指针变量),const char*传递给形参const string&。坚决不能返回局部变量的引用!!!
6.对象,继承和引用
使得能够将特性从一个类传递给另一个类的语