C++学习笔记(六)

内联函数、引用

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)名称和参数列表相同但返回值不同

   以上三种情况,在编译器检查函数特征标(参数列表)时无法正常区分,因此这三种情况不被视为重载。

 

 

 

 

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值