【C++】struct和class的区别

2023-05-16

       在C++中我们可以看到struct和class的区别并不是很大,两者之间有很大的相似性。那么为什么还要保留struct,这是因为C++是向下兼容的,因此C++中保留了很多C的东西。

一.首先看一下C中struct

1.struct的定义

struct A
{
	int a;
	int b;
	//成员列表
};

注意:因为struct是一种数据类型,那么就肯定不能定义函数,所以在面向c的过程中,struct不能包含任何函数。否则编译器会报错

面向过程的编程认为,数据和数据操作是分开的。然而当struct进入面向对象的c++时,其特性也有了新发展,就拿上面的错误函数来说,在c++中就能运行,因为在c++中认为数据和数据对象是一个整体,不应该分开,这就是struct在c和c++两个时代的差别。

C++中struct得到了很大的扩充:

1.struct可以包括成员函数

2.struct可以实现继承

3.struct可以实现多态

二.strcut和class的区别

1.默认的继承访问权。class默认的是private,strcut默认的是public。

struct A
{
	int a;
};

struct B: A
{
	int b;
};

例如上边的代码,strcut B就是公有继承(public)的struct A。如果将strcut变为 class 那么将会是私有继承(private)这里就不做展示了所以我们在写类的时候都会显示的写出是公有继承还是私有继承 

当然,到底默认是public继承还是private继承,取决于子类而不是基类。我的意思是,struct可以继承class,同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。如下: 

struct A
{
	int a;
};

struct B: A   //共有继承
{
	int b;
};

class C: A    //私有继承
{
	int c
};

2.默认访问权限:struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。

struct A
{
	int a;
};
int main()
{
	A n;
	n.a = 10;
	return 0;
}

//可以在类外访问成员变量,所以struct默认是共有的

class B
{
	int b;
};

int main()
{

	B n1;
	n1.b = 10;
	return 0;
}

