struct 和 class 的异同

在C++编程语言中,structclass是两个定义数据类型的关键字。尽管它们看起来相似,但它们之间有一些关键的异同。

基本定义

struct

struct是从C语言继承而来的,它用于定义一个结构体(structure),结构体是由多个数据成员组成的一种用户自定义数据类型。在C++中,struct不仅仅用于定义数据成员,还可以包含成员函数。

struct MyStruct {int data1;float data2;void display() {std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;}
};

class

class是C++中的一个核心概念,用于定义一个类。类是面向对象编程的基本构建块,除了可以包含数据成员,还可以包含成员函数、访问控制修饰符、构造函数、析构函数、以及其他特性。

class MyClass {int data1;float data2;public:MyClass(int d1, float d2) : data1(d1), data2(d2) {}void display() {std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;}
};

访问控制

struct的访问控制

struct中,默认的访问控制级别是public。这意味着,如果没有显式地声明成员的访问控制级别,这些成员是公开的,可以被外部代码访问。

struct MyStruct {int data1;  // 默认是publicfloat data2;void display() {  // 默认是publicstd::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;}
};

class的访问控制

class中,默认的访问控制级别是private。这意味着,如果没有显式地声明成员的访问控制级别,这些成员是私有的,只能被类的成员函数访问。

class MyClass {int data1;  // 默认是privatefloat data2;public:MyClass(int d1, float d2) : data1(d1), data2(d2) {}void display() {std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;}
};

继承

在继承关系中,structclass的行为也有所不同。具体来说,在继承时,基类成员的默认访问控制级别不同:

struct的继承

struct中,继承默认是public的。这意味着基类的publicprotected成员在派生类中保持其访问控制级别。

