网站建站平台系统/百度客服人工电话95188
系列文章目录
文章目录
- 系列文章目录
- C++面试基础系列-struct
- 1.C中struct
- 2.C++中struct
- 2.1.同名函数
- 2.2.typedef定义结构体别名
- 2.3.继承
- 3.总结
- 3.1.C和C++中的Struct区别
- 4.struct字节对齐
- 5.struct与const
- 关于作者
C++面试基础系列-struct
1.C中struct
- struct里面只能放数据类型(基本数据类型,自定义数据类型,指针等),不能放置函数
- C中不存在public、protected、private,
- C中,定义结构体变量,定义必须加struct。
- C不存在继承
- 结构体与函数的名称可以相同
2.C++中struct
C++中strcut基本和class一致
- C++中,struct默认是public,class默认是private
- C++中,存在public、protected、private
- C++中,使用时,可以不带strcut
- C++中,可以继承
- C++中,若结构体的名字与函数名相同,可以正常调用!但是定义结构体变量时候只能用带struct的!
2.1.同名函数
struct A {};
A(){}
struct A s; //ok
A s; //error
2.2.typedef定义结构体别名
A自带struct,不可以直接调用函数
typedef struct a{int a;
}A;int main()
{A a;return 0;
}
2.3.继承
struct继承和class是一致
#include <iostream>
struct Base
{int a;virtual void print(){std::cout << "print" << std::endl;}
};
struct Derived : public Base
{
public:int v2;void print(){printf("%s\n", "Derived");};
};
int main()
{Derived *b = new Derived();b->print();return 0;
}
3.总结
3.1.C和C++中的Struct区别
C | C++ |
---|---|
不能将函数放在结构体声明 | 能将函数放在结构体声明 |
在C结构体声明中不能使用C++访问修饰符。 | public、protected、private 在C++中可以使用。 |
在C中定义结构体变量,如果使用了下面定义必须加struct。 | 可以不加struct |
结构体不能继承(没有这一概念)。 | 可以继承 |
若结构体的名字与函数名相同,可以正常运行且正常的调用! | 若结构体的名字与函数名相同,使用结构体,只能使用带struct定义! |
在C++中,struct和class都可以用来定义自定义数据类型,但它们之间存在一些关键的区别:
- 默认访问权限:
- struct的成员默认是public,即可以被任何外部代码访问。
- class的成员默认是private,即只能在类的内部访问。
- 继承访问权限:
- 当一个struct继承自另一个struct时,基类的public成员在派生类中默认也是public。
- 当一个class继承自另一个class时,基类的public成员在派生类中默认是private。
- 设计意图:
- struct通常用于简单的数据结构,如纯数据的聚合,没有太多的封装和抽象。
- class通常用于创建具有封装、继承和多态性的面向对象结构。
- 构造函数和析构函数:
- struct可以有构造函数和析构函数,但它们默认是public的。
- class也可以有构造函数和析构函数,但它们默认是private的,除非显式指定。
- 继承:
- struct可以被继承,并且基类的成员在派生类中保持原有的访问级别。
- class也可以被继承,但基类的public成员在派生类中默认是private的。
- 多态:
- struct支持多态,但通常不会用struct来实现多态性,因为它通常不包含虚函数。
- class支持多态,并且可以包含虚函数和抽象类。
- 语法:
- struct和class在语法上几乎相同,都可以包含数据成员、成员函数、继承等。
- 使用场景:
- struct通常用于类似C语言的简单记录结构,没有方法或行为。
- class用于定义具有封装、继承和多态性的复杂数据类型。
- C++11及以后:
- 从C++11开始,struct和class在使用上更加一致,struct也可以包含成员函数和构造函数。
- 在实际使用中,struct和class的区别主要在于默认的访问权限和设计意图。struct更适合简单的数据结构,而class更适合需要封装和继承的面向对象设计。然而,这种区分更多是传统和风格上的,技术上两者几乎可以互换使用。
4.struct字节对齐
结构体占用内存空间大小,结构体存在字节对齐现象,实际使用空间往往大于结构体内部定义的数据的大小总和。
#include<iostream>
struct A{int a;char b;double c;
};
int main()
{std::cout<<"A size is" << sizeof(A)<<std::endl;
}
在64位系统中,实际占用空间为16字节,a,b共同占用8字节,c占用8字节
5.struct与const
#include "stdio.h"
#include <string.h>#define ADDRESS_USER 0x1000000
#define ADDRESS_LENGTH 100unsigned char buffer1[ADDRESS_LENGTH];
unsigned char buffer2[ADDRESS_LENGTH];
unsigned char buffer3[ADDRESS_LENGTH];
unsigned char buffer4[ADDRESS_LENGTH];typedef struct buffer
{unsigned int address;unsigned int address_length;unsigned char *pbuffer;
} Buffer;// const Buffer test1 = {ADDRESS_USER, ADDRESS_LENGTH, &buffer1[0]};
// const Buffer test2 = {ADDRESS_USER, ADDRESS_LENGTH, &buffer2[0]};
// const Buffer test3 = {ADDRESS_USER, ADDRESS_LENGTH, &buffer3[0]};
// const Buffer test4 = {ADDRESS_USER, ADDRESS_LENGTH, &buffer4[0]};const Buffer test[4] = {{ADDRESS_USER, ADDRESS_LENGTH, &buffer1[0]},{ADDRESS_USER, ADDRESS_LENGTH, &buffer2[0]},{ADDRESS_USER, ADDRESS_LENGTH, &buffer3[0]},{ADDRESS_USER, ADDRESS_LENGTH, &buffer4[0]}};const Buffer *pstructbuffers[4] = {&test[0],&test[1],&test[2],&test[3]};const Buffer **get_buffer()
{return pstructbuffers;
}int main()
{// Buffer **tests = (Buffer **)pstructbuffers;const Buffer **tests;tests = get_buffer();for (int i = 0; i < 4; i++){memcpy(tests[i]->pbuffer, "testestes", i + 1);}for (int i = 0; i < 4; i++){printf("buffer = %s\r\n", tests[i]->pbuffer);}return 0;
}
关于作者
以上就是今天要讲的内容,如果您觉得文章还不错,还请您给个三连加关注,非常感谢!
本文作者:WeSiGJ
微信公众号:WeSiGJ
GitHub:https://github.com/wesigj/CPLUSCPLUSBOYS
CSDN:https://blog.csdn.net/wesigj
微博:
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
相关文章:

C++面试基础系列-struct
系列文章目录 文章目录 系列文章目录C面试基础系列-struct1.C中struct2.C中struct2.1.同名函数2.2.typedef定义结构体别名2.3.继承 3.总结3.1.C和C中的Struct区别 4.struct字节对齐5.struct与const 关于作者 C面试基础系列-struct 1.C中struct struct里面只能放数据类型&#…...

代码随想录算法训练营 | 动态规划 part05
完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 例子: 背包可容纳重…...

英特尔XPU大模型应用创新
...

仿Muduo库实现高并发服务器——socket网络通信模块
本项目就是基于TCP网络通信搭建的。 TCP: 客户端:socket(),connect(). 服务端:socket(),bind(),listen(),accept(). 下面代码就是对原生API网络套接字的封装。需要熟悉原生API网络套接字接口。 下面这段代码,没什么好讲的,就不…...

模型 神经网络(通俗解读)
系列文章 分享 模型,了解更多👉 模型_思维模型目录。仿脑智能,深度学习,精准识别。 1 神经网络的应用 1.1 鸢尾花分类经典问题 神经网络的一个经典且详细的经典应用是鸢尾花分类问题 。主要是通过构建一个神经网络模型来自动区分…...

事务的使用
1.如何使用事务: 1.1.事务的完成过程: 1.步骤1:开启事务2.步骤2:一系列的DML操作3.步骤3:事务结束状态:提交事务(COMMIT),中止事务(事务回滚ROLLBACK) 1.2.事务分类: …...

【免费】企业级大模型应用推荐:星环科技无涯·问知
无涯问知是星环科技发布的大模型应用系统,那么我们先简单了解下星环科技吧! 星环科技(股票代码:688031)致力于打造企业级大数据和人工智能基础软件,围绕数据的集成、存储、治理、建模、分析、挖掘和流通等数…...

从〇 搭建PO模式的Web UI自动化测试框架
Page Object模式简介 核心思想 将页面元素和操作行为封装在独立的类中,形成页面对象(Page Object)。每个页面对象代表应用程序中的一个特定页面或组件。 优点: 代码复用性高 页面对象可以在多个测试用例中复用。 易于维护 …...

在Ubuntu中重装Vscode(没有Edit Configurations(JSON)以及有错误但不标红波浪线怎么办?)
在学习时需要将vscode删除重装,市面上很多方法都不能删干净,删除之后拓展都还在。因此下面的方法可以彻底删除。注意,我安装时使用的是snap方法。 如果你的VScode没有Edit Configurations(JSON),以及有错误但不标红波浪线的话&…...

Oracle 用户-表空间-表之间关系常用SQL
问题: 当某一个表数据量特别大,突然插入数据一直失败,可能是表空间不足,需要查看表的使用率 用户-表空间-表之间关系:用户可以有多个表空间,表空间可以有多个表,表只能拥有一个表空间和用户 1.…...

家政服务管理系统小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,管理阿姨管理,家政公司管理,服务项目管理,家政预约管理,评价管理,留言板管理,系统管理 微信端账号功能包括…...

【算法】并查集的介绍与使用
1.并查集的概论 定义: 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。 主要构成: …...

Shell——运算符
在 Shell 编程中,运算符用于执行各种类型的操作,如算术运算、字符串比较、文件测试等。以下是 Shell 中常用的运算符分类和示例: 1. 算术运算符 Shell 中使用 expr 或 $(( ... )) 来进行算术运算。 : 加法-: 减法*: 乘法/: 除法%: 取余**:…...

SweetAlert2
1. SweetAlert2 SweetAlert2是一个基于JavaScript的库, 用于在网页上替换标准的警告框(alert), 确认框(confirm)和提示框(prompt), 并提供更加美观和用户友好的界面.需要在项目中引入SweetAlert2, 可以通过CDN链接或者将库文件下载到你的项目中来实现这一点. 通过CDN引入:<…...

c语言中比较特殊的输入函数
目录 一.getchar()函数 1.基本功能 2.使用方法 (1).读取单个字符 (2).读取多个字符(直到遇到换行符) (3).处理输入中的空白字符 3.返回值 4.应用场景 5.注意事项 二.fgets()函数 1.函数原型 2.工作原理 3.使用示例 (1).从标准输入读取一行…...

Java版自动化测试之Selenium
1. 准备 编程语言:Java JDK版本:17 Maven版本:3.6.1 2. 开始 声明:本次只测试Java的Selenium自动化功能 本次示例过程:打开谷歌游览器,进入目标网址,找到网页的输入框元素,输入指…...

【计算机网络】——计算机网络的性能指标
速率(speed) 连接在计算机网络上的主机在数字信道上传送数据的速率。 影响条件: 带宽(band width) 指在固定的时间可传输的资料数量 单位:bps或HZ 吞吐量(throughtput) 指对网络、…...

MongoDB数据类型介绍
MongoDB作为一种高性能、开源、无模式的文档型数据库,支持丰富的数据类型,以满足各种复杂的数据存储需求。本文将详细介绍MongoDB支持的主要数据类型,包括数值类型、字符串类型、日期和时间类型、布尔类型、二进制类型、数组、对象以及其他扩…...

【SpringBoot】SpringBoot 中 Bean 管理和拦截器的使用
目录 1.Bean管理 1.1 自定义Bean对象 1.2 Bean的作用域和生命周期 2.拦截器的使用 1.Bean管理 默认情况下,Spring项目启动时,会把我们常用的Bean都创建好放在IOC容器中,但是有时候我们自定义的类需要手动配置bean,这里主要介绍…...

Spring IoCDI(中)--IoC的进步
通过上文的讲解和学习, 我们已经知道了Spring IoC 和DI的基本操作, 接下来我们来系统的学习Spring IoC和DI 的操作. 前⾯我们提到IoC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对 象,也就是bean的存储。 1. Bean的…...

读软件开发安全之道:概念、设计与实施02经典原则
1. CIA原则 1.1. 软件安全都构建在信息安全的三大基本原则之上,即机密性(confidentiality)、完整性(integrity)和可用性(availability) 1.2. 双方交换的数据 1.2.1. 从技术上看,端点之间的数据交换本身就会削弱交互的机密性 1.2.2. 隐藏通信数据量的一…...

MySQL中处理JSON数据:大数据分析的新方向,详解与示例
文章目录 1. MySQL中的JSON数据类型2. JSON函数和运算符3. 创建JSON列的表4. 插入JSON数据5. 查询JSON数据6. 复杂查询和聚合7. JSON 数据的索引8. 总结 在当今的大数据时代,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式&a…...

【图形学】TA之路-矩阵
在 Unity 中,矩阵广泛用于处理各种图形变换,例如平移、旋转、缩放等。矩阵的使用不仅限于三维空间,还可以应用于二维空间的操作。了解矩阵及其运算对于游戏开发和计算机图形学非常重要。Unity 中使用的是行向量不是列向量,这个要注…...

LAMM: Label Alignment for Multi-Modal Prompt Learning
系列论文研读目录 文章目录 系列论文研读目录文章题目含义AbstractIntroductionRelated WorkVision Language ModelsPrompt Learning MethodologyPreliminaries of CLIPLabel AlignmentHierarchical Loss 分层损失Parameter Space 参数空间Feature Space 特征空间Logits Space …...

mac编译opencv 通用架构库的记录
1,通用架构 (x86_64;arm64)要设置的配置项: CPU_BASELINE CPU_DISPATCH 上面这两个我设置成SSE_3,其他选项未尝试,比如不设置。 CMAKE_OSX_ARCHITECTURES:x86_64;arm64 WITH_IPP:不勾选 2,contrib库的添加: 第一次…...

Python 向IP地址发送字符串
Python 向IP地址发送字符串 在网络编程中,使得不同设备间能够进行数据传输是一项基本任务。Python提供了强大的库,帮助开发者轻松地实现这种通信。本文将介绍如何使用Python通过UDP协议向特定的IP地址发送字符串信息。 UDP协议简介 UDP(用…...

上升响应式Web设计:纯HTML和CSS的实现技巧-1
响应式Web设计(Responsive Web Design, RWD)是一种旨在确保网站在不同设备和屏幕尺寸下都能良好运行的网页设计策略。通过纯HTML和CSS实现响应式设计,主要依赖于媒体查询(Media Queries)、灵活的布局、可伸缩的图片和字…...

利用java结合python实现gis在线绘图,主要技术java+python+matlab+idw+Kriging
主要技术javapythonmatlabidwKriging** GIS中的等值面和等高线绘图主要用于表达连续空间数据的分布情况,特别适用于需要展示三维空间中某个变量随位置变化的应用场景。 具体来说,以下是一些适合使用GIS等值面和等高线绘图的场景: 地形与地貌…...

Android全面解析之context机制(三): 从源码角度分析context创建流程(下)
前言 前面已经讲了什么是context以及从源码角度分析context创建流程(上)。限于篇幅把四大组件中的广播和内容提供器的context获取流程放在了这篇文章。广播和内容提供器并不是context家族里的一员,所以他们本身并不是context,因而…...

执行docker compose命令出现 Additional property include is not allowed
问题背景 在由docker-compose.yml的文件目录下执行命令 docker compose up -d 出现错误 Additional ininoperty include is not allowed 原因 我的docker-compose.yml 文件中出现了include标签旧版本的docker-compose 不支持此标签 解决办法 下载支持的docker-compose 解决…...