//在内外无法访问私有变量

       请看编译结果:(运行环境vs2013)

 3.“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数

        从上面的区别,我们可以看出,struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体。

 4.class和struct在使用大括号{ }上的区别

  • 关于使用大括号初始化

       1.)class和struct如果定义了构造函数的话,都不能用大括号进行初始化
  2.)如果没有定义构造函数,struct可以用大括号初始化。
  3.)如果没有定义构造函数,且所有成员变量全是public的话,class可以用大括号初始化。

       虽然感觉struct是多余的,但考虑到“对c兼容”就将struct保留了下来,并做了一些扩展使其更适合面向对象,所以c++中的struct再也不是c中的那个了。
       两者最大的区别就在于思想上,c语言编程单位是函数,语句是程序的基本单元。而C++语言的编程单位是类。从c到c++的设计有过程设计为中心向以数据组织为中心转移。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】struct和class的区别 的相关文章

  • * 对于结构体来说是非法的吗?

    我尝试编译以下代码 但编译器不会执行此操作 因为 对于结构来说是非法的 这是真的吗 struct String int length int capacity unsigned check char ptr 0 String void ma
  • 为什么找不到ImageView类?

    当我转到图形布局时 我在创建第一个 Android 应用程序 pdf Android Application Development for For Dummies 中的静默切换模式 时遇到了麻烦 在 main xml 文件中插入了 Ima
  • 结构体前向声明编译失败

    我有以下代码 但编译器说 sender wrapper 未定义 即使我向前声明了它 我不能对结构进行前向声明吗 用VS2003编译 struct send wrapper struct IPSend IPSend IPSend const
  • 计算一个类的实例?

    我一直在清理我正在扩展的模块中的一些代码 但我似乎找不到 Pythonify 这段代码的方法 global next id 1 class Obj def init self global global next id self id gl
  • Python:如何使用 struct.pack_into 将不同类型的数据打包到字符串缓冲区中

    我正在尝试将一些无符号 int 数据打包到使用创建的字符串缓冲区中ctypes create string buffer 这是以下代码段 以及显示错误的运行示例在键盘上 http codepad org S8nUWMcW import st
  • 在 C 中使用另一个结构中的二维结构数组的编码问题

    我正在使用一个二维结构数组 它是另一个结构的一部分 这不是我做过很多事的事情 所以我遇到了问题 该函数在接近末尾的 测试 for 循环后最终失败 它在出现段错误之前正确打印出一行 我的代码中将数据读入虚拟二维结构数组的部分工作得很好 所以它
  • 从 python 中的类调用函数 - 不同的方式

    EDIT2 谢谢大家的帮助 编辑 添加 staticmethod后 它可以工作 但是我仍然想知道为什么我在这里遇到类型错误 我刚刚开始使用 OOPS 并且对它完全陌生 我有一个非常基本的问题 关于从类中调用函数的不同方式 我有一个 test
  • 如何表示类的实例与将其作为输入的类之间的关系?

    我有一堂课叫House 这个类的实例是house class House def init self height length self height height self length length def housePlan hou
  • GLSL 中的二阶函数?

    我正在寻找一种方法来使用一个函数作为 GLSL 中另一个函数的参数 在常规 C 中 可以通过传递函数指针作为函数参数来模拟它 似乎其他语言 如 HLSL 现在提供了处理高级构造 如高阶函数 的方法 或者可以使用以下命令来模拟它们巧妙利用 H
  • 将 __DIR__ 常量与字符串连接作为数组值,该数组值是 PHP 中的类成员

    谁能告诉我为什么这不起作用 这只是我在其他地方尝试做的事情的一个粗略的例子 stuff array key gt DIR value 但是 这会产生错误 PHP Parse error syntax error unexpected exp
  • 如何为带有继承的 C++ 类编写 C 包装器

    我只是想知道是否有一种方法可以为具有继承的 C 类创建 C 包装 API 考虑以下 class sampleClass1 public sampleClass public int get return this data 2 void s
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • 为什么 __instancecheck__ 没有被调用?

    我有以下 python3 代码 class BaseTypeClass type def new cls name bases namespace kwd result type new cls name bases namespace p
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的
  • 调用类实例方法 onclick javascript

    我有一个 javascript 文件 其中包含包含方法函数的类 我想知道如何从 onClick 事件调用类实例方法 function MyClass this instanceData Display Me this DisplayData
  • R中整数类和数字类有什么区别

    我想先说我是一个绝对的编程初学者 所以请原谅这个问题是多么基本 我试图更好地理解 R 中的 原子 类 也许这适用于一般编程中的类 我理解字符 逻辑和复杂数据类之间的区别 但我正在努力寻找数字类和整数类之间的根本区别 假设我有一个简单的向量x
  • 无法从 C# WPF 中的另一个窗口调用方法

    好吧 假设我有两个窗户 在第一个中我有一个方法 public void Test Label Content works 在第二个方法中 我称此方法为 MainWindow mw new MainWindow mw Test 但什么也没发生
  • 单个成员结构的对齐和大小保证

    给定一个 可能非 POD struct具有单个成员 没有继承 也没有虚方法 struct Foo Bar value Foo do something C 是否保证Foo将具有相同的对齐方式并且sizeof as Bar 如果不能 那么可以
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 如何将 UDF 中的结构或类数组返回到数据帧列值中?

    d ID 1 pID 1000 startTime 2018 07 02T03 34 20 endTime 2018 07 03T02 40 20 ID 1 pID 1000 startTime 2018 07 02T03 45 20 en

