C++ Primer Plus---函数探幽

1.  内联函数

    内联函数的运行速度比常规函数快稍快,但代价是需要占用更多的内存。

2. 引用变量 &a

   引用已定义的变量的别名(另一个名称)。引用变量的主要用途是用作函数的形参。通过将引用变量用作参数,函数将使用原始数据,而不是其拷贝。

   引用不同于指针的是引用必须在声明的时候将其初始化。

   引用经常被用作函数参数,使得函数中的变量名称为调用程序中的变量的别名。(按引用传递)

3. 临时变量,引用参数与const

   如果实参与引用参数不匹配,C++将生成临时变量。

   创建临时变量的两种情况:

  • 实参的类型正确,但不是左值
  • 实参的类型不正确,但可以转换为正确的类型

4. 将引用用于结构

   将引用用作返回值。一般,返回机制将返回值复制到临时存储区域中,随后调用程序将访问该区域。然而,返回引用意味着调用程序将直接访问返回值,而不需要拷贝。

   返回引用的函数实际上被引用的变量的别名。

   attention:避免返回当函数终止时不再存在的内存单元引用。

    例如: const int & func(int & x)

              {

               int temp;

               temp = x;

               return temp; // 函数运行完,临时变量temp已经不存在

               }

    new 分配新内存,用来返回指向内存空间的指针; 但是不再需要new分配的内存时, 应使用delete来释放它们。

5. 将引用用于类对象

    将类对象传递给函数时,C++通常的做法是使用引用。

6. 对象,继承和引用

   基类引用可以指向派生类对象,而无需进行强制类型转换。

7. 使用引用参数的原因:

1)程序员能够修改调用函数中的数据对象

2)通过传递引用而不是整个数据对象,可以提高程序的运行速度。

    当数据对象较大时(如结构和类对象),第二个原因最重要,这些也是使用指针参数的原因。这是有道理的,因为引用参数实际上是基于指针的代码的另一个接口。

那么什么时候使用引用、什么时候使用指针?什么时候又应该按值传递呢?下面是一些指导原则:

对于使用传递值而不做修改的函数:

1)  如果数据对象较小,如内置数据类型或者小型结构,则按值传递。

2)  如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针。

3) 如果数据对象是较大的结构,则使用const指针或const引用,以提高运行效率。这样可以节省复制结构所需的时间和空间。

4) 如果数据对象是类对象,则使用const引用。类设计的语义常常要求使用引用,这是C++增加引用特性的主要原因。因此,传递类对象参数的标准方式是按引用传递。


对于修改调用函数中数据的函数:

1) 如果数据对象是内置数据类型,则是用指针。如果看到诸如fixit(&x)这样的代码(其中x是int型),则很明显,该函数将修改x。

2) 如果数据对象是数组,则只能使用指针。

3)如果数据对象是结构,则使用引用或指针。

4) 如果数据对象是类对象,则使用引用。

8. 默认参数

    对于带参数列表的函数,必须从右向左添加默认值。

    例如: int func(int n, int m = 2, int j = 5) // Valid

              int func2(int n, int m = 2, int j) //Invalid

   实参按从左到右的顺序依次被赋给相应的形参,而不能跳过任何参数。

   x = func(1, 8) // same as func(1, 8, 5)

   x = func(1, ,8 ) // invalid , doesn’t set m to 2

9. 函数重载

   为了避免混乱,编译器在检查函数特征标时,将把类型引用和类型本身视为同一个特征标。

   例: double cube(double x)  && double cube(double &x)

  函数匹配时,并不区分const 和 非const 变量。 把非const值赋给const变量时合法的,但反之则是非法的。

 

  仅当函数基本上执行相同的任务,但使用不同形式的数据时,才应采用函数重载。

10. 名称修饰

   根据原型中指定的形参类型对每个函数名进行加密。

   例:long MyFunc(int, float) 编译器将名称转换为不太好看的内部表示,来描述该接口:如下

      加密后  ?MyFunc@@YAXH@Z

11. 函数模板

    函数模板是通用的函数描述,也就是说它使用通用类型来定义函数,其中通用类型可以用具体类型替换。

    模板并不创建任何函数,只是告诉编译器如何定义函数。

 显示具体化: 提供一个具体化定义函数。

  如果有多个原型,则编译器在选择原型时,非模板版本优先于显示具体化和模板版本,而显示具体化优先于使用模板生成的版本。

转载于:https://my.oschina.net/leaynOntheroad/blog/173064

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值