C++中定义和声明的区别

 直接上例子

在类里面声明(这里以静态数据成员和静态成员函数为例)

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的实际实现,它提供了函数体,即执行的代码。静态成员函数的定义也是在类定义之外完成,同样是因为它们属于类的全局作用域。静态成员函数的定义可以是内联的(在类定义中完成),也可以是非内联的(在类定义外完成),取决于是否需要单独生成函数的机器码。

声明是关于名称、类型和接口的介绍,定义则是实际的内存分配或代码生成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值