内联函数、引用
1.内联函数: 普通函数执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码然后跳回到地址被保存的指令处。
而内联函数的编译代码与其他程序代码不同之处在于:编译器将使用相应的函数代码替换函数调用。对于内联函数代码,程序无需跳到另一个位置处执行代码然后再跳回来。
优点:运行速度比常规函数快,缺点:占用的内存较多。
内联函数的声明: 函数前加上inline ,如: inline double square(double x){...} 注意的使内联函数不能过长、不能递归。
2.引用可以用于为函数提供形参,通过引用,函数可以使用原始数据而不是它的拷贝。
声明引用的方法: int rats;
int &rodents = rats; //声明rats的引用rodents;
3.创建临时变量:如果引用参数为const时,则编译器在下面两种情况生成临时变量:
(1)实参的类型正确<实参和形参类型一致>,但不是左值
(2)实参的类型不正确,但可以转换为正确的类型
左值参数是可被引用的对象,如变量、数组元素、结构成员、引用和被解除引用的指针
非左值参数如字面常量和包含多项的表达式
4.引用和指针的区别:
(1)引用在声明时要给初始化,不能为空。同时指针可以在被初始化后改变,而引用不可以,不过引用指向的内容值可以改变。
(2)程序为指针分配内存,而不为引用分配内存
(3)常量指针与常量引用:(在指针或引用前加const,表示指向的对象是常量)的异同点(此处存疑,需要回头进一步看)
5.const与引用
当参数为const引用时,如果实参与形参不匹配,C++将生成临时变量。这样可以防止接受引用参数的函数修改作为参数传递的变量,此时将会类似于按值传递处理,原始数据将不会被修改。
声明如: double refcube(const double &ra) {...}
当引用用于结构时也可以返回const 型的结构,如:const sysop & use(sysop & sysopref) ;
这并不是指sysop结构为const,而是用户不能通过返回的引用去直接修改它指向的结构。
对于use函数,参数为一个const型的引用,这时假如调用use(loop);则对形参sysopref的操作将相当于对loop进行操作(不是修改)。
调用use()结束后将会返回一个sysop结构的引用, 这样做的好处在于提高了效率。因为返回机制将返回值通常复制到临时存储区域中,随后调用程序访问该区域,而返回引用可以使得调用程序直接访问返回值,而不需要拷贝。
需要注意的是,返回的引用应避免指向临时变量,因为当函数终止时,临时变量将不再存在于内存单元中。
避免类似问题的方法是:将引用作为参数返回,或者在函数中new新的空间,返回指向这块空间的指针。然而要记得释放。
6.值传递、指针、引用的选择建议:
数据小可以值传递,数据是数组,则必须用指针,数据是较大的结构使用指针或引用,数据是类则使用引用(C++新增特性,传递类对象参数的标准方式是按引用传递),如果数据是内置数据类型,则使用指针。
7.默认参数指当函数调用省略了实参时自动使用的一个值。对于带参数列表的函数,必须从右向左添加默认值,不能跳过某个右侧的参数而为它左侧的参数赋值。同时,函数声明时加默认值即可,定义时可以正常定义。如:
char *left(const char* str,int n=1,int j=5); //此时不可以有j未赋值而n被赋值的情况。这句应该是在声明中,定义中可以按照正常 函数定义
8.函数重载:函数名称相同但参数列表不同
三种并非重载的错误方式:(1)类型本身和它的引用(2)const和非const(3)名称和参数列表相同但返回值不同
以上三种情况,在编译器检查函数特征标(参数列表)时无法正常区分,因此这三种情况不被视为重载。