C++中的定义和声明

来源:互联网 发布:淘宝运营kpi考核指标 编辑:程序博客网 时间:2024/06/03 19:29
声明(declaration) ,用来将一个对象、函数、类或者模板的类型名称告诉编译器,声明并不带有细目资讯。
定义(definition),用来将细目资讯提供给编译器,对对象而言,定义式是编译器为它分配存储空间;对函数或者函数模板而言,定义是提供函数体;对类或者类模板而言,定义是列出所有成员。

注意标准C++支持在某个类定义中声明该类成员变量(而不是定义)的时候就赋初始值的做法:

定义某个类(class)的常量一般也很方便,只有一点点不同。要把常量限制在类中,首先要使它成为类的成员;为了保证常量最多只有一份拷贝,还要把它定义为静态成员:
   

class GamePlayer {
private:
static const int NUM_TURNS = 5; // constant declaration
int scores[NUM_TURNS];// use of constant
...
};

还有一点,正如你看到的,上面的语句是NUM_TURNS的声明,而不是定义,所以你还必须在类的实现代码文件(.cpp)中定义类的静态成员:
const int GamePlayer::NUM_TURNS;// mandatory definition;
// goes in class impl.file

你不必过于担心这种小事。如果你忘了定义,链接器会提醒你。

旧一点的编译器会不接受这种语法,因为它认为类的静态成员在声明时定义初始值是非法的;而且,类内只允许初始化整数类型(如:int, bool, char 等),还只能是常量。
在上面的语法不能使用的情况下,可以在定义时赋初值:

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
};
原创粉丝点击