[置顶] 今日关注飙升榜

[置顶] 淘宝频道大全

内联函数

C + +继承C的一个重要特性是效率。假如C + +的效率显著地比C低,程序设计者不会使用它。在C中,保护效率的一个方法是使用宏( m a c r o )。宏可以不用普通函数调用就使之看起来像函数调用。宏的实现是用预处理器而不是编译器。预处理器直接用宏代码代替宏调用,所以就没有了参数压栈、生成汇编语言的C A L L、返回参数、执行汇编语言的R E T U R N的时间花费。所有的工作由预处理器完成,因此,不用花费什么就具有了程序调用的便利和可读性。C + +中,使用预处理器宏存在两个问题。第一个问题在C中也存在:宏看起来像一个函数调用,但并不总是这样。这就隐藏了难以发现的错误。第二个问题是C + +特有的:预处理器不容许存取私有( p r i v a t e )数据。这意味着预处理器宏在用作成员函数时变得非常无用。为了既保持预处理器宏的效率又增加安全性,而且还能像一般成员函数一样可以在类里访问自如,C + +用了内联函数(inline function)。本章我们将研究C + +预处理器宏存在的问题、C + +中如何用内联函数解决这些问题以及使用内联函数的方针。

标签:

可变的(volatile)

就像c o n s t一样,我们可以对数据成员、成员函数和对象本身使用v o l a t i l e,可以并且也只能为v o l a t i l e对象调用v o l a t i l e成员函数。函数i s r ( )不能像中断服务程序那样使用的原因是:在一个成员函数里,当前对象( t h i s)的地址必须被秘密地传递,而中断服务程序I S R一般根本不要参数。为解决这个问题,可以使i s r ( )成为静态成员函数,这是下面章节讨论的主题。v o l a t i l e的语法与c o n s t是一样的,所以经常把它们俩放在一起讨论。为表示可以选择两个中的任何一个,它们俩通称为c - v限定词。

标签:

只读存储能力

这经常是嵌入式程序设计中要考虑的重要事情。然而,只建立一个c o n s t对象是不够的—只读存储能力的条件非常严格。当然,这个对象还应是按位c o n s t的,而不是按成员c o n s t的。如果只通过关键字m u t a b l e实现按成员常量化的话,就容易看出这一点。如果在一个c o n s t成员函数里的c o n s t被强制转换了,编译器可能检测不到这个。另外,1) class或s t r u c t必须没有用户定义的构造函数或析构函数。2) 这里不能有基类(将在关于继承的章节里谈到) ,也不能有包含用户定义的构造函数或析构函数的成员对象。在只读存储能力类型的c o n s t对象中的任何部分上,有关写操做的影响没有定义。虽然适当形式的对象可被放进R O M里,但是目前还没有什么对象需要放进R O M里。

标签:

const对象和成员函数

这种方法可行,在过去的程序代码里可以看到这种用法,但这不是首选的技术。问题是:t h i s没有用c o n s t修饰,这在一个对象的成员函数里被隐藏,这样,如果用户不能见到源代码(并找到用这种方法的地方),就不知道发生了什么。为解决所有这些问题,应该在类声明里使用关键字m u t a b l e,以指定一个特定的数据成员可以在一个c o n s t对象里被改变。

标签:

编译期间类里的常量

注意p u s h ( )带一个const char*参数,p o p ( )返回一个const char*,s t a c k保存const char*。如果不是这样,就不能用s t r i n g s t a c k保存i c e C r e a m里的指针。然而,它不让程序员做任何事情以改变包含在S t r i n g s t a c k里的对象。当然,不是所有的串指针栈都有这个限制。虽然会经常在以前的程序代码里看到使用e n u m技术,但C + +还有一个静态常量static const,它在一个类里产生一个更灵活的编译期间的常量。这一点在将第9章描述。• 枚举的类型检查C中的枚举是相当原始的,只涉及整型值和名字,但不提供类型检查。在C + +里,正如我们现在所期望的,类型概念是十分重要的,枚举正是这样要求的。我们建立了一个已命名的枚举时,我们就已经有效地建立了一个新的类型,就像一个类一样:在编译单元被翻译期间,枚举名字将成为一个保留字。另外, C + +中的枚举有一个比C中更严格的类型检查。假如我们有一个称为a的枚举类型c o l o r,就会注意这一点。在C中可以写a + +,但在C + +中不能这样写。这是因为枚举自增正在执行两个类型转换,其中一个类型在C + +中是合法的,另一个是不合法的。首先,枚举的值隐蔽地从c o l o r转换到i n t,然后值增1,然后i n t又转回到c o l o r。在C + +中,这样做是不允许的,因为c o l o r是一个与i n t不同的类型,无法知道b l u e加1恰好出现在颜色表里。如果要对c o l o r加1,那么它应该是一个类(有自增操作),而不是一个e n u m。不论什么时候写出了隐含对e n u m进行类型转换的代码,编译器都把它标记成危险的活动。共用数据类型有类似的附加类型检查。

标签:

这一部分介绍了c o n s t用于类的两种办法。程序员可能想在一个类里建立一个局部常量,将它用在常数表达式里,这个常数表达式在编译期间被求值。然而, c o n s t的意思在类里是不同的,所以必须使用另一技术—枚举,以达到同样的效果。我们还可以建立一个类对象常量( c o n s t)(正如我们刚刚看到的,编译器总是建立临时类对象常量)。但是,要保持类对象为常量却比较复杂。编译器能保证一个内部数据类型为常量,但不能控制一个类中错综复杂的事物。为了保证一个类对象为常量,引进了c o n s t成员函数:对于一个常量对象,只能调用c o n s t成员函数。

标签:

传递和返回地址

函数f ( )返回类X的一个对象的值。这意味着立即取f ( )的返回值并把它传递给其他函数时(正如g 1 ( )和g 2 ( )函数的调用),建立了一个临时变量,那个临时变量是常量。这样,函数g 1 ( )中的调用是错误的,因为g 1 ( )不带一个常量(c o n s t)引用,但是函数g 2 ( )中的调用是正确的。

标签: