【C++】详解声明和定义

news2024/11/25 15:38:09

2023年8月28日,周一下午

研究了一个下午才彻底弄明白...

写到晚上才写完这篇博客。


目录

  • 声明和定义的根本区别
  • 结构体的声明和定义
  • 声明结构体
  •  定义结构体
  • 类的声明和定义
  • 函数的定义和声明
  • 声明函数
  •  定义函数
  • 变量声明和定义
  • 声明变量
  • 定义变量

声明和定义的根本区别

我认为声明和定义的根本区别在于:

同类型的一个标识符可以被重复声明多次,但只能被定义一次。

简单来说,声明可以重复多次,但定义只能进行一次。

和分不分配内存没有关系。

结构体的声明和定义

声明结构体

struct student;

可以看到,我声明了两次结构体student,VS2022没有报错 

 定义结构体

结构体的定义只是对结构体类型的描述,并不会为其分配内存。

要使用结构体,需要定义结构体变量,并为其分配内存空间。

struct student {
	int age;
};

可以看到,定义了两次结构体student后,VS2022报错 

类的声明和定义

因为与结构体的声明和定义一模一样,故不再赘述。

函数的定义和声明

声明函数

int max(int num1, int num2);

 可以看到,我声明了两次函数max,VS2022没有报错 

 定义函数

当定义函数时,并没有为函数本身分配内存。

在编译和链接的过程中,函数的定义会被转换成机器代码,并存储在可执行文件中。当程序运行时,操作系统会为程序分配内存,并将函数的机器代码加载到内存中供程序执行。

int max(int num1, int num2) {
	return num1 > num2 ? num1 : num2;
}

可以看到,定义了两次函数max后,VS2022报错  

变量声明和定义

声明变量

在我看来,声明变量只有一种方法:那就是使用extern且不赋值。

因为,这是我所知唯一允许多次重复声明的情况。

此外,这种情况下不会分配内存。

extern type name;
extern int x;
extern student s1;

可以看到,我声明了两次int类型的变量x后,VS2022没有报错  

定义变量

在我看来,这三种情况都属于定义变量。

因为这三种情况不允许重复,只能进行一次。

此外,这三种情况都会被分配内存。这是和上面提到的完全不一样的,上面提到过的都不会在定义时分配内存。

extern type name=value;
type name;
type name=value;
extern int x=1;
int x;
int x=1;

可以看到,这三种情况都不允许多次定义。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/941326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS学习笔记01

CSS笔记01 什么是CSS CSS(Cascading Style Sheets ):层叠样式表,也可以叫做级联样式表,是一种用来表现 HTML 或 XML 等文件样式的计算机语言。字体,颜色,边距,高度,宽度…

掌握C/C++协程编程,轻松驾驭并发编程世界

一、引言 协程的定义和背景 协程(Coroutine),又称为微线程或者轻量级线程,是一种用户态的、可在单个线程中并发执行的程序组件。协程可以看作是一个更轻量级的线程,由程序员主动控制调度。它们拥有自己的寄存器上下文…

leetcode 1022.从根到叶的二进制数之和

⭐️ 题目描述 🌟 leetcode链接:https://leetcode.cn/problems/sum-of-root-to-leaf-binary-numbers/description/ 代码: class Solution { public:int sum (TreeNode* root , int num 0) {if (root nullptr) {return 0;}int cur num r…

视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查的相关问题及解决方法

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

C++day6(多态实现动物园的讲解员和动物表演的相关介绍、用函数模板实现不同数据类型的交换功能)

1.比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有一位讲解员,他会为每种动物表演做简单的介绍。 在这个场景中,我们可以将动…

git clone 报SSL证书问题

git命令下运行 git config --global http.sslVerify false 然后再进行重新clone代码

06.DenseCap

目录 前言泛读摘要IntroductionRelated Work小结 精读模型模型构架全卷积定位层卷积锚点边界回归边界采样双线性插值 识别网络RNN 损失函数训练与优化 实验数据集,预处理DenseCap评价标准基线区域和图像级统计之间的差异RPN vs EdgeBoxesQualitative results 区域ca…