struct BaseStruct {int baseData;
};struct DerivedStruct : BaseStruct {void show() {std::cout << "baseData: " << baseData << std::endl;  // 继承默认是public}
};

class的继承

class中,继承默认是private的。这意味着基类的publicprotected成员在派生类中默认变为private

class BaseClass {int baseData;
public:BaseClass(int d) : baseData(d) {}int getBaseData() { return baseData; }
};class DerivedClass : BaseClass {
public:DerivedClass(int d) : BaseClass(d) {}void show() {std::cout << "baseData: " << getBaseData() << std::endl;  // 继承默认是private,需要通过public方法访问}
};

构造函数和析构函数

structclass在定义构造函数和析构函数时没有本质区别。它们都可以包含默认构造函数、参数化构造函数、复制构造函数、移动构造函数、析构函数等。

struct中的构造函数和析构函数

struct MyStruct {int data1;float data2;MyStruct(int d1, float d2) : data1(d1), data2(d2) {}~MyStruct() { std::cout << "MyStruct destroyed" << std::endl; }
};

class中的构造函数和析构函数

class MyClass {int data1;float data2;public:MyClass(int d1, float d2) : data1(d1), data2(d2) {}~MyClass() { std::cout << "MyClass destroyed" << std::endl; }
};

小结

尽管structclass在C++中有许多相似之处,它们之间的主要区别在于默认的访问控制级别和继承行为。总结如下:

  1. 默认访问控制级别

    • struct的默认访问控制级别是public
    • class的默认访问控制级别是private
  2. 继承默认访问控制级别

    • struct的继承默认是public
    • class的继承默认是private
  3. 其他方面

    • structclass都可以包含数据成员和成员函数,都支持构造函数、析构函数、继承、多态等特性。

根据具体的需求和代码风格,我们可以选择使用structclass来定义数据类型。在简单的数据结构或需要所有成员默认公开的情况下,可以选择使用struct;在面向对象编程、需要更严格的访问控制时,更常使用class

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

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

相关文章

C++编程逻辑讲解step by step:看懂值传递的本质

值传递&#xff1a; 形参是实参的复制品&#xff0c;改变形参的值并不会影响外部实参的值。从被调用函数的角度来说&#xff0c;值传递是单向的&#xff08;实参->形参&#xff09;&#xff0c;参数的值只能传入&#xff0c;不能传出。当函数内部需要修改参数&#xff0c;并…

C# Winform按钮避免重复点击以及解决WinForm中设置Enabled=False为什么还会响应Click事件

1、C# Winform按钮避免重复点击 代码如下 btn.Enablefalse; //执行任务的函数或代码 btn.Enabletrue; 在btn.Enabletrue前添加Application.DoEvents(); 就是让应用程序的消息队列自动走完&#xff08;即在按钮为Ture前清空消息队列&#xff09;。 2、解决WinForm中设置Enabl…

利用 fail2ban 保护 SSH 服务器

利用 fail2ban 保护 SSH 服务器 一、关于 fail2ban1. 基本功能与特性2. 工作原理 二、安装与配置1. Debian/Ubuntu系统&#xff1a;2. CentOS/RHEL系统&#xff1a; 三、保护 SSH四、启动 fail2ban 服务五、测试和验证六、查看封禁的 IP 地址七、一些配置八、注意事项 作者&…

动捕系统如何解决“超出捕捉范围”的挑战

惯性运动捕捉系统改变了我们捕捉运动的方式&#xff0c;使艺术家、创作者和独立工作室能够摆脱动捕实验室和复杂设置的限制。通过身体上的传感器和无线连接&#xff0c;动捕演员可以自由移动和并作出各种高难度动作。然而具有高自由度的惯性动捕系统&#xff0c;经常面临着超出…

筛斗数据全面解析数据提取与清洗的重要性

筛斗数据全面解析数据提取与清洗的重要性 在数字化时代&#xff0c;数据是企业决策的重要依据。然而&#xff0c;数据并非总是以我们期望的形式出现&#xff0c;它们可能分散、冗余、错误甚至不完整。因此&#xff0c;数据提取与清洗成为数据处理流程中不可或缺的两个环节。筛…

数学建模 —— 矩阵的运算(上)

目录 调用函数运算 sum : 求和函数 prod : 求乘积函数(product) cumsum : 计算累积和(cumulative sum) diff : 计算差分(difference) mean : 计算平均值 (average) median : 计算中位数 mode : 计算众数 var : 计算方差 (variance) std : 计 算 标 准 差 (standard d…

Swift有什么时候是深拷贝,什么时候是浅拷贝?

Swift深拷贝、浅拷贝 Swift有一个指引用类型,它什么时候是深拷贝,什么时候是浅拷贝? 在Swift中,引用类型主要包括类(class)。与值类型(如结构体和枚举)不同,类的实例是通过引用进行传递的。这意味着,当你将一个类的实例赋值给另一个变量时,你实际上是在复制引用,…

返利App的用户行为分析与数据驱动决策

返利App的用户行为分析与数据驱动决策 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨返利App中的用户行为分析与数据驱动决策的技术细节和实…

UE5(c++)开发日志(2):向日志和屏幕输出信息/将C++类变为蓝图类

通过UE_LOG()向日志输出&#xff0c;向其传入三个参数(①输出日志类型,一般LogTemp ②具体种类&#xff0c;普通/警告/错误&#xff0c;这里是Warning ③输出的文本内容&#xff0c;使用TEXT(" ")&#xff0c;这里是TEXT("Run AActor BeginPlay")) 代码写…

找茬找不同看图猜谜语小游戏

找茬找不同看图猜谜语小游戏&#xff1a;挑战你的观察力与智慧 &#x1f50d; 挑战你的观察力&#xff1a;找茬找不同 你是否曾对两张看似相同的图片感到好奇&#xff0c;想要找出它们之间的微妙差异&#xff1f;找茬找不同小游戏正是为了满足你的这种好奇心而设计的。在这些游…

大模型相关基础知识

1. 什么是大模型&#xff1f; 大模型&#xff08;Large Models&#xff09;通常指的是具有大量参数的深度学习模型。这些模型通常基于复杂的神经网络架构&#xff0c;如Transformer&#xff0c;被用于处理各种复杂任务&#xff0c;如自然语言处理&#xff08;NLP&#xff09;、…

前端基础:CSS(篇一)

目录 css概述 CSS与HTML的关系 基本语法 行内样式表 代码 运行 内嵌样式表 代码 运行 外部样式表 代码 运行 选择器 标签选择器 代码 运行 id选择器 代码 运行 类选择器 代码 运行 选择器优先问题 通配选择器 选中所有的标签 代码 运行 选择器组…

记一次 .NET某网络边缘计算系统 卡死分析

一&#xff1a;背景 1. 讲故事 早就听说过有什么 网络边缘计算&#xff0c;这次还真给遇到了&#xff0c;有点意思&#xff0c;问了下 chatgpt 这是干嘛的 ? 网络边缘计算是一种计算模型&#xff0c;它将计算能力和数据存储位置从传统的集中式数据中心向网络边缘的用户设备、…

spring boot(学习笔记第十一课)

spring boot(学习笔记第十一课) Session共享&#xff0c;JPA实现自动RESTful 学习内容&#xff1a; Session共享JPA实现自动RESTful 1. Session共享 Session共享面临问题 spring boot默认将session保存在web server的内存里面&#xff0c;会产生什么问题呢。 如上图所示&#…

BUU CODE REVIEW 11 代码审计之反序列化知识

打开靶场&#xff0c;得到的是一段代码。 通过分析上面代码可以构造下面代码&#xff0c;获取到序列化之后的obj。 <?php class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(u…

【力扣 459】重复的子字符串 C++题解(子字符串+字符串匹配)

给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “aba” 输出: false 示例 3: 输入: s “abcabcabcabc” 输出: true 解释: 可由子串 “…

一文get懂kwai短视频助力巴西博弈slots游戏广告优势

一文get懂kwai短视频助力巴西博弈slots游戏广告优势 在数字化时代&#xff0c;短视频广告凭借其独特的魅力和高效的传播方式&#xff0c;成为了各大品牌进行营销推广的重要手段。特别是在巴西这个充满活力的国家&#xff0c;kwai短视频广告以其独特的方式&#xff0c;为博弈游…

Spring Boot中使用JWT进行安全认证

Spring Boot中使用JWT进行安全认证 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 在现代的Web应用程序中&#xff0c;安全认证是至关重要的一环。J…

【Android面试八股文】1.你在工作中,fragment与activity通信是怎么做的 ? 2.请你说说Fragment生命周期函数的意义 ?

文章目录 1.你在工作中,fragment与activity通信是怎么做的 ?1.1. 接口回调1.2 直接调用Activity方法1.3. ViewModel2.请你说说Fragment生命周期函数的意义 ?2.1 Fragment生命周期函数2.2 Fragment的创建流程2.3 Fragment变为不可见状态2.4 Fragment由不可见变为部分可见状态…

电子技术基础(模电部分)笔记

终于整理出来了&#xff0c;可以安心复习大物线代了&#xff01;&#xff01; 数电部分预计7.10出