C++面试基础系列-struct
系列文章目录
文章目录
- 系列文章目录
- 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的…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