美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以?

周末的时候,有一位小伙伴提了一些关于 ConcurrentHashMap 的问题,都是他最近面试遇到的。原提问如下(星球原贴地址:https://t.zsxq.com/11jcuezQs ): 整个提问看着非常复杂,其实归纳来说就是两个问题: ConcurrentHashMap 为什么 key 和 value 不能为 null?ConcurrentH…

NFTScan | 08.21~08.27 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。周期:2023.08.21~ 2023.08.27 NFT Hot News 01/ NFT 品牌体验平台 Recur 将于 11 月 16 日彻底关闭,此前曾获 5000 万美元融资 8 月 21 日,NFT 品牌体验平台 Recur 在 X…

MySQL数据库学习【基础篇】

📃基础篇 下方链接使用科学上网速度可能会更加快一点哦! 请点击查看数据库MySQL笔记大全 通用语法及分类 DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的…

【业务功能篇86】微服务-springcloud-系统性能压力测试-jmeter-性能优化-JVM参数调优

系统性能压力测试 一、压力测试 压力测试是给软件不断加压,强制其在极限的情况下运行,观察它可以运行到何种程度,从而发现性能缺陷,是通过搭建与实际环境相似的测试环境,通过测试程序在同一时间内或某一段时间内&…

2023高教社杯数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模式树算法&#xff0c…

Unity关键概念

Unity是一款跨平台的游戏引擎和开发工具,用于创建2D和3D游戏、交互式内容和应用程序。它提供了一个强大的开发环境,使开发者能够轻松地设计、开发和部署高质量的游戏和应用程序。 以下是Unity的几个关键概念: 游戏对象(Game Obj…

公文大师:如何写出高效、准确与有说服力的官方文件

在当今的工作环境中,公文的重要性不言而喻。它们是组织、政府和企业之间沟通的桥梁,是决策的基石。但是,你是否曾为如何写好一篇公文而感到困惑?是否曾被复杂的官方术语或格式所困扰?如果你的答案是肯定的,…

Unity创建一个可移动的2D角色

文章目录 创建角色与场景创建地面 角色控制脚本检测地面 运行结果 创建角色与场景 我们首先创建一个角色,这里我新建了一个胶囊体用来当Player,一个Square用来当地面。 接下来,为角色增加碰撞体和刚体,为地面增加碰撞体。然后我…

vue数字输入框

目录 1.emitter.JS function broadcast (componentName, eventName, params) {this.$children.forEach(child => {var name = child.$options.componentNameif (name === componentName) {child.$emit.apply(child, [eventName].concat(params))} else {broadcast.apply(c…

leetcode 503. 下一个更大元素 II

2023.8.28 本题类似于下一个更大元素I ,区别就是数组变成循环的了,可以将nums数组先double一下,如:{1,2,1}变成{1,2,1,1,2,1},再用单调…

Spring -学习笔记

文章目录 1. Spring介绍1.1 Spring的体系结构 2.DI/Ioc(依赖注入/控制反转)2.1 依赖及注解说明1. lombok2. spring-context 2.2 Bean和Spring 上下文的配置方式方式1:基于xml文件的配置方法2: 基于java注解配置bean方法3&#xff…

建筑行业,隐藏这招你不知道的技法!

智慧工地作为现代建筑领域的一项创新概念,通过融合先进的信息技术和物联网技术,为传统的建筑工地带来了全新的变革和优化。 智慧工地为建筑行业注入了数字化和智能化的元素,不仅提升了施工效率和管理水平,还在安全监控、资源利用、…

(LaTeX)换行、换页、断字、字样、字号

通常 LaTeX 会自动换行、换页。用户也可以用 \\ 或 \newline 来强制换行; 用 \newpage 来强制换页。一般情况下 LATEX 会尽量均匀地断字(Hyphenate),使得每一行的字间距分布整齐。 但有时我们也需要显式指明断字位置&#xff0c…