随机推荐

  • 【c语言数据结构】单链表的基本操作

    一 目的与要求 1 复习C程序调试 运行的基本操作方法 2 熟练掌握编辑 编译 连接和运行C 程序的方法 3 掌握单链表的定义 创建 插入和删除操作程序实现 二 实验内容 1 定义单链表结构体 xff0c 获取数据元素 2 创建链表以输入
  • 【数学建模笔记】【第七讲】多元线性回归分析(二):虚拟变量的设置以及交互项的解释,以及基于Stata的普通回归与标准化回归分析实例

    温馨提示 xff1a 本文共有9683字 xff0c 阅读并理解全文需要半小时左右 一 回归系数的解释 书接上文 xff0c 上文谈到内生性的解决之后 xff0c 我们对回归问题的探究还没有完 比如下面这个问题 xff1a 我们说线性回归他
  • 【番外】Stata软件安装教程

    将下载后的资源解压缩之后双击安装软件 xff1a 点击 下一步 点击 下一步 这里选择第二个 SE 这个选项 xff0c 然后点击 下一步 此处尽量不要修改安装路径 xff0c 尽量使用默认安装路径 然后一直点 下一步 即可 安装完成之后点
  • 【蓝桥杯】【嵌入式组别】第十二节:USART串口通讯

    USART串口通讯 USART xff1a 通用同步异步收发器串口发送程序设计 xff1a 如何连续打印helloworld能不能发送中文 xff1f 串口发送printf重定向 串口接收程序设计 xff1a 串口接收固定长度数据 xff1
  • 【蓝桥杯】【嵌入式组别】第十四节:PWM输出编程

    PWM输出编程 PWM输出原理单路PWM信号输出双路PWM信号输出 目的 xff1a 在特定管脚上产生频率和占空比可调的方波信号 比赛我们主要掌握PA6和PA7就可以了 PWM输出原理 CNT 定时器中的计数器 xff0c 配置成1us增加
  • 【蓝桥杯】【省赛真题】

    关于第十一届第一场蓝桥杯中如何判断串口数据的问题的代码如下 xff1a span class token comment USART span u8 rx buf span class token punctuation span span
  • 【2023年第十三届MathorCup高校数学建模挑战赛】思路总结分析

    写在前面的话 我们选择A题 xff0c 分析A题题目可以得知属于一种组合优化模型 xff0c 类似于旅行商问题 xff0c 0 1背包问题等等 该类问题通常采用遗传算法 xff0c 粒子群算法 xff0c 模拟退火算法等算法进行求解 由于本
  • 【博弈论】【第一章】博弈论导论

    博弈论导论 例题 选择数字 例题 巴什博弈 例题 射手博弈博弈论的基本概念 xff1a 参与人战略行动信息支付函数 例题 分100元 课程概述 xff1a 例题 选择数字 两个参与人A和B xff0c 轮流选择 3 4 5 6 7 8 9
  • C++中的const_interator

    当我们做出如下定义时 vector lt ID gt ids vector lt ID gt const iterator iter 并进行了下面的操作 xff0c 则是正确的 for iter 61 ids begin iter 61 i
  • JAVA基本数据类型的字节与位数以及String类型的最大长度

    目录 基本数据类型的字节与位数如下 xff1a String类型的最大长度 基本数据类型的字节与位数如下 xff1a 变量名称 字节 位数byte 1 8short 2 16int 4 32long 8 64float 4 32double
  • arduino、Ms5611与1602实现气压温度高度显示

    项目场景 xff1a arduino Ms5611与1602实现气压温度高度显示 因为项目需求 xff0c 需要测试Ms5611的精度 xff0c 于是利用arduino和LED1602 xff0c 将Ms5611采集的数据采集并实时显示出
  • UART协议详解

    UART简介 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART UART通信在工作中相当常见 xff0c 项目中需要生成uart信号 xff
  • vector的capacity新增长方式(dev c++实测)

    vector的capacity 调用返回vector中最大能够存储的元素个数 xff0c 也即在下一次需要扩充容量之前能容纳的元素个数 reserve会使容器在必要的时候增长 xff0c 以便容纳制指定数目的元素 include lt io
  • Android DNS Resolver

    DNS 解析器 xff08 DNS Resolver xff09 DNS 解析器模块可保护用户免受 DNS 拦截和配置更新攻击 xff0c 并改进了 DNS 解析的网络性能 此模块包含用于实现 DNS 桩解析器的代码 xff0c 该解析器可
  • Python量化相关

    量化实例 xff1a 可转债轮动策略 LOF 封基 ETF动量策略 小市值策略 Python xff1a Python 基础教程 菜鸟教程Python 3 教程 菜鸟教程Windows搭建python开发环境 xff0c python入门到
  • Visual Basic相关

    vb教程
  • 三极管和运放构成的几种恒流源电路分析

    如何利用三极管和运放设计一个150mA的恒流源 xff0c 求电路图 xff0c 验证过的 xff01 xff01 xff01 三极管和运放构成的几种恒流源电路分析 还不是太理解 这几种电路都可以在负载电阻RL上获得恒流输出 第一种由于RL
  • AI相关资料整理

    scikit learn中文社区
  • Android开发知识备忘

    Android Studio 上jar包 xff0c aar包 xff0c aidl xff0c aidl打成aar包的正确使用Android AIDL bindService后不能调用onServiceConnected方法 xff08
  • 【C++】struct和class的区别

    在C 43 43 中我们可以看到struct和class的区别并不是很大 xff0c 两者之间有很大的相似性 那么为什么还要保留struct 这是因为C 43 43 是向下兼容的 xff0c 因此C 43 43 中保留了很多C的东西 一 首