C++ 结构体声明(定义)以及不同写法的差异

news2024/11/25 16:53:17

在这里插入图片描述


定义方式总结

在C++中,结构体(struct)的定义主要有多种形式,,你还可以在定义结构体时直接初始化它的成员,或者在定义后创建结构体的实例。以下是一些例子:

  1. 定义并初始化结构体:
struct Polygon {
  Point points[4] = {}; // 初始化为默认值
  Point normal = {0, 0, 0};
  Point orientation = {0, 0, 0};
  float edgeline_width = 0.0f;
};
  1. 定义结构体并创建实例:
struct {
  Point points[4];
  Point normal;
  Point orientation;
  float edgeline_width;
} polygon1, polygon2; // 创建了两个Polygon实例,polygon1和polygon2
  1. 使用typedef定义结构体:
typedef struct {
  Point points[4];
  Point normal;
  Point orientation;
  float edgeline_width;
} Polygon;

在这种情况下,Polygon是类型的名称,你可以用它来声明对象,就像你在第一种写法中所做的那样。

  1. 在C++11及以后的版本中,你还可以使用列表初始化(也称为花括号初始化)来初始化结构体的成员:
struct Polygon {
  Point points[4];
  Point normal;
  Point orientation;
  float edgeline_width;
};

Polygon polygon = {{0, 0, 0, 0}, {0, 0, 0}, {0, 0, 0}, 0.0f};

在这个例子中,我们使用一个初始化列表来设置polygon的成员的值。


不同写法的对比一

在C++中,这两种写法有着不同的含义,该结构体包含一个Point数组(包含4个元素)、两个Point对象(normalorientation)以及一个float类型的edgeline_width

第一种写法:

struct Polygon {
  Point points[4];
  Point normal;
  Point orientation;
  float edgeline_width;
};

第二种写法:

struct {
  Point points[4];
  Point normal;
  Point orientation;
  float edgeline_width;
} Polygon;

在这两种情况下,你都可以创建一个Polygon类型的对象,如下所示:

Polygon polygon;

第一种写法定义了一个名为Polygon的结构体类型。这个类型包含了四个Point类型的数组points,两个Point类型的变量normalorientation,以及一个float类型的变量edgeline_width。这个定义并没有分配任何内存,它只是定义了一个类型。你可以使用这个类型来声明变量,如Polygon p;,这时候才会为变量p分配内存。

第二种写法定义了一个匿名结构体,并立即声明了一个该匿名结构体类型的变量Polygon。这个变量Polygon的类型是匿名的,你不能再声明其他同类型的变量(除非你复制这个匿名结构体的定义)。这个声明会为变量Polygon分配内存。

所以,第一种形式只是声明了类型,而第二种形式声明了一个变量并为它分配了内存。


不同写法的对比二

这两种写法的区别在于typedef的使用。

在C和C++中,typedef是一个关键字,用于为类型定义一个新的名字。这可以使代码更清晰,更易于理解。

struct {
  Point points[4];
  Point normal;
  Point orientation;
  float edgeline_width;
} Polygon;

这段代码定义了一个匿名结构体,并声明了一个这种类型的变量Polygon。你不能使用Polygon作为类型来声明其他变量,因为Polygon是一个变量名,而不是类型名。

typedef struct {
  Point points[4];
  Point normal;
  Point orientation;
  float edgeline_width;
} Polygon;

这段代码使用typedef定义了一个新的类型名Polygon,这个类型是一个结构体。你可以使用Polygon作为类型来声明其他变量,例如Polygon p;

所以,主要的区别在于typedef的使用。使用typedef可以为类型定义一个新的名字,使得代码更清晰,更易于理解。


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

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

相关文章

gitlab基本操作

1.gitlab 基本操作 git branch // 查看分支 git branch dev //新建dev 分支 git checkout dev //切换到dev 分支修改 **** git status // 查看哪些文件被修改 git add . //修改了文件需要提交添加上去(注意 . 点号) git commit -m “update”…

重温数据结构与算法之A star 算法

文章目录 前言一、原理1.1 网格距离1.2 宽度优先搜索1.3 Dijkstra 算法1.4 最佳优先搜索1.5 A*算法 二、代码实现2.1 伪码2.2 python 实现2.3 可视化 三、优缺点分析3.1 优点3.2 缺点 参考 前言 A*(A-Star)算法是一种静态路网中求解最短路径有效的直接搜索方法,也是…

uniapp(三) 之 表单提交

更换UI库 经过我昨天仔细看了下ThorUI,里面有个会员组件,好像有用的组件都是会员组件一样,作为一个白嫖怪,我决定今天再换一个UI库 引入后,根据组件位置自行调整位置 好了现在使用UNI-UI了 但是我的语法是vue3,官网范…

Hadoop数据仓库的主要特征有哪些?

数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持(Decision Support)。 数据仓库本身并不“生产”任何数据,其数据…

Nebula分布式集群

