关闭

C++中特别的函数和变量

标签: 内联函数引用变量
260人阅读 评论(0) 收藏 举报
分类:
 内联函数

(1)      内联函数是C++为提高程序运行速度所做的一项改进。

(2)      内联函数的编译代码与其他程序代码“内联”起来了,也就是说,编译器将使用相应的函数代码替代函数调用。

(3)      内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。比如,如果程序在10个不同地方调用同一个内联函数,则该程序将包含该函数代码的10个副本。

(4)      使用内联函数这项特性,必须在函数声明前加上关键字inline或在函数定义前加上关键字inline。但通常的做法是将整个定义放在本应提供原型的地方。(在函数首次使用前出现的整个函数定义充当了原型。)

(5)      程序员请求将函数作为内联函数时,编译器并不一定会满足这种要求,它可能认为该函数过大或注意到函数调用了自己。

(6)      内联函数这种特性,在C语言中存在类似的特性,C语言使用预处理器语句#define来提供宏(宏,是内联代码的原始实现。)。内联和宏的区别:宏只是通过文本替换来实现,所以,不能实现按值传递;而内联可以按值传递。

如下宏:

#define SQUARE(X) (X)*(X)

调用:a = SQUARE(5.0);  b =SQUARE(4.5+7.5);  d = SQUARE(c++);//会将c递增两次。


引用变量

C++新增了一种复合类型,引用变量。引用是已定义的变量的别名(另一个名称)。

(1)      引用变量的主要用途是用作函数的形参。通过将引用变量用作参数,函数将使用原始数据,而不是其副本。因此,除指针之外,引用也为函数处理大型结构提供了一种非常方便的途径。

(2)      就像声明中的char*指的是指向char的指针一样,int&指的是指向int的引用。

int rats;

int& rodents = rats;

int& doo = redents;

上述三个rats、rodents和doo可以互换使用,因为它们指向相同的值和内存单元。如果通过取地址符&对三者操作,它们的地址是一样的。

(3)      必须在声明引用时将其初始化,而不能像指针那样,先声明,再赋值。于是,引用更接近const指针,必须在创建时进行初始化,一旦与某个变量关联起来,就将一直效忠于它。

int& rodents = rats;

int * const pr = &rats;

其中,引用rodents扮演的角色与表达式*pr相同。

(4)      引用作为函数参数应该注意的地方:

a.      比如,double x = 3.0;

函数原型 double refcube(double &ra);

函数调用 double z =refcube(x + 3.0);

在有些较老的编译器会勉强通过,但会发出警告。在较老的编译器是这样对待的:程序创建一个double类型的临时无名变量,它的值是表达式x+3.0的值,然后,ra将成为该临时变量的引用。

在现代C++中,上述调用时错误的,通过不了编译。原因是表达式x+3.0并不是变量,例如,不能对表达式赋值,如:x+3.0 = 5.0 。也就是说,它不是左值。

b.      当且仅当函数参数为const引用时,当实参与引用参数不匹配但可以转换为正确的类型,或者实参与引用参数匹配但不是左值,C++允许生成临时变量。

c.       实际上,对于形参为const引用的C++函数,如果实参不匹配,则其行为类似于按值传递(确保原始数据不被修改,将使用临时变量来存储值)。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18411次
    • 积分:303
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:2篇
    • 译文:0篇
    • 评论:4条
    文章存档
    最新评论