首页 > 编程语言 >C++中定义和声明的区别

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

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

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

标签:静态数据,定义,静态,成员,C++,声明,函数
From: https://blog.csdn.net/weixin_49962210/article/details/139140351

相关文章

  • [C][自定义类型][二][位段][枚举][联合体]详细讲解
    目录1.位段1.什么是位段?2.位段的内存分配3.位段的跨平台问题4.位段的应用2.枚举1.什么是枚举?2.枚举类型的定义3.枚举的优点4.枚举的使用3.联合体(共用体)1.联合类型的定义1.位段1.什么是位段?位段的声明和结构是类似的,但有两个不同位段的成员必须是int、unsi......
  • 【c++基础(三)】类和对象中--构造和析构函数
    1.前言本章重点本篇文章着重讲解类中的两个默认函数,分别为:构造函数,析构函数这是c++六个默认成员函数中的两个(其他四个在后面章节讲解) 我们平时在写基础的数据机构时,例如栈和队列如果自己没有注意没有进行初始化,就有可能导致出错,同理,在写完代码后,忘记销毁开辟好......
  • c++函数
    哈喽大家好,我是@菜就多练,输不起,就别玩,今天我来和大家分享函数函数就是在主函数上方的位置写,但也可以在下面写,常见函数类型有intdoubleboolstringchar.......不同函数类型它们的用法也不同,有判断的(bool),有计算的(intlonglong double),还有字符串的(charstring)等等等等那......
  • c++ 类型转换
     ========在C++中,类型转换(typeconversion)是将一个数据类型的变量转换为另一个数据类型的变量的过程。类型转换可以分为隐式转换(implicitconversion)和显式转换(explicitconversion)。下面详细介绍C++中的类型转换方式。隐式转换隐式转换也称为自动类型转换,是由编译器自动......
  • c++动态内存管理干货
     c++兼容c所以之前C语言使用的方式在c++中同样可以使用,但c++给出了更加简便的动态内存管理方法.1.申请内置类型空间c++定义了新的关键字new和delete(都是操作符不是函数),使用方法如图:需要注意的是,用new申请空间默认不会初始化,但是可以初始化。如图:另外,【】里面可以是变量:......
  • C++ - TCP粘包解决方法
     下面的代码演示了粘包问题,客户端连续三次向服务器端发送数据,服务器端却一次性接收到所有数据。服务器代码#define_WINSOCK_DEPRECATED_NO_WARNINGS#include<iostream>usingnamespacestd;//#include<stdio.h>#include<WinSock2.h>​//#pragmacomment(lib,"ws2_......
  • VS2022查看项目宏定义(SolutionDir/Configuration/ProjectName等)
    参考:https://blog.csdn.net/aoxuestudy/article/details/122197793右击打开C++项目属性点击【编辑】:点击【宏】:进一步搜索定位:......
  • C++中的异类:“#” 符号背后的故事
    最近在写编程语言的书,聊到C++的宏,感觉很有意思,搬运过来。在C++语言中,# 符号是一个独特的符号。它似乎不在语言核心中,但是在源码里却又无处不在。在语法上,#的语法规则在C++体系里独具一格,和C++语法相比像是两个语言似的。这些差别让我们感受到#背后的故事不简单。今天,我们......
  • c++函数指针
     c/c++函数指针的用法【目录】基本定义c函数指针使用举例c++函数指针使用举例函数指针作为函数参数函数指针作为函数返回值函数指针数组typedef简化函数指针操作 c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,…);c++函数指针......
  • lambda表达式的用例 c++
    出自:  https://blog.csdn.net/qq_45604814/article/details/132687858一、Lambda表达式概述1.介绍Lambda表达式是C++11标准引入的一种特性,它提供了一种方便的方式来定义匿名函数。Lambda表达式是一种能够捕捉外部变量并使用它们的函数对象。由捕获列表、参数列表、返......