2022年9月15日18:47:38文章目录 Nebula1.安装:2.数据模型3.NebulaGraph 架构总览4.基本命令文档4.0 数据类型4.1 spaces图空间CREATE SPACEDROP SPACECLEAR SPACESHOW SPACESDESC SPACE 4.2 Tag4.3 edge4.4 点语句INSERT VERTEXDELETE VERTEXUPDATE VERTEXUPSERT VERTEX 4.5 边…

day11 -- 存储过程+触发器+事物处理

学习内容 什么是存储过程 如何使用存储过程 学习记录 存储过程 经常会有一个完整的操作需要多条语句才能完成。 此外,需要执行的具体语句及其次序也不是固定的,它们可能会根据条件而选择性的执行。 那应该怎么办呢?可以创建存储过程。 存储…

工业镜头分类、相关参数含义

一、工业镜头参数 1、焦距/后焦距 焦距是像方主面到像方焦点的距离。后焦距指光线离开镜头最后一片镜片表面到sensor感光面的距离,如8mm,16mm,25mm等; 焦距的大小决定着视角大小,焦距数值小,视角大&#…

4个月完成职位申请并CSC改派出国|新加坡南洋理工大学访学申请记

由于原访学国家签证被拒,O老师期望能申请手续便捷且容易通过签证的国家,最终我们成功申请到世界名校新加坡南洋理工大学的国家教育研究学院。从获得邀请函、办理CSC改派及派出、顺利签证直至出国等全套手续,仅仅4个月。 O老师背景&#xff1a…

腾讯应用宝 - 微下载

首次接触微下载这个概念,故简单记录一下 产品:微下载配置好了吗? Me: 嗯?什么微下载? 基础认知微下载是什么?微下载在哪里使用?微下载链接获取方式?个性化功能&#xff…

搜索引擎召回策略总结

一、搜索引擎召回策略的方法和注意事项(自己能想到的&待补充) 二、相关资料 同义变换在百度搜索广告中的应用 https://mp.weixin.qq.com/s/ybkbU8p_3jgKuCGdNWeG8w 2020年kdd Facebook搜索向量召回读后感【小红书MXie】 https://zhuanlan.zhihu.com/p/184920498 美团搜…

一键安装 HomebrewCN

一键安装 HomebrewCN Brew介绍Homebrew 能干什么?Homebrew自身如何使用安装Homebrew国内源安装 Homebrew(github源) Brew介绍 macOS 和 Linux 缺失软件包的管理器 Homebrew 能干什么? 使用 Homebrew 安装 Mac(或Linux)没有预装但你需要的东西。 Ho…

python 第三章 基础语句

系列文章目录 第一章 初识python 第二章 变量 文章目录 3.1 输出格式化输出格式化符号格式化字符串扩展f-格式化字符串转义字符结束符 3.2 输入3.3 数据类型转换转换数据类型的函数 3.4 PyCharm交互式开发3.5 运算符运算符的分类算数运算符赋值运算符复合赋值运算符比较运算符逻…

java设计模式之:工厂模式详解(简单工厂+工厂方法+抽象工厂)

文章目录 简单工厂实现应用场景 工厂方法实现适用场景缺点 抽象工厂实现缺点 在面向对象编程中,创建对象实例最常用的方式就是通过 new 操作符构造一个对象实例,但在某些情况下,new 操作符直接生成对象会存在一些问题。举例来说,对…

软件测试2023年行情怎么样?仔细讲解!

目录 前言: 普通功能测试人员不建议跳槽 还有一个要求就是要对业务的极致理解 那么产业互联网趋势会导致什么呢? 现在跳槽涨薪需要掌握到什么样的技术呢? 给大家一些跳槽建议 前言: 软件测试是为了发现程序中的错误而执行程序的…

Keil5新建工程

STM32新建工程 1、基于寄存器、基于库函数、基于HAL2、基于标准库的工程3、工程架构4、基于库函数点灯实验 1、基于寄存器、基于库函数、基于HAL 1、基于寄存器:与51单片机开发案方式一样,是用程序直接配置寄存器,来达到我们想要的功能&…

基于NE555芯片的简单延时电路和方波信号发生器

简单延时电路 NE555芯片是一种经典的计时器集成电路,常用于电子设计中的定时和延时功能。下面是一个简单的NE555延时电路的详细分析和讲解: NE555芯片是一个多功能的集成电路,主要由比较器、RS触发器、RS锁存器以及输出驱动器等组成。它可以工…

CLIP对比语言-图像预训练算法

本文参考:AIGC神器CLIP:技术详解及应用示例_Baihai IDP的博客-CSDN博客 一、CLIP概述 CLIP:Constastive Language-Image Pretraining。它是一个开源的、多模式的、zero-shot的模型。如果提供一张图像和一段文本描述,该模型可以预…

requestAnimationFrame() 方法

[TOC](requestAnimationFrame() 方法) 一、基本使用 1.基本介绍 window.requestAnimationFrame() 主要是用来实现动画的时候使用的,不管是移动动画还是数字增长动画,使用这个api可以让你的动画看起来非常平滑,因为它是要求浏览器在下次重绘…

【C++ 基础篇:22】:类的 const 对象 与 const 成员函数/方法 以及 类中涉及 const 的常见问题!

本系列 C 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C的三大特性等&#…

基于html+css的图展示111

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…