c语言使用函数的心得 c语言函数应用( 七 )


class EngineeringConstants { // this goes in the class
private: // header file
static const double FUDGE_FACTOR;
...
};
// this goes in the class implementation file
const double EngineeringConstants::FUDGE_FACTOR = 1.35;

多数情况下你只要做这么多 。唯一例外的是当你的类在编译时需要用到这个类的常量的情况,例如上面GamePlayer::scores数组的声明(编译过
程中编译器一定要知道数组的大小) 。所以 , 为了弥补那些(不正确地)禁止类内进行整型类常量初始化的编译器的不足,可以采用称之为“借用enum”的方法
来解决 。这种技术很好地利用了当需要int类型时可以使用枚举类型的原则,所以GamePlayer也可以象这样来定义:
class GamePlayer {
private:
enum { NUM_TURNS = 5 } // "the enum hack" — makes
// NUM_TURNS a symbolic name
// for 5
int scores[NUM_TURNS];// fine
};
除非你正在用老的编译器(即写于1995年之前),你不必借用enum 。当然,知道有这种方法还是值得的,因为这种可以追溯到很久以前的时代的代码可是不常见的哟 。
回到预处理的话题上来 。另一个普遍的#define指令的用法是用它来实现那些看起来象函数而又不会导致函数调用的宏 。典型的例子是计算两个对象的最大值:
#define max(a,b) ((a) (b) ? (a) : (b))
这个语句有很多缺陷 , 光想想都让人头疼,甚至比在高峰时间到高速公路去开车还让人痛苦 。
无论什么时候你写了象这样的宏,你必须记住在写宏体时对每个参数都要加上括号;否则,别人调用你的宏时如果用了表达式就会造成很大的麻烦 。但是即使你象这样做了,还会有象下面这样奇怪的事发生:
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次
这种情况下,max内部发生些什么取决于它比较的是什么值!
幸运的是你不必再忍受这样愚笨的语句了 。你可以用普通函数实现宏的效率 , 再加上可预计的行为和类型安全 , 这就是内联函数(见条款33):
inline int max(int a, int b) { return a b ? a : b; }
不过这和上面的宏不大一样,因为这个版本的max只能处理int类型 。但模板可以很轻巧地解决这个问题:
templateclass T
inline const T max(const T a, const T b)
{ return a b ? a : b; }
这个模板产生了一整套函数,每个函数拿两个可以转换成同种类型的对象进行比较然后返回较大的(常量)对象的引用 。因为不知道T的类型,返回时传递引用可以提高效率(见条款22) 。
顺便说一句,在你打算用模板写象max这样有用的通用函数时,先检查一下标准库(见条款49) , 看看他们是不是已经存在 。比如说上面说的max,你会惊喜地发现你可以后人乘凉:max是C++标准库的一部分 。
有了const和inline,你对预处理的需要减少了,但也不能完全没有它 。抛弃#include的日子还很远 , #ifdef/#ifndef在控制编译的过程中还扮演重要角色 。
c语言 有参有返回值函数 1..为什么要使用函数?2.函数分哪些类型3.函数的参数与返回值 。我是计算机专业的,当初学c语言的时候也是好为难 , 也有一些心得体会
语言这种东西会随着接触的多就自然全都通了,需要时间,慢慢来,看到你问的这些问题跟我当初好像,感觉你学的支离破散,我建议你要系统的学c语言,
我有一个c语言的教程,txt的,我可以发给你,看看很有帮助,你问这些问题,即使通了也是不透彻
函数中包含了程序的可执行代码 。每个C程序的入口和出口都位于函数main()之中 。main()函数可以调用其他函数,这些函数执行完毕后程序的控制又返回到main()函数中,main()函数不能被别的函数所调用 。通常我们把这些被调用的函数称为下层(lower-level)函数 。函数调用发生时,立即执行被调用的函数 , 而调用者则进入等待状态,直到被调用函数执行完毕 。函数可以有参数和返回值 。

推荐阅读