声明和定义(C++)

声明 通知编译器编程元素或名称存在。 定义 指定什么代码或数据名称描述。 名称,才能使用,则必须将其声明为。

声明

声明引入一个或多个名称为程序。 声明过程中可能会发生多次。 因此,类,结构,枚举的类型,同时,其他用户定义的类型可以为每个编译单元声明。 此多次声明的约束是所有声明必须相同。 声明还充当定义,但,当声明:

  1. 是函数原型 (而不是函数体的函数声明)。

  2. 不包含 extern 说明符,但初始值设定项 (对象和变量) 或函数体 (函数)。 这表明该定义不一定在当前翻译单元并提供名称外部连接。

  3. 是在类声明中静态数据成员。

    由于静态类数据成员都是类的所有对象都共享的分离变量,必须定义这些测试并在类声明之外初始化。 (有关类和类成员的更多信息,请参见 。)

  4. 是类名声明没有下面的定义,例如 class T;。

  5. 是 typedef 语句。

也是定义声明的示例包括:

// Declare and define int variables i and j.
int i;
int j = 10;

// Declare enumeration suits.
enum suits { Spades = 1, Clubs, Hearts, Diamonds };

// Declare class CheckBox.
class CheckBox : public Control
{
public:
            Boolean IsChecked();
    virtual int     ChangeState() = 0;
};

不定义的某些声明为:

extern int i;
char *strchr( const char *Str, const char Target );

定义

定义是对象或变量的,函数、类或枚举数的一个规范。 由于定义必须是唯一的,程序只能包含一个特定程序元素的定义。 可以具有多对一关系的在声明和定义之间。 具有编程元素可以声明但未定义的两种情况:

  1. 函数被声明为,但使用引用不要函数调用或用带有函数的地址的表达式。

  2. 类在不需要其定义了解的方法使用。 但是,必须声明类。 下面的代码阐释了这样一种情况:

    // definitions.cpp
    class WindowCounter;   // Forward reference; no definition
    
    class Window
    {
       // Definition of WindowCounter not required
       static WindowCounter windowCounter;
    };
    
    int main()
    {
    }
    

请参见

参考

基本概念