直接上例子
在类里面声明(这里以静态数据成员和静态成员函数为例)
class MyClass {
public:
static int staticDataMember; // 静态数据成员的声明
static void staticFunction(); // 静态成员函数的声明
// 其他成员...
};
在cpp文件中定义
静态成员的声明告诉编译器该成员是类的一部分,但不属于任何特定的类实例。然而,仅仅声明静态成员是不够的,对于静态数据成员,还需要在类定义之外的地方定义并初始化它。静态成员函数则需要在类定义之外提供具体的实现(如果是非内联函数的话)。例如:
// 静态数据成员的定义和初始化(通常在cpp文件中)
int MyClass::staticDataMember = 0;
// 静态成员函数的定义(如果不是内联的话)
void MyClass::staticFunction() {
// 函数实现
}
注意,静态成员函数不需要也不应该在外部再次声明static
关键字,而静态数据成员在定义时需要指定初始值(除非它是const且具有初始化器)。
声明(Declaration)
声明告诉编译器一个名字(如变量、函数、类等)的存在、类型以及可能的附加信息(如返回类型、参数列表等),但不涉及实际的内存分配或代码生成。
-
静态数据成员的声明 (
static int staticDataMember;
):这行代码在类的定义内部告诉编译器,MyClass
有一个静态数据成员叫做staticDataMember
,它的类型是int
。声明的作用是让编译器知道这个名字和类型,以便在类的成员函数中使用它,或者在其他地方声明对它的引用或指针。但此时并没有分配存储空间给这个静态数据成员。 -
静态成员函数的声明 (
static void staticFunction();
):这行代码声明了MyClass
有一个静态成员函数staticFunction
,它没有参数,返回类型是void
。声明告知编译器该函数的存在及其接口,但不包含函数体,除非它是内联函数。
定义(Definition)
定义则是声明的具体化,它为变量分配存储空间或为函数生成可执行代码。
-
静态数据成员的定义 (
int MyClass::staticDataMember = 0;
):这里不仅再次提到staticDataMember
的名字和类型,而且分配了实际的内存空间,并初始化为0。这个步骤是必要的,因为静态数据成员在全局作用域中具有唯一的存储位置,而不仅仅局限于类的每个实例。这个定义通常放在类定义之外的.cpp文件中,以避免多次定义的问题。 -
静态成员函数的定义 (
void MyClass::staticFunction() { /* 函数实现 */ }
):这是staticFunction
的实际实现,它提供了函数体,即执行的代码。静态成员函数的定义也是在类定义之外完成,同样是因为它们属于类的全局作用域。静态成员函数的定义可以是内联的(在类定义中完成),也可以是非内联的(在类定义外完成),取决于是否需要单独生成函数的机器码。
声明是关于名称、类型和接口的介绍,定义则是实际的内存分配或代码